如何通过 ssh 命令传递环境变量?

Ros*_*ers 61 ssh command-line

如何将值传递给 ssh 命令,以便在主机上启动的环境以我选择的某个环境变量开始?

编辑:目标是将当前的 kde 桌面(从 dcop kwin KWinInterface currentDesktop )传递到创建的新 shell,以便我可以将 nfs 位置传回原始服务器上的JEdi​​t实例,这对于每个 KDE 桌面都是唯一的。(使用像emacsserver / emacsclient这样的机制)

多个 ssh 实例可以同时运行的原因是,当我设置环境时,我向不同的机器打开了一堆不同的 ssh 实例。

小智 79

SendEnv选项是你的男人。

~/.ssh/config: (本地)

SendEnv MYVAR
Run Code Online (Sandbox Code Playgroud)

/etc/ssh/sshd_config:(在远程端)

AcceptEnv MYVAR
Run Code Online (Sandbox Code Playgroud)

现在,无论 local 的值$MYVAR是多少,它也可以在远程会话中使用。
如果您多次登录,每个会话都有自己的 副本$MYVAR,可能有不同的值。

~/.ssh/environment用于其他目的。它$ENV在远程执行非 shell命令时充当文件。

  • 也可以(更有用)通过命令行作为 `ssh myserver -o SendEnv="MYVAR"` 传递,因此您可以在脚本中使其动态化。 (9认同)

小智 43

您可以使用类似于以下内容的命令传递值:

ssh username@machine VAR=value cmd cmdargs
Run Code Online (Sandbox Code Playgroud)

您可以使用以下方法进行测试:

ssh machine VAR=hello env
Run Code Online (Sandbox Code Playgroud)

在 tcsh 上,以下似乎有效:

ssh machine "setenv VAR <value>; printenv"
Run Code Online (Sandbox Code Playgroud)

  • 如何以交互方式使用会话? (3认同)
  • 这就是我最终要做的!无论您走到哪里,请随身携带您的环境。你可以这样做:`ssh user@host "$(&lt;env_to_source.sh) command ..." `。在 env to source 中,我有 `export var=value ; ` 在不同的行(记住分号)。 (2认同)

Jay*_*son 35

还有一个可怕的,可怕的黑客。

如果您的脚本正在使用远程端的变量(即您可以随意命名),您可以滥用语言环境变量。任何形式为 LC_* 的变量都将逐字传递,无需任何配置。

例如,我们在我的一个客户端上有一系列堡垒服务器。我讨厌必须连接到它,只是为了连接到另一台服务器......和另一台服务器......每次。我有一个脚本,它的行为就像 SSH,只是它很聪明。

基本上,如果设置了 LC_BOUNCE_HOSTS,它会将其拆分为空格并剥离第一个主机。然后它反弹并运行相同的脚本。在目标节点上,这个列表最终是空的,所以它运行命令。我还有一个调试模式(在网络故障期间很好用),它由 LC_BOUNCE_DEBUG 设置。由于 ssh 神奇地为我传递了所有这些信息,除了识别主机列表的末尾(我使用 -- 选项执行此操作)之外,我无需执行任何其他操作。

每次使用这个我都觉得很脏,但它在我尝试过的任何地方都有效。

  • 这太可怕了。太棒了。 (3认同)
  • 为什么要使用类似的东西而不是 OpenSSH 的内置 `ProxyCommand` 选项?编辑你的 `~/.ssh/config` 并添加一个类似 `Host *.example.com: ProxyCommand -ssh -W %h:%p bastionhost` 的块,让它为你建立连接隧道。 (2认同)
  • 对于隧道来说,情况并没有那么糟糕。对于环境变量,有两个原因:一,PermitUserEnvironment 需要管理员访问权限才能在服务器上配置以直接传递它们。通过命令行传递它们也很难获得正确的转义。第二,必须通过多个堡垒,这使得这有点复杂——尤其是当源主机不清楚要采用哪条路径到达某个目标主机时。说“bounce-ssh bast1 bast2 nodeX -- rm -rf /”比在一系列 ssh-config 文件中维护不断变化的主机群的路由更容易。 (2认同)
  • 至少从 OpenSSH 版本 5.3p1 开始,这应该不再有效,因为新的服务器配置只接受特定的 LC_xxx 变量(而不是`AcceptEnv LC_*`) (2认同)

Joh*_*n T 29

~/.ssh/environment文件可用于设置您希望用于远程命令的变量。您必须PermitUserEnvironment在 sshd 配置中启用。

以这种方式设置的变量会导出到子进程,因此您可以:

echo "Foo=Bar" > sshenv
echo "Joe=37" >> sshenv
scp sshenv user@server:~/.ssh/environment
ssh user@server myscript
Run Code Online (Sandbox Code Playgroud)

并且 myscript 会知道 Foo 是 Bar 而 Joe 是 37。

  • 变量需要在每次 ssh 调用时潜在地改变 (3认同)
  • 这个答案似乎并没有真正回答这个问题。 (2认同)
  • 如果两个进程尝试同时使用不同的值集执行此操作,则会中断 (2认同)

归档时间:

查看次数:

146964 次

最近记录:

8 年 前