远程脚本中的引用未解析

远程脚本中的引用未解析

我正在尝试使用 在远程机器上执行脚本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只是一个相对文件引用,并且由于它不在工作目录中,因此您无法获取它。

您有多种解决方法:

  1. 在 shell中调用远程脚本之前shcd进入存储该脚本的目录:

    ssh  <username>@<ip> "cd /path/to/script; sh <script name> <parameter>"
    
  2. 如果你可以更改远程脚本,那么在脚本内部,从开头开始,cd走自己的路这样,以后在该脚本内调用时,您的工作目录都会发生变化。如果您使用 执行脚本,则 shell 的工作目录(您从中调用脚本)不会发生变化sh

  3. 在脚本中,config.sh通过绝对路径调用,例如source /path/to/config.sh而不是source config.sh。但是,这样做不太方便。或者,更好的方法是:
  4. 在脚本中,引用config.sh当前脚本进行调用,例如source "$(dirname "$0")/config.sh"

一般来说,在编写脚本时,如果您不能确定脚本本身是否从正确的工作目录调用,则应尽量避免进行相对引用。例如,如果脚本包含一条rm -rf <relative path>语句,但您从错误的工作目录执行该语句,该怎么办?这可能会不可逆转地删除错误的数据。

相关内容