【问题标题】:Inherit environment variable in ssh session?在 ssh 会话中继承环境变量?
【发布时间】:2013-12-14 07:08:19
【问题描述】:

我需要处理很多远程机器,每台机器共享一个全局环境变量( 像 CONTROLLER_IP)。当我尝试 ssh 到远程机器时,我想设置 CONTROLLER_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 会话中获取 CONTROLLER_IP 设置。 (上面显示的代码不起作用...)

【问题讨论】:

  • $ofc1 可疑。你确定你的意思不仅仅是CONTROLLER_IP=ofc1 吗?
  • 不,ofc1 只是我本地主机中的另一个环境变量。

标签: linux ssh


【解决方案1】:

在服务器上的/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"

【讨论】:

    【解决方案2】:

    试试

     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 ...)。所以也许远程主机上的.bashrc 可能包含

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

    更好的是,用 SSH_CONNECTION 替换远程脚本中出现的 CONTROLLER_IP

    【讨论】:

    • 我想发送 env var 的设置并且仍然能够登录到 ssh 会话。您的代码只是运行一些命令并退出 ssh。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 2021-03-23
    • 1970-01-01
    • 2016-03-17
    • 2021-03-01
    相关资源
    最近更新 更多