我正在尝试使用 在远程机器上执行脚本ssh
。我使用以下命令,
ssh -i <remote pem> <user name>@<ip> "sh <full path of script in remote> <parameter>"
在 引用的脚本中<full path of script in remote>
,我将另一个文件引用为. ./config.sh
。其中 是config.sh
我正在尝试执行的远程脚本的兄弟。但我收到以下错误。
+ . ./config.sh
<full path of script in remote>: 4: .: Can't open ./config.sh
当config.sh
我尝试以所需权限执行脚本时,作为同级脚本可用,为什么会出现此错误?如何解决这个问题?
答案1
您的远程 shell 命令将默认在用户的$HOME
工作目录中执行。如果您给出了要执行的脚本的完整路径,这当然会正确启动远程脚本,但该脚本的工作目录将仍然是用户的主页。因此,由于它config.sh
只是一个相对文件引用,并且由于它不在工作目录中,因此您无法获取它。
您有多种解决方法:
在 shell中调用远程脚本之前
sh
,cd
进入存储该脚本的目录:ssh <username>@<ip> "cd /path/to/script; sh <script name> <parameter>"
如果你可以更改远程脚本,那么在脚本内部,从开头开始,
cd
走自己的路这样,以后在该脚本内调用时,您的工作目录都会发生变化。如果您使用 执行脚本,则 shell 的工作目录(您从中调用脚本)不会发生变化sh
。- 在脚本中,
config.sh
通过绝对路径调用,例如source /path/to/config.sh
而不是source config.sh
。但是,这样做不太方便。或者,更好的方法是: - 在脚本中,引用
config.sh
当前脚本进行调用,例如source "$(dirname "$0")/config.sh"
一般来说,在编写脚本时,如果您不能确定脚本本身是否从正确的工作目录调用,则应尽量避免进行相对引用。例如,如果脚本包含一条rm -rf <relative path>
语句,但您从错误的工作目录执行该语句,该怎么办?这可能会不可逆转地删除错误的数据。