如何通过ssh命令传递环境变量?[重复]


42

这个问题已经在这里有了答案:

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

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

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

Answers:


17

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

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

echo "Foo=Bar" > sshenv
echo "Joe=37" >> sshenv
scp sshenv user@server:~/.ssh/environment
ssh user@server myscript

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


3
变量需要潜在地更改每个ssh调用
Ross Rogers

1
最好描述一下您要做什么以及为什么。可能还有其他解决方案。必须在每个ssh调用中动态生成环境文件,这并非不可能。
EmmEff

将会发生什么变化?这些变量的值,甚至是它们的名称?
innaM

该死的 我尝试了此解决方案,但是我无法访问sshd配置文件,并且无法将vars放入〜/ .ssh / environment或〜/ .ssh2 / environment。我想我将使用kludge将这个变量保留在nfs磁盘上,然后使用〜/ .tcsh安装文件对其进行过滤。
罗斯·罗杰斯

2
这个答案似乎并没有真正回答这个问题。
直觉

55

SendEnv选项是你的男人。

〜/ .ssh / config :(本地)

SendEnv MYVAR

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

AcceptEnv MYVAR

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

~/.ssh/environment是为了其他目的。远程$ENV执行非Shell命令时,它就像文件一样。


6
也可以通过命令行(更有用)作为传递ssh myserver -o SendEnv="MYVAR",因此您可以使其在脚本中动态化。
迈克·坎贝尔

30

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

ssh username@machine VAR=value cmd cmdargs

您可以测试:

ssh machine VAR=hello env

在tcsh上,以下内容似乎有效:

ssh machine "setenv VAR <value>; printenv"

看起来这对bash环境很好。太糟糕了,我在公司的tcsh环境中。
罗斯·罗杰斯

2
如何互动使用会议?
luckydonald

1
请注意,如果将命令链接在一起(使用&&),则第一个示例仅适用于第一个命令。export VAR=value;在这种情况下,使用bash 代替第三种形式的setenv即可。
contrebis

2
这就是我最终要做的!无论您走到哪里,都随身携带环境。您可以这样做:ssh user@host "$(<env_to_source.sh) command ..." 。在源代码中,我export var=value ; 在单独的行上(记住分号)。
Tomasz Gandor

@TomaszGandor:多年以后,仍然完美-使我什至可以通过PROMPT_COMMAND之类的复杂内容,而不必担心逃脱:-) 1000谢谢。
红色药丸

29

还有一个可怕的骇客骇客。

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

例如,我们有一个客户端服务器上的一系列堡垒服务器。我讨厌每次都必须连接到另一台服务器和另一台服务器。我有一个脚本,其行为类似于SSH,但它很聪明。

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

每次使用时,我都会感到肮脏,但是它在我尝试过的所有地方都有效。


2
为什么要使用类似的东西代替OpenSSH的内置ProxyCommand选项?编辑您的,~/.ssh/config然后添加一个类似的代码块,Host *.example.com: ProxyCommand -ssh -W %h:%p bastionhost然后让其为您建立连接。
柯克·斯特拉瑟

1
对于隧道来说,还不错。对于环境变量,有两个原因:一,PermitUserEnvironment需要管理员权限才能在服务器上进行配置以直接传递它们。通过命令行传递它们也确实很难获得正确的转义。必须通过两个,多个堡垒,这使它变得更加复杂-尤其是当从源主机不清楚要到达特定目标主机的路径时,尤其如此。要说:“ bounce-ssh bast1 bast2 nodeX-rm -rf /”比在一系列ssh-config文件中维护不断增长的主机路由要容易得多。
杰森(Jayson)2012年

接得好 !!太好了,有点脏!
zw963 '16

2
这太可怕了。太棒了 👏
裨Delport

1
太棒了,谢谢!我已经将它用于另一个非常棒的技巧!:)
简陋的

1
bla="MyEnvSelection=dcop"
ssh user@host "export $bla && ./runProg"

在bash上,我测试了:

$ echo '#!/bin/sh' > readEnv.sh
$ echo 'echo "MyEnv: "$MyEnvFromSSH' >> readEnv.sh

$ scp readEnv.sh user@host:~/
$ bla="MyEnvFromSSH=qwert"
$ ssh user@host "export $bla && ./readEnv.sh"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.