我正在尝试通过 SSH 在远程主机上执行脚本。该脚本使用在当地的壳。脚本中的变量未展开。
ssh user@host 'bash -s' < script.sh
内容script.sh
:
#!/bin/bash
docker pull "$IMAGE"
在远程主机上执行如下:
docker pull ""
如错误输出所示:
解析引用时出错:“”不是有效的存储库/标签:存储库名称必须至少有一个组成部分
我尝试过使用命令替换:
ssh user@host < $(cat script.sh)
这导致:
bash:第 95 行:$(cat script.sh):不明确的重定向
script.sh
在通过 SSH 传递命令之前如何使变量展开?
答案1
原则上您可以通过 SSH 将环境变量发送到远程,但至少 OpenSSH 在服务器上不允许这样做,并且不会尝试从客户端发送任何环境变量。相关配置选项AcceptEnv
在sshd_config
(服务器)和(客户端)SendEnv
中。ssh_config
假设您不能或不想更改那里的配置,因为无论如何您都将整个脚本发送到远程标准输入,您也可以将变量分配粘贴在该脚本前面。
我们可以使用export -p
远程 shell 可以用来分配它们的格式来打印当前 shell 中的所有导出变量。然后远程可以像往常一样处理脚本并设置变量。
所以与script.sh
包含
echo "$FOO" "$HOSTNAME"
这将FOO
在本地 shell 中导出,然后将所有导出变量的定义以及脚本本身传递到远程。结果输出包含FOO
刚刚设置的值。
$ export FOO=abc123
$ (export -p; cat script.sh) | ssh user@remotehost 'bash -s'
FOO: abc123 HOSTNAME: remotehost
(这里 Bash 有一个小问题。在正常模式下,它export -p
打印出declare
命令而不是标准命令export
,而其他 shell 可能不支持这些命令。因此,如果您的本地 shell 是 Bash,并且您会sh
在远程启动标准命令) ,你会得到错误。)