我写了简单的文件“hello world”并尝试通过 SSH 在虚拟服务器上执行它。
#!/bin/bash
echo "Hello world"
我当然给chmod +x
然后在一台服务器上我尝试通过命令执行它:
./file.sh
我已回复:
-bash: ./file.sh: Permission denied
仅当我通过命令启动时才有效:
sh file.sh
在其他服务器上,这两个命令都可以正常工作......
所以我的问题是:是否有任何类型的权限可以阻止执行./
命令?
这两个命令有什么区别?
答案1
文件系统可能已安装noexec
。我在我的 Debian 中重新创建了它。行为合适。
当您运行时,./file.sh
它被视为可执行文件;但是/bin/bash file.sh
可执行文件是/bin/bash
。
答案2
这是手册的摘录(man sh
):-
如果除了选项之外还指定了命令行参数,则 shell 将第一个参数视为要从中读取命令的文件的名称(shell 脚本),其余参数将设置为 shell 的位置参数($1、$2 等)。否则,shell 将从其标准输入读取命令。
因此,sh file.sh
指定的文件file.sh
将成为 shell 的输入源,因此需要可读,但不必可执行。source
或.
命令也是如此,因此以下都将运行不可执行的文件:-
sh ./file.sh
sh<./file.sh
. ./file.sh
source ./file.sh
最后两个将在当前 shell 中执行,前两个将在子 shell 中执行。请注意,sh -c ./file.sh
需要file.sh
可执行文件,而不sh -c ". ./file.sh"
需要。还要注意,如果file.sh
是可执行文件,则其位置需要在$PATH
直接调用时,除非./
包含特定路径(在示例中):
file.sh
但是,前面的四个例子不需要前缀./
,因为总是会在当前目录中寻找要读取的文件(尽管.
和source
命令也会搜索$PATH
)。
最后两点:-
- 这四个示例仅适用于脚本文件:如果
file.sh
是二进制可执行文件,它们都将失败。 - 在四个例子中,
#!/bin/bash
注释仅仅是一个注释:执行sh
将按原样读取它,并将不是clonebash
来执行文件的其余部分,因此bash
其中的任何扩展都会导致错误。