44

我与几个不同的服务器一起工作,能够设置一些环境变量以便当我 SSH 进入时它们在所有服务器上都处于活动状态会很有用。问题是,一些变量的内容包含敏感信息(散列密码),所以我不想把它放在一个 .bashrc 文件中——我只想把它保存在内存中。

我知道您可以使用 SSH 转发 DISPLAY 变量(通过 ForwardX11)或 SSH 代理进程(通过 ForwardAgent),所以我想知道是否有一种方法可以跨 SSH 连接自动转发任意环境变量的内容。理想情况下,我可以在 .ssh/config 文件中设置一些内容,以便在需要时自动运行。有任何想法吗?

4

3 回答 3

39

可以,但需要更改服务器配置。

阅读sshd_config(5)ssh_config(5)AcceptEnv中的条目。SendEnv

更新

您也可以在命令行上传递它们:

ssh foo@host "FOO=foo BAR=bar doz"

关于安全性,请注意,任何有权访问远程机器的人都可以看到传递给任何正在运行的进程的环境变量。

如果您想对该信息保密,最好将其传递stdin

cat secret_info | ssh foo@host remote_program
于 2010-12-10T15:04:47.003 回答
14

您不能自动执行此操作(除了$DISPLAY您可以-X与 Xauth 信息一起转发以便远程程序实际连接到您的显示器),但您可以使用带有“此处文档”的脚本:

ssh ... <<EOF
export FOO="$FOO" BAR="$BAR" PATH="\$HOME/bin:\$PATH"
runRemoteCommand
EOF

未转义的变量将在本地扩展并将结果传输到远程端。所以PATH将被设置为远程值$HOME

这是一个安全风险不要以这种方式传输密码等敏感信息,因为任何人都可以看到同一台计算机上每个进程的环境变量。

于 2010-12-10T14:52:42.857 回答
0

就像是:

ssh user@host bash -c "set -e; $(env); . thescript.sh"

...可能工作(未经测试)

有点hack,但是如果由于某种原因您无法更改服务器配置,它可能会起作用。

于 2019-01-15T11:57:28.283 回答