【发布时间】:2011-10-08 10:31:05
【问题描述】:
我正在通过 SSH 从本地服务器在远程服务器上运行脚本。该脚本首先使用 SCP 进行复制,然后在传递一些参数时调用,如下所示:
scp /path/to/script server.example.org:/another/path/
ssh server.example.org \
MYVAR1=1 \
MYVAR2=2 \
/another/path/script
这工作正常,在远程服务器上,变量MYVAR1 和MYVAR2 可以使用它们对应的值。
问题是这些脚本在不断开发中,每次重命名、添加或删除变量时都需要更改 SSH 命令。
我正在寻找一种将所有本地环境变量传递给远程脚本的方法(因为 MYVAR1 和 MYVAR2 实际上是本地环境变量),这将解决 SSH 命令维护问题。
由于MYVAR1=1 \ 和MYVAR1=1 \ 是遵循env 命令输出的行,因此我尝试将它们替换为实际命令,如下所示:
ssh server.example.org \
`env`
/another/path/script
这似乎适用于“简单”env 输出行(例如 SHELL=/bin/bash 或 LOGNAME=sysadmin),但是对于更“复杂”的输出行(例如 LS_COLORS=rs=0:di=01;34:ln=01;[...] 会出现错误,例如 @987654335 @)。我可以通过在运行 SSH 命令(例如unset LS_COLORS,然后是ssh [...])之前取消设置与那些复杂输出行相对应的变量来消除这些错误,但是我发现这个解决方案并不是非常可靠。
问:有人知道如何通过 SSH 将所有本地环境变量传递给远程脚本吗?
PS:本地环境变量不是远程机器so I cannot use this solution上可用的环境变量。
更新解决方案
我结束了使用sed 将env 命令输出从VAR=VALUE 格式化为VAR="VALUE"(并将所有行连接到1),这可以防止bash 将某些输出解释为命令并解决我的问题。
ssh server.example.org \
`env | sed 's/\([^=]*\)=\(.*\)/\1="\2"/' | tr '\n' ' '` \
"/another/path/script"
【问题讨论】:
标签: linux bash shell ubuntu ssh