繁体   English   中英

在linux中运行sh文件时,为什么必须运行./name.sh?

[英]When running a sh file in linux, why do I have to run ./name.sh?

我有一个名为x.sh的文件,我想执行它。 如果我跑:

x.sh

然后我得到:

x.sh: command not found

如果我跑:

./x.sh

然后它运行正常。 为什么我必须首先输入./?

因为当前目录通常不包含在默认PATH中,出于安全原因:通过不查看当前目录,可以避免因种植具有合法实用程序名称的恶意程序而导致的各种恶意。 例如,假设有人设法在您的目录中ls一个名为ls的脚本,该脚本执行rm *

如果您希望在路径中包含当前目录,并且您使用bash作为默认shell,则可以通过~/.bashrc文件添加路径。

export PATH=$PATH:.

基于上述解释,通过查看减少了流氓程序带来的风险. 最后,所以众所周知的合法程序将在之前找到。 检查。

可以通过/etc/profile修改系统范围的设置,但这可能不是一个好主意。

因为默认情况下当前目录不在PATH环境变量中,所以只在PATH指定的目录内搜索没有路径限定的可执行文件。 您可以通过添加更改此行为. PATH结束,但这不常见,你只会习惯这种UNIX主义。

这背后的想法是,如果首先在当前目录中搜索可执行文件,恶意用户可以在其主目录中放入名为例如lsgrep或其他常用命令的可执行文件,欺骗管理员使用它,可能与超级用户权力。 另一方面,如果你把这个问题感觉不大. PATH的末尾,因为在那种情况下首先搜索系统目录。

但是 :我们的恶意用户仍然可以创建他的危险脚本,命名为常用命令的常见错别字,例如sl for ls (protip:将它绑定到Steam机车 ,你不会被欺骗:D )。

所以你会发现,如果你输入一个没有路径限定条件的可执行文件名称,那么保持安全仍然会更好,你确定你正在从系统目录中运行一些东西(因此可以说是安全的)。

因为当前目录不在PATH中(与Windows中的cmd不同)。 它是一种安全功能,因此不会意外运行当前目录中的恶意脚本。

虽然不建议,但为了满足好奇心,你可以添加. 到PATH然后你会看到x.sh会起作用。

如果您没有显式指定目录,那么shell将搜索$PATH列出的目录以查找指定的可执行文件。 如果您的$PATH不包括. 然后不搜索当前目录。

$ echo $PATH
/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin

这是故意的。 如果搜索了当前目录,那么您键入的命令可能会根据您所在的目录而发生更改。这将允许恶意用户将名为lscp的二进制文件放入您经常访问的目录中,并诱使您运行其他程序。

$ cat /tmp/ls
rm -rf ~/*
$ cd /tmp
$ ls
*kaboom*

我强烈建议你不要添加. 你的$PATH 你会很快习惯打字./ ,这没什么大不了的。

您只能通过输入x.sh来执行文件,因为当前的工作目录不在$ PATH中。 要查看当前的工作目录,请键入

$ pwd

要查看$ PATH,请键入

$ echo $PATH

要将当前目录添加到此会话的$ PATH,请键入

$ PATH=$PATH:.

要永久添加它,请在主目录中编辑.profile文件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM