为什么是 。在路径默认情况下?


0

许多人说出于安全原因,当前目录不在$PATH变量中,并且Linux不查看当前目录以查看该目录中是否有特定命令可用。但我做了cd /usr/bin然后做得ls很好; 我也做echo $PATH了,输出包含/usr/bin

您应该注意到,出于安全原因,当前目录不在$PATH变量中,并且Linux不查看当前目录以查看该目录中是否有特定命令可用。

Sander van Vugt的RedHat®RHCSATM/RHCE®7证书指南

为什么我能在跑步ls时跑步/usr/bin

Answers:


6

linux不查看当前目录以查看该目录中是否有特定命令可用

这是真的,但它确实在所有目录中查找$PATH,即使你当时可能在这样的目录中。

要以另一种方式的字吧,如果.不是你的$PATH,这不要紧,你在哪里,它总是会搜索相同的目录中看到一个特定的命令是否提供了。


但正如我所知,目前的目录不应该在$ PATH中为什么在我改为/ usr / bin目录之后仍然在$ PATH中?“您应该注意到,出于安全原因,当前目录不在$ PATH变量中,并且Linux不会查看当前目录以查看该目录中是否有特定命令。”RedHat®RHCSATM/RHCE®7证书指南作者:Sander van Vugt
alsadk

1
这只是意味着它通常不会在当前目录中查找(与Windows相反,它确实如此)。
Glorfindel

所以linux不会查看当前目录,除非它在$ PATH中,我是对的吗?
alsadk

2
是的,如果.$PATH其中将始终查看当前目录。
Glorfindel

0

这个答案很好但是评论中的讨论表明更广泛的解释可能是有用的。

本文档描述了POSIX兼容shell应以何种顺序搜索命令。它非常通用,不是最容易理解的东西。不要分析这个高度抽象的程序,让我们看看真正的shell是如何运作的。

假设

  • $PATH看起来像这样:/usr/local/bin:/usr/bin:/bin;
  • 你在巴什;
  • 你输入ls并击中Enter;
  • 没有ls 别名可以将命令更改为其他内容ls;

然后Bash将从ls下面的列表中运行第一个现有对象。这是根据您的情况量身定制的清单

  1. ls 功能。
  2. lsbuiltin(通常ls不是Bash内置的;但是由于Bash可以动态加载新的内置命令,你可以构建内置命令ls)。
  3. ls可执行文件,其完整路径名存储在哈希表中(如果在过去的某个时间ls根据下一个点发现可执行文件并且仍然记住它,则会发生这种情况)。
  4. ls可执行的$PATH。在您的情况下,序列是:
    1. /usr/local/bin/ls
    2. /usr/bin/ls
    3. /bin/ls

注意./ls程序中没有; 也不考虑当前的工作目录,特别是它与中的条目不匹配$PATH

现在这个声明

Linux不查看当前目录以查看该目录中是否有特定命令可用

只表示./ls上面列表中没有硬编码。如果$PATH包含.但它会出现在列表中

出于安全原因,当前目录不在$PATH变量中

我将在答案的后面解释这些原因。不过你可以添加.到你的$PATH你自己的。在这种情况下./ls,列表中将显示为4.x条目。它比较到Windows这将查找ls当前工作目录,无论它是否是在$PATH与否。如果Linux做了同样的事情,那么总会./ls我们列表的第3点之上的某处硬编码。

如果你当前的工作目录/usr/bin和清单说,ls应该下定决心/usr/bin/ls,那么它在技术上同样不是可执行文件./ls,但

  • shell永远不会使用文字./ls路径,程序产生/usr/bin/ls;
  • 你所处的事实/usr/bin意味着什么 ;
  • 事实/usr/bin$PATH手段很多

但是,如果你有.在你的第一个条目$PATH,然后

  • shell会使用文字./ls路径;
  • 你所处的事实/usr/bin意味着很多 ;
  • 事实上/usr/bin$PATH将意味着什么

在这两种情况下,它都是在一天结束时运行的相同的可执行文件,但shell以不同的方式访问它。

同样值得注意的是,“我当前的工作目录在我的$PATH”或“我在我的目录中” 这样的陈述$PATH“并不能讲述整个故事。他们可能意味着:

  • /some/particular/directory在我$PATH和我现在在/some/particular/directory

要么

  • “文字.条目在我的身上$PATH”。

如图所示,这两种情况不同。


看起来你ls不希望被发现只是因为你碰巧在它的目录中。嗯,这将是不方便的,而没有任何安全优势。主要的安全原因不具有.如在一般命令搜索序列和不具有固定步骤.$PATH在解释此UNIX FAQ

考虑.在第一个条目的情况下会发生什么PATH。假设您当前的目录是可公开写入的目录,例如/tmp。如果碰巧是/tmp/ls某个其他用户在那里命名的程序,并且您键入ls(当然,打算运行正常/bin/ls程序),那么shell将运行./ls另一个用户的程序。毋庸置疑,运行这样的未知程序的结果可能会让您感到惊讶。

没有必要禁止/usr/bin/ls只因为你在/usr/bin。如果ls存在恶意,您可能已经在另一个目录中运行它,或者您将在另一个目录中工作时最终运行它。


TL;博士

总结一下,ls在你的例子中有效,因为它/usr/bin/ls是找到的,而不是./ls。后一条路径解析为前一条路径的事实并不重要,因为后者的路径并未首先使用。它没有被使用,因为“Linux不会查看当前目录......”(意思是它没有查看.)。它确实看起来/usr/bin,因为它在你的$PATH

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.