2010-07-13 16:59:57 +0000 2010-07-13 16:59:57 +0000
95
95

当ssh'ing时,如何在服务器上设置一个环境变量,使其在会话与会话之间发生变化?

当我将 ssh 传入服务器时,如何将一个环境变量从客户端传递给服务器?这个环境变量在不同的ssh调用之间会发生变化,所以我不想每次进行ssh调用时都覆盖$HOME/.ssh2/environment。我如何才能做到这一点?

答案 (8)

116
116
116
2010-07-13 19:25:13 +0000

当然,你可以在命令里面设置环境变量,不过你要注意引用:记住,你的shell要解析你的本地命令行,然后远程shell会对它接收到的字符串进行处理。

如果你想让一个变量在服务器上得到与客户端相同的值,可以尝试使用SendEnv选项。

ssh -o SendEnv=MYVAR server.example.com mycommand

不过这需要服务器的支持。对于OpenSSH,变量名必须用/etc/sshd_config授权。

如果服务器只允许某些特定的变量名,你可以绕过这个问题;比如常见的设置允许LC_*通过,你可以做如下操作。

ssh -o SendEnv=LC\_MYVAR server.example.com 'MYVAR=$LC\_MYVAR; unset LC\_MYVAR; export MYVAR; mycommand'

如果连LC_*都不允许,你可以在TERM环境变量中传递信息,这个变量总是被复制的(不过可能有长度限制)。你还是要确保远程shell不会限制TERM变量来指定已知的终端类型。如果你不启动远程交互式shell,请将-t选项传给ssh。

env TERM="extra information:$TERM" ssh -t server.example.com 'MYVAR=${TERM%:\*}; TERM=${TERM##\*:}; export MYVAR; mycommand'

另一种可能是直接在命令中定义变量。

ssh -t server.example.com 'export MYVAR="extra information"; mycommand'

因此,如果传递一个本地变量:

ssh -t server.example.com 'export MYVAR='"'$LOCALVAR'"'; mycommand'

然而,要注意引用问题:变量的值将直接插值到远程端执行的shell片段中。上面最后一个例子假设$LOCALVAR不包含任何单引号(')。

12
12
12
2012-02-03 17:09:54 +0000

如果你能管理目标主机,你可以配置sshd允许将你的本地环境变量传递给目标主机。

来自sshd_config手册页。

PermitUserEnvironment
     Specifies whether ~/.ssh/environment and environment= options in
     ~/.ssh/authorized_keys are processed by sshd. The default is
     "no". Enabling environment processing may enable users to bypass
     access restrictions in some configurations using mechanisms such
     as LD_PRELOAD.

sshd配置通常位于/etc/ssh/sshd_config

6
6
6
2010-07-13 17:52:27 +0000

所以,在你的客户机上,你有一些环境变量,你希望它能被远程命令使用?我不认为有什么方法可以让ssh神奇地传递它,但你也许可以这样做。而不是使用,比如说:"

0x1"。

ssh remote.host my_command

你可以这样做:

ssh remote.host env ENV_VAR=$ENV_VAR my_command
4
4
4
2019-06-12 10:45:04 +0000

在你的本地客户端,在你的~/.ssh/config中可以添加SetEnv,例如

Host myhost
  SetEnv FOO=bar

注意:检查man ssh_config

然后在服务器上,确保允许客户端在你的/etc/ssh/sshd_config配置文件中传递某些环境变量。

AcceptEnv LANG LC_* FOO BAR*

注意:检查man sshd_config

3
3
3
2018-05-14 14:36:55 +0000

@emptyset的回答(对我来说没有用)让我找到了这个答案。

你可以在你的~/.ssh/authorized_keys文件中添加这个命令。

command="/usr/bin/env VARIABLE=<something> $SHELL" ssh-rsa <key>

export VARIABLE=<something>会立即退出,SSH连接被关闭(将我锁定在服务器之外),而/usr/bin/env ... $SHELL会在修改环境下运行你的默认shell。

1
1
1
2010-07-13 17:15:31 +0000

你可以尝试调用一个自定义命令,假设你有无密码的ssh登录设置。在服务器上,编辑你的 ~/.ssh/authorized/_keys 条目,它与你的客户端的密钥相对应:

command="export VARIABLE=<something>" ssh-rsa <key>

查看 此链接 强制命令一节中了解更多细节。

1
1
1
2015-08-28 16:55:01 +0000

我正在为一个设备定制一个OpenSSH,它的主目录和/etc里有一个cramfs(Cram FS是只读的),所以~/.ssh/environment无法工作,除非重建整个FS,而且这些都是现场部署的设备(嵌入式系统,因此使用CRAMFS)。你可以在sshd/dconfig中指定authroized/keys文件的位置,但是由于某些原因,environment=只对~/.ssh/authroized/keys中的环境变量有效。编辑/etc/profile不是一个选项,我不得不在一个非标准的目录下加载ssh。在session.c中,在childset_env(… “MAIL”…)之后添加你所需要的enviroment变量(这是个黑客,我知道…),但是如果有人需要一些硬编码的envs,如果你是从源码编译的话,你可以这样做。TGI-FLOSS

0
0
0
2019-04-11 17:12:11 +0000

只需一个简单的命令:

ssh -t your_host_or_ip 'export some_var_name=whatever_you_want; bash'
```。