SSH ./ 和 sh 之间的区别

SSH ./ 和 sh 之间的区别

我写了简单的文件“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)。

最后两点:-

  1. 这四个示例仅适用于脚本文件:如果file.sh是二进制可执行文件,它们都将失败。
  2. 在四个例子中,#!/bin/bash注释仅仅是一个注释:执行sh将按原样读取它,并将不是clonebash来执行文件的其余部分,因此bash其中的任何扩展都会导致错误。

相关内容