3

我觉得我错过了一些非常基本的东西,如果这个问题很迟钝,我很抱歉。只要我一直在使用 bash shell,我就一直在努力解决这个问题。

假设我有这样的结构:

├──bin
   ├──command (executable)

这将执行:

$ bin/command

然后我将 bin/command 符号链接到项目根目录

$ ln -s bin/command c

像这样

├──c (symlink to bin/command)
├──bin
   ├──command (executable)

我不能执行以下操作(错误-bash: c: command not found

$ c

我必须这样做?

$ ./c

这里发生了什么?— 是否可以在不使用系统范围别名的情况下从当前目录执行命令,./也可以不使用系统范围的别名?对于分布式可执行文件和实用程序脚本来说,为每个项目提供一个字母文件夹特定的快捷方式将非常方便。

4

4 回答 4

10

这不是 bash 不允许从当前目录执行的问题,而是您没有将当前目录添加到要从中执行的目录列表中。

export PATH=".:$PATH"

$ c
$

但是,这可能会带来安全风险,因为如果目录包含您不信任或不知道它们来自何处的文件,则当前目录中存在的文件可能会与系统命令混淆。

例如,假设当前目录名为“foo”,而您的同事要求您进入“foo”并将“bar”的权限设置为 755。作为 root,您运行“chmod foo 755”

您假设 chmod 确实是 chmod,但是如果当前目录中有一个名为 chmod 的文件并且您的同事将它放在那里,则 chmod 确实是他编写的程序并且您以 root 身份运行它。也许“chmod”会重置盒子上的root密码或其他危险的东西。

因此,标准是将未指定目录的命令执行限制为一组明确受信任的目录。

于 2013-08-31T20:08:31.560 回答
4

请注意,接受的答案会引入严重的漏洞!


您可以将当前目录添加到您的 PATH 中,但不要添加到它的开头。那将是一个非常危险的环境。

当前目录位于末尾时仍然可能存在漏洞,但要少得多,因此我建议这样做:

PATH="$PATH":.

在这里,仅在探索 PATH 中已经存在的每个目录之后才搜索当前目录,因此不再存在现有命令被敌对命令重载的风险。卸载命令或拼写错误仍然存​​在被利用的风险,但风险要低得多。当您在其中添加新目录时,只需确保点始终位于 PATH 的末尾。

于 2013-08-31T20:32:28.617 回答
1

您可以添加.到您的PATH. (详见kamituel的回答)

~/.local/bin许多发行版上还有用户特定的二进制文件。

于 2013-08-31T20:05:53.867 回答
0

您可以做的是将当前目录(.)添加到$PATH

export PATH=.:$PATH

但这可能会带来安全问题,因此请注意这一点。请参阅此 ServerFault 答案,了解为什么它不是一个好主意,尤其是对于 root 帐户。

于 2013-08-31T20:03:27.567 回答