从当前目录执行一个没有点斜杠的命令,如"./command"

Mar*_*Fox 3 unix bash

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

说我有这样的结构:

???bin
   ???command (executable)
Run Code Online (Sandbox Code Playgroud)

这将执行:

$ bin/command
Run Code Online (Sandbox Code Playgroud)

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

$ ln -s bin/command c
Run Code Online (Sandbox Code Playgroud)

像这样

???c (symlink to bin/command)
???bin
   ???command (executable)
Run Code Online (Sandbox Code Playgroud)

我不能做以下(错误-bash: c: command not found)

$ c
Run Code Online (Sandbox Code Playgroud)

我必须这样做?

$ ./c
Run Code Online (Sandbox Code Playgroud)

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

Bra*_*don 10

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

export PATH=".:$PATH"

$ c
$
Run Code Online (Sandbox Code Playgroud)

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

例如,假设当前目录名为"foo",并且您的同事要求您进入"foo"并将"bar"的权限设置为755.以root身份运行"chmod foo 755"

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

因此,标准是限制未将目录指定到一组显式受信任目录的命令执行.


jll*_*gre 6

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


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

当当前目录位于末尾时,仍然存在可能的漏洞,但要少得多,所以这是我的建议:

PATH="$PATH":.
Run Code Online (Sandbox Code Playgroud)

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