将环境变量传递到 ssh 连接

kos*_*u05 2 bash ssh zsh environment-variables

我想将环境变量传递给 ssh 连接。它们应该动态传递,因此将它们硬编码到 ssh 的配置文件中对我来说不起作用。

我试过这个:

   AAA="tatata" ssh my_user@my_server.com
   echo $AAA
   ====> (empty)
Run Code Online (Sandbox Code Playgroud)

怎么做?

小智 7

ssh 仅传递TERM环境变量(+LANGLC_*许多默认配置中的^1)。更改服务器的配置以接受任何环境变量可能会产生严重后果(允许用户绕过其登录 shell 和任何环境变量ForceCommand),因此您不应该这样做

您可以将它们设置在右侧,作为“远程命令”参数的一部分,并显式启动交互式登录 shell,而不是尝试通过 ssh 传递它们:

ssh -t user@host AAA=tatata bash -l
Run Code Online (Sandbox Code Playgroud)

-t选项是让ssh分配一个伪终端,当指定远程命令时,默认情况下它不会执行此操作。bash 的选项-l是让它运行一个登录 shell,即让它 source ~/.bash_login,并尽可能模拟它在没有为 ssh 指定远程命令参数时的运行方式。

由于环境变量的值将在本地和远程端扩展两次,因此您应该对它们加双引号,这可能会很快变得令人讨厌:

ssh -t user@host PRICE=\\\$19 bash -l
Run Code Online (Sandbox Code Playgroud)

但是如果您的配置允许LC_*环境变量通过,您可以这样命名您的变量;-)

LC_AAA=tatata ssh user@host
Run Code Online (Sandbox Code Playgroud)

或者,如果您的 ssh客户端配置不LC_*包含SendEnv

LC_AAA=tatata ssh -o SendEnv=LC_AAA user@host
Run Code Online (Sandbox Code Playgroud)

^1为了能够通过 ssh 传递额外的环境变量,AcceptEnv服务器和SendEnv客户端上都需要。在中查找这些指令,ssh*_config看看它们在您的系统上的默认值是什么。