通过SSH将变量传递给远程脚本

Max*_*Max 5 linux ssh bash shell ubuntu

我通过SSH从本地服务器在远程服务器上运行脚本.首先使用SCP复制脚本,然后在传递一些参数时调用,如下所示:

scp /path/to/script server.example.org:/another/path/

ssh server.example.org \
MYVAR1=1 \
MYVAR2=2 \
/another/path/script
Run Code Online (Sandbox Code Playgroud)

这工作正常,在远程服务器上,变量MYVAR1MYVAR2可用的相应值.

问题是这些脚本处于不断发展状态,每次重命名,添加或删除变量时都需要更改SSH命令.

我正在寻找一种方法将所有本地环境变量传递给远程脚本(因为MYVAR1并且MYVAR2实际上是本地环境变量),这将解决SSH命令维护问题.

由于MYVAR1=1 \MYVAR1=1 \env命令输出后面的行,我尝试用实际命令替换它们,如下所示:

ssh server.example.org \
`env`
/another/path/script
Run Code Online (Sandbox Code Playgroud)

这似乎适用于"简单" env输出线(例如SHELL=/bin/bashLOGNAME=sysadmin),但是我得到更多"复杂"输出线的LS_COLORS=rs=0:di=01;34:ln=01;[...]错误(例如,它会产生错误-bash: 34:ln=01: command not found).我可以通过在运行SSH命令之前取消设置与这些复杂输出行相对应的变量来消除这些错误(例如unset LS_COLORS,然后ssh [...])但是我发现这个解决方案非常可靠.

问:有人知道如何通过SSH将所有本地环境变量传递给远程脚本吗?

PS:本地环境变量不是远程机器上可用的环境变量,因此我无法使用此解决方案.

用解决方案更新

我结束使用sed的格式化env命令输出VAR=VALUEVAR="VALUE"(和连接到1中的所有行),其防止从解释某些输出的作为指令bash和修复我的问题.

ssh server.example.org \
`env | sed 's/\([^=]*\)=\(.*\)/\1="\2"/' | tr '\n' ' '` \
"/another/path/script"
Run Code Online (Sandbox Code Playgroud)

car*_*ett 7

我碰巧阅读了sshd_config与此无关的手册页,并找到了选项AcceptEnv:

AcceptEnv 指定客户端发送的环境变量将被复制到会话的环境中(7).有关如何配置客户端的信息,请参阅ssh_config(5)中的SendEnv.请注意,仅对协议2支持环境传递.变量由名称指定,可能包含通配符*' and?'.多个环境变量可以用空格分隔,也可以分布在多个AcceptEnv指令中.请注意,某些环境变量可用于绕过受限用户环境.因此,应该注意使用该指令.默认情况下不接受任何环境变量.

也许你可以用它AcceptEnv: *?我没有方便的sshd盒子,但试试看!