如果我运行此命令,输出就是我所期望的,列出/root
我的服务器上的目录。
~ bash -c "ssh -t myserver 'sudo ls /root'"
Enter passphrase for key '/home/james/.ssh/ed25519':
[sudo] password for myserver:
snap
Connection to 167.172.xxx.xxx closed.
但是,当我尝试使用子 shell 将该输出获取到变量中时,ssh 会话在我输入 ssh 密码后挂起
➜ ~ var=$(bash -c "ssh -t myserver 'sudo ls /root'")
Enter passphrase for key '/home/james/.ssh/ed25519':
它只是保持这样,再次按 Enter 不会产生新行,直到我用 ctrl-C 取消之前什么也没有发生。
为什么它在子 shell 中的工作方式不同,以及如何将 ssh 命令的输出获取到局部变量中?
编辑:正如 @KamilMaciorowski 指出的,stderr 和 stdout 被合并为一个(我实际上可以输入我的密码,捕获的输出包括密码提示以及预期的输出)
var=$(bash -c "ssh -t stash 'sudo ls /root'")
Connection to 167.172.xxx.xxx closed.
➜ ~ echo $var
[sudo] password for stash:
snap
他链接到的线程似乎表明我想要的东西是不可能的,所以我想只是操作输出字符串是我最好的选择,它工作得很好。
var=$(bash -c "ssh -t stash 'sudo ls /root'" | tail -n +2)
不过,是否有更好的方法来将远程命令的输出捕获到本地变量?