当 ssh 连接时,如何在服务器上设置随会话而变化的环境变量?

当 ssh 连接时,如何在服务器上设置随会话而变化的环境变量?

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

相关内容