将变量定义传递到 ssh 中的特定 shell

将变量定义传递到 ssh 中的特定 shell

我想通过 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

相关内容