我想通过 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 登录?
默认情况下,通过 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 似乎可以正确处理会话的交互部分。
归档时间: |
|
查看次数: |
356 次 |
最近记录: |