我想在 zsh 中将一个变量设置为 ssh 命令的输出。ssh 命令本身连接到第一台服务器,然后从这台服务器再次 ssh 到第二台服务器,我要在该服务器上执行命令。
这是命令(在 shell 中输入时可以正常工作):
ssh -t host1 "ssh -t host2 "uname -a""
我为 host1 设置了 ssh 密钥,因此连接不需要密码。我没有为 host1 和 host2 之间的后续连接设置密码,因此我必须输入密码。
现在,我想将内容保存uname
在变量中,以便在我的 zsh 脚本中使用。我天真地尝试过:
a=$(ssh -t host1 "ssh -t host2 "uname -a"")
但它似乎永远挂起,不知何故交互式密码登录提示没有重定向到我。如果我echo $a
之后尝试,我会得到一个user@host2's password:'
确认
我猜想是 zsh 处理引号和双引号的方式出了问题,但我搞不清楚到底是什么。我尝试了很多方法,但都没有成功。
答案1
这绝对与引用无关(引用应该可能是ssh -t host1 "ssh -t host2 \"uname -a\""
)。引号仅适用于命令行参数,不适用于命令输入/输出。只会$()
影响输出。
问题可能只是如何ssh
处理 tty 输入/输出。似乎ssh
(这里ssh -t host1
)确实不是即使有一个可用的客户端终端设备,也使用它 - 它会写入 stdout,这$()
将捕获。
最好的解决方案是在当地的和主机2,然后将您的密钥添加到 ssh-agent,并使用“代理转发”选项:ssh -A host1 ssh host2 uname -a
。这样您就不需要将您的私钥复制到其他任何地方。