为什么我们在 *nix 系统中使用 ./progname 来执行程序?

为什么我们在 *nix 系统中使用 ./progname 来执行程序?

我已经使用 Linux 和 Mac 一段时间了,我总是想知道 - 为什么我们必须执行这样的程序./progname。我知道 Unix 将所有事物视为文件,并将文件名存储在指向文件 inode 编号的表中。

abc.py与有何不同./abc.py

答案1

./abc.py表示“执行abc.py当前目录中的文件。”

abc.py意思是“执行abc.py在 shell 的目录搜索路径中找到的第一个文件。”

答案2

abc.py必须位于命令搜索路径中(即,在PATH环境变量中指定的目录之一中)。./abc.py是一个精确路径:它abc.py从当前目录执行(.)。

在 Unix 世界中,将当前目录放在路径中被认为是一种不好的做法,因为它允许非常简单的恶意攻击,其中以常见 Unix 命令(或常见拼写错误)命名的可执行文件可能会被毫无戒心的用户无意中执行。

例如,一个相当不可能但最具说明性的例子是,攻击者可以留下一个名为的可执行文件rm/tmp等待系统管理员尝试清空该/tmp目录。

答案3

操作系统会在 $PATH 变量中列出的所有目录中查找要执行的程序。本地目录“./”通常不在 PATH 中。您可以添加它,但这会带来安全隐患。

如果您将“./”添加到 PATH,则有人可以将名为“vi”的程序放在目录中,然后等待有人尝试使用 vi 编辑此目录中的某些内容 - 然后该程序将以刚刚被欺骗的用户的权限执行……在单用户系统上,这可能不是一个严重的问题,但它仍然是一种不好的做法。

答案4

如果 . 不在您的 $path 中,则只需执行 ./abc.py。$path 是环境变量,当您以命令形式输入程序时,它会告诉您的 shell 在哪里查找程序。如果您愿意,可以使用内置了特定位置的其他 shell。

相关内容