![将变量定义传递到 ssh 中的特定 shell](https://linux22.com/image/74530/%E5%B0%86%E5%8F%98%E9%87%8F%E5%AE%9A%E4%B9%89%E4%BC%A0%E9%80%92%E5%88%B0%20ssh%20%E4%B8%AD%E7%9A%84%E7%89%B9%E5%AE%9A%20shell.png)
我想通过 ssh 连接到具有预定义设置的机器,特别是在 zsh 中。
为此,我尝试从客户处执行以下操作(受到启发这个答案):
$ ssh -t machine@domain "STARTUP_OPTION='A'; exec /path/to/zsh;"
然后我.zshrc
在服务器中有以下内容:
if [ "$STARTUP_OPTION" = "A" ]; then
echo "Logging in with A"
fi
这似乎不起作用。如何在远程 shell 中传递 shell 变量的值时使用特定 shell 登录?
答案1
默认情况下,通过 SSH 连接传输的唯一环境变量是TERM
。您可以在那里打包信息,但必须确保它将在服务器端解包。客户端可以传输其他消息,但需要将服务器设置为AcceptEnv
使用 中的指令接受它们/etc/sshd_config
。在 Debian 和大多数衍生版本(Ubuntu、Mint 等)下,所有名称以 开头的变量LC_
也被 SSH 服务器接受。这些变量通常用于区域设置,但您可以使用自己的变量之一来传递其他变量。如果你的服务器允许,你可以简单地写
LC_STARTUP_OPTION=A ssh
另一种可能性是根据用户身份验证密钥运行命令(这仅需要控制~/.ssh/authorized_keys
,而不需要 sshd 配置)。
如果您无法传输环境变量,您可以在命令行上设置它,然后执行交互式 shell,就像您一直在做的那样。由于您正在执行一个新的 shell(这是必要的,因为您不能同时指定要运行的初始命令并获取交互式 shell),因此这需要是一个环境变量,而不是 shell 变量。
ssh -t machine@domain 'export STARTUP_OPTION="A"; exec /path/to/zsh'
另一种方法是通过 shell 的标准输入将一些数据提供给 shell,然后将标准输入重定向到终端。
ssh -t localhost 'echo "echo foo; exec </dev/tty" | exec zsh -i'
stdin: is not a tty
stty: standard input: Inappropriate ioctl for device
~%
尽管出现有关无法初始化终端的错误消息,但 zsh 似乎可以正确处理会话的交互部分。
答案2
您可以export
定义变量,以便进程继承变量定义zsh
:
$ export foo=bar
$ exec zsh
$ echo $foo
bar
或者使用env
:
$ exec env foo=bar zsh
$ echo $foo
bar