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

Uts*_*sav 5 linux mac unix posix

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

abc.py./abc.py? 有什么不同?

Kri*_*son 24

./abc.py意思是“执行abc.py当前目录中的文件”。

abc.py意思是“执行abc.py在 shell 的目录搜索路径中首先找到的任何文件。”

  • 这是相关的,因为很多时候当前目录不在搜索路径中,所以如果你尝试运行 `abc.py` 你会得到一个错误。 (11认同)
  • 另外,人们使用“./”的主要原因是将当前目录包含在要搜索的目录路径中被认为是一个安全漏洞,因此人们通常不希望搜索到当前目录,并且通常不会放 。在路径中。 (8认同)

thk*_*ala 16

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

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

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


Dem*_*nto 5

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

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

  • 实际上,它不是操作系统,而是命令外壳。 (2认同)
  • @Marcin:这取决于。Shell 倾向于自己进行查找(以便稍后将其缓存),但程序*可以* 使用 `execvp()` 而不是 `execv()` 将其交给操作系统。 (2认同)

小智 0

如果当前工作目录 (CWD) 不在 $PATH 中,则需要以 ./progname 形式调用;如果 CWD 在 $PATH 中,则调用“progname”形式即可正常工作。