在ssh会话中继承环境变量?

时间:2013-12-14 07:08:20

标签: linux ssh

我需要处理很多远程机器,每台机器共享一个全局环境变量( 像CONTROLLER_IP)。当我尝试ssh到远程机器时,我想设置CONTROLLER_IP 根据当前的localhost设置。有什么办法可以实现吗?

示例:

在localhost主机中,我设置了c1 = 192.168.0.1和ofc2 = 192.168.1.1 我需要ssh到ofs1,ofs2。 我想做点什么:

CONTROLLER_IP=$ofc1 ssh root@ofs1; CONTROLLER_IP=$ofc2 ssh root@ofs2

然后我将在每个ssh会话中获得CONTROLLER_IP设置。  (上面显示的代码不起作用......)

2 个答案:

答案 0 :(得分:3)

在服务器上的/etc/sshd_config中,您可以使用AcceptEnv设置定义接受的环境变量列表,然后您可以发送如下环境变量:

CONTROLLER_IP=$ofc1 ssh -o SendEnv=CONTROLLER_IP root@ofs1

但这对你的目的来说似乎有些过分。

另一种方法是传递远程命令中的变量,如下所示:

ssh root@ofs1 "CONTROLLER_IP=$ofc1 somecmd"

或者,如果你运行多个远程命令,那么就像这样:

ssh root@ofs1 "export CONTROLLER_IP=$ofc1; cmd1; cmd2; cmd3; ..."

如果需要引用变量的值,可以这样做:

ssh root@ofs1 "CONTROLLER_IP='$ofc1' somecmd"

答案 1 :(得分:0)

尝试

 ssh root@ofs1 "env CONTROLLER_IP=$ofc1 somescript"

(假设$ofc1被评估为某个IP地址,如12.234.56.178,没有空格或顽皮字符)

或者

 ssh root@ofs1 "env CONTROLLER_IP='$ofc1' somescript"

如果$ofc1可以包含空格或顽皮字符

其中somescript是远程计算机ofs1上的脚本;如果你想要一个交互式shell试试

 ssh root@ofs1 "env CONTROLLER_IP='$ofc1' /bin/bash"

最后,ssh通常设置一些环境变量(在远程机器上),特别是SSH_CONNECTION。您可以在远程计算机上使用它。它的第三个字段是原始主机的IP地址(ssh ...)的IP地址。因此,远程主机上的.bashrc可能包含

 if [ -n "$SSH_CONNECTION" ]; then
   export CONTROLLER_IP=$(echo $SSH_CONNECTION|cut -f3 -d' ')
 fi

更好的是,使用CONTROLLER_IP

替换远程脚本中的SSH_CONNECTION次出现