当我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。