在将本地 bash 脚本传递给 SSH 之前展开变量

在将本地 bash 脚本传递给 SSH 之前展开变量

我正在尝试通过 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 在服务器上不允许这样做,并且不会尝试从客户端发送任何环境变量。相关配置选项AcceptEnvsshd_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在远程启动标准命令) ,你会得到错误。)

相关内容