Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 在ssh会话中继承环境变量?_Linux_Ssh - Fatal编程技术网

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

Linux 在ssh会话中继承环境变量?,linux,ssh,Linux,Ssh,我需要处理许多远程机器,每台机器共享一个全局环境变量( 如控制器(IP)。当我尝试ssh到远程机器时,我想设置控制器\u IP 根据当前本地主机设置。有什么办法可以实现吗 例如: 在localhost中,我设置了ofc1=192.168.0.1和ofc2=192.168.1.1 我需要ssh到ofs1,ofs2。 我想做一些类似的事情: CONTROLLER_IP=$ofc1 ssh root@ofs1; CONTROLLER_IP=$ofc2 ssh root@ofs2 然后,我将在每个ss

我需要处理许多远程机器,每台机器共享一个全局环境变量( 如控制器(IP)。当我尝试ssh到远程机器时,我想设置控制器\u IP 根据当前本地主机设置。有什么办法可以实现吗

例如:

在localhost中,我设置了ofc1=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会话中获取控制器\u IP设置。 (上面显示的代码不起作用…

试试看

 ssh root@ofs1 "env CONTROLLER_IP=$ofc1 somescript"
(假设将
$ofc1
计算为某些IP地址,如
12.234.56.178
,不带空格或顽皮字符)

或许

 ssh root@ofs1 "env CONTROLLER_IP='$ofc1' somescript"
如果
$ofc1
可能包含空格或顽皮字符

其中
somescript
是SOF1远程机器上的脚本;如果您想要一个交互式shell,请尝试

 ssh root@ofs1 "env CONTROLLER_IP='$ofc1' /bin/bash"
最后,
ssh
通常会设置一些环境变量(在远程机器上),特别是
ssh\u连接。你可以在远程机器上使用它。它的第三个字段是源主机的IP地址(在该主机上执行
ssh
…)。因此,远程主机上的
.bashrc
可能包含

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

更好的方法是,在服务器上,使用
/etc/sshd\u config
中的
SSH\u连接将远程脚本中出现的
CONTROLLER\u IP
替换为
,您可以使用
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"
但这对你来说似乎有点过分了

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

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"
或者,如果运行多个远程命令,则如下所示:

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"
如果需要引用变量的值,可以执行以下操作:

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"

可疑的
$ofc1
可能重复。你确定你的意思不仅仅是
控制器\u IP=ofc1
?不,ofc1只是我本地主机中的另一个环境变量。我想发送环境变量的设置,并且仍然能够登录到ssh会话。您的代码只是运行一些命令并退出ssh。