无法通过 ssh 运行带有变量的本地脚本文件

无法通过 ssh 运行带有变量的本地脚本文件

我需要运行以下脚本 test.sh 文件才能在远程系统中运行。

变量.txt:

name=stackexchange

测试.sh:

#!/bin/bash
source ./variables.txt
echo $name

跑步

ssh -i "auth.key" user@host 'bash -s' < test.sh

但我收到此错误:

bash: line 2: ./variables.txt: No such file or directory

答案1

您告诉另一台机器上的 shell 获取该./variables文件,该文件不存在于pwd该 shell 中。一步一步来看,它看起来像这样:

  1. 此命令通过 ssh 连接并从本地发送线路test.sh

    ssh -i "auth.key" user@host 'bash -s' < test.sh
    
  2. 远程 shell 通过连接启动ssh,然后获取以下行:

    • #!/bin/bash远程 shell 对此行的解释取决于该 shell 是什么。大多数 shell 会将这一行视为注释。如果 shell 是sh,则远程 shell 不会变成bash,因为 shebang 行仅在脚本文件中有效,并且脚本需要设置可执行位。
    • source ./variables.txt现在,远程 shell 被告知从variables.txt当前工作目录中的文件中获取数据。如果该文件不存在,shell 将抛出错误。在你的情况下,shell 是 Bash,错误是:

      bash: line 2: ./variables.txt: No such file or directory
      
    • echo $name因为$name是空的,所以终端中只打印了一个空行。

要亲自确认这一点,请将文件放在variables.txt远程主目录中,并使用与源不同的行,例如:

name=remotehost

并像以前一样运行测试脚本。

答案2

在远程计算机上运行的程序会看到远程计算机上的文件,而不是您运行的计算机上的文件ssh。您告诉 SSH 将 的内容复制test.sh到远程计算机并将其作为输入传递到bash那里,因此运行test.sh.但是,当脚本(bash 在标准输入上接收)尝试读取 时variables.txt,它会在正在执行的计算机上查找它(这并不是说它有选择),但没有找到它。

如果您的脚本不太复杂并且没有嵌套包含,那么您可以进行文本替换来内联脚本的内容。请注意,这是脆弱的 - 它仅在source ./variables.txt直接出现在脚本中时才有效,而在涉及复杂的引用、变量eval等时则无效。为简单起见,我假设该source命令单独存在于其行中。更复杂的转换将有可能应对更复杂的场景。

<test.sh sed '/^[ \t]*source variables\.txt[ \t]*$/ {
  d
  r variables.txt
}' | ssh -i "auth.key" user@host 'bash -s'

相关内容