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

Ame*_*ina 1 login ssh zsh

我想通过 ssh 连接到具有预定义设置的机器,特别是在 zsh 中。

为此,我尝试从客户端执行以下操作(受此答案启发):

$ ssh -t machine@domain "STARTUP_OPTION='A'; exec /path/to/zsh;"
Run Code Online (Sandbox Code Playgroud)

然后我.zshrc在服务器中有以下内容:

if [ "$STARTUP_OPTION" = "A" ]; then
    echo "Logging in with A"
fi
Run Code Online (Sandbox Code Playgroud)

这似乎不起作用。在远程 shell 中传递 shell 变量的值时,如何使用特定的 shell 登录?

Gil*_*il' 6

默认情况下,通过 SSH 连接传输的唯一环境变量是TERM. 你可以在那里打包信息,但你必须确保它会在服务器端解包。客户端可以发送其他消息,但服务器需要建立与接受他们AcceptEnv的指令/etc/sshd_config。在 Debian 和大多数衍生产品(Ubuntu、Mint 等)LC_下,SSH 服务器也接受名称以 开头的所有变量。这些变量通常用于语言环境设置,但您可以使用自己的变量之一来传递其他内容。如果您的服务器允许,您可以简单地编写

LC_STARTUP_OPTION=A ssh
Run Code Online (Sandbox Code Playgroud)

另一种可能性是根据用户身份验证密钥运行命令(这仅需要控制~/.ssh/authorized_keys,而不是 sshd 配置)。

如果您无法传输环境变量,您可以在命令行上设置它,然后执行交互式 shell,就像您一直在做的那样。由于您正在执行一个新的 shell(这是必要的,因为您不能同时指定一个初始命令来运行并获得一个交互式 shell),这需要是一个环境变量,而不是一个 shell 变量。

ssh -t machine@domain 'export STARTUP_OPTION="A"; exec /path/to/zsh'
Run Code Online (Sandbox Code Playgroud)

另一种方法是通过 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
~% 
Run Code Online (Sandbox Code Playgroud)

尽管有关于无法初始化终端的错误消息,但 zsh 似乎可以正确处理会话的交互部分。