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

在linux中运行sh文件时,为什么必须运行./name.sh?,linux,shell,Linux,Shell,我有一个名为x.sh的文件要执行。如果我跑步: x.sh 然后我得到: x.sh: command not found 如果我跑步: x.sh ./x.sh 然后它就可以正常运行了。为什么我必须输入./first?因为出于安全原因,当前目录通常不包括在默认路径中:通过不查看当前目录,可以避免因植入具有合法实用程序名称的恶意程序而引起的各种不洁。例如,假设有人设法在您的目录中植入一个名为ls的脚本,该脚本执行rm* 如果希望在路径中包含当前目录,并且使用bash作为默认shell,则可以通

我有一个名为x.sh的文件要执行。如果我跑步:

x.sh
然后我得到:

x.sh: command not found
如果我跑步:

x.sh
./x.sh

然后它就可以正常运行了。为什么我必须输入./first?

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

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

export PATH=$PATH:.
根据以上解释,通过最后查看
,可以降低流氓程序带来的风险,因此所有已知的合法程序都会在之前找到。检查过了


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

因为默认情况下当前目录不在
路径
环境变量中,没有路径限定的可执行文件只在
path
指定的目录中搜索。您可以通过将
添加到
路径
的末尾来更改此行为,但这不是常见的做法,您只需要习惯这种统一

这背后的想法是,如果首先在当前目录中搜索可执行文件,恶意用户可能会在其主目录中放入一个名为
ls
grep
或其他一些常用命令的可执行文件,诱使管理员使用它,可能需要超级用户权限。另一方面,如果将
放在
路径
的末尾,则不会感觉到太多问题,因为在这种情况下,系统目录是首先搜索的

但是:我们的恶意用户仍然可以创建他的危险脚本,这些脚本被命名为常用命令的常见拼写错误,例如
sl
for
ls
(protip:bind-to,您无论如何都不会上当
:D


因此,您可以看到,如果您键入一个没有路径限定的可执行文件名,那么最好是安全的,因为您确信您正在从系统目录运行某些内容(因此应该是安全的)。

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


虽然这是不可取的,但为了满足好奇心,您可以将
添加到路径中,然后您将看到
x.sh
将起作用。

如果您没有明确指定目录,则shell将在
$PATH
中列出的目录中搜索指定的可执行文件。如果
$PATH
不包含
,则不会搜索当前目录

$ echo $PATH
/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin
这是故意的。如果搜索了当前目录,那么您键入的命令可能会根据您所在的目录进行更改。这将允许恶意用户将名为
ls
cp
的二进制文件放入您经常使用的目录中,并诱使您运行不同的程序

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

我强烈建议您不要将
添加到
$PATH
中。你会很快习惯于键入
/
,这没什么大不了的。

你不能简单地键入来执行文件
x.sh
因为当前工作目录不在$PATH中。要查看当前的工作目录,请键入

$ pwd
要查看$PATH,请键入

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

$ PATH=$PATH:.

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

文件
的意思是“此目录”,由于它不在PATH变量中,您需要完整的路径。您知道为什么不搜索它吗?为什么我不想让它在默认情况下被搜索(假设这是可能的)?@dan:因为否则,它很容易意外地运行错误的东西(想象你创建了一个名为
ls
)的脚本。我如何找到当前路径?
echo$path
在你的shell中(这意味着打印名为PATH的环境变量。另外:即使在默认搜索路径后放置
,您仍然容易受到键入错误的影响(例如,
la
cdd
bim
)。从安全角度来看,将
添加到
路径是个坏主意。不要这样做。