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环境变量(+LANG和LC_*许多默认配置中的^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看看它们在您的系统上的默认值是什么。