如何将动态 ssh 输出设置为 zsh 变量?

如何将动态 ssh 输出设置为 zsh 变量?

我想在 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。这样您就不需要将您的私钥复制到其他任何地方。

相关内容