当ssh'ing时,如何在服务器上设置一个环境变量,使其在会话与会话之间发生变化?
当我将 ssh
传入服务器时,如何将一个环境变量从客户端传递给服务器?这个环境变量在不同的ssh调用之间会发生变化,所以我不想每次进行ssh调用时都覆盖$HOME/.ssh2/environment
。我如何才能做到这一点?
当我将 ssh
传入服务器时,如何将一个环境变量从客户端传递给服务器?这个环境变量在不同的ssh调用之间会发生变化,所以我不想每次进行ssh调用时都覆盖$HOME/.ssh2/environment
。我如何才能做到这一点?
当然,你可以在命令里面设置环境变量,不过你要注意引用:记住,你的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
不包含任何单引号('
)。
如果你能管理目标主机,你可以配置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
。
我正在为一个设备定制一个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