![当 ssh 连接时,如何在服务器上设置随会话而变化的环境变量?](https://linux22.com/image/1707316/%E5%BD%93%20ssh%20%E8%BF%9E%E6%8E%A5%E6%97%B6%EF%BC%8C%E5%A6%82%E4%BD%95%E5%9C%A8%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%B8%8A%E8%AE%BE%E7%BD%AE%E9%9A%8F%E4%BC%9A%E8%AF%9D%E8%80%8C%E5%8F%98%E5%8C%96%E7%9A%84%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F%EF%BC%9F.png)
当我ssh
进入服务器时,如何将环境变量从客户端传递到服务器?此环境变量在不同的 ssh 调用之间会发生变化,因此我不想$HOME/.ssh2/environment
每次进行 ssh 调用时都进行覆盖。我该怎么做?
答案1
当然,您可以在命令内设置环境变量,但是您必须小心引用:请记住您的 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;取消设置 LC_MYVAR;导出 MYVAR;mycommand'
如果 evenLC_*
不是一个选项,您可以在TERM
环境变量中传递信息,该信息始终会被复制(但可能存在长度限制)。您仍然必须确保远程 shell 不会限制变量TERM
以指定已知的终端类型。-t
如果您没有启动远程交互式 shell,请将选项传递给 ssh。
env TERM="额外信息:$TERM" ssh -t server.example.com 'MYVAR=${TERM%:*}; TERM=${TERM##*:}; export MYVAR; mycommand'
另一种可能性是直接在命令中定义变量:
ssh -t server.example.com'export MYVAR="额外信息"; mycommand'
因此,如果传递局部变量:
ssh -t server.example.com'导出MYVAR ='“'$LOCALVAR'”'; mycommand'
但是,请注意引用问题:变量的值将直接插入到远程端执行的 shell 代码片段中。上面的最后一个示例假设$LOCALVAR
不包含任何单引号 ( '
)。
答案2
在您的本地客户端上,~/.ssh/config
您可以添加SetEnv
,例如
Host myhost
SetEnv FOO=bar
注:勾选man ssh_config
。
然后在服务器上,确保允许客户端在/etc/ssh/sshd_config
配置文件中传递某些环境变量:
AcceptEnv LANG LC_* FOO BAR*
注:勾选man sshd_config
。
答案3
如果您可以管理目标主机,您可以配置 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
答案4
@emptyset 的回复(对我不起作用)让我得到了这个答案:
您可以将此命令添加到您的~/.ssh/authorized_keys
文件中:
command="/usr/bin/env VARIABLE=<something> $SHELL" ssh-rsa <key>
export VARIABLE=<something>
立即退出,并且 SSH 连接被关闭(将我锁定在服务器之外),而/usr/bin/env ... $SHELL
将使用修改后的环境运行默认 shell。