我需要运行以下脚本 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 中。一步一步来看,它看起来像这样:
此命令通过 ssh 连接并从本地发送线路
test.sh
ssh -i "auth.key" user@host 'bash -s' < test.sh
远程 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'