捕获通过 ssh 运行的 sudo 命令的输出(没有密码提示)?

捕获通过 ssh 运行的 sudo 命令的输出(没有密码提示)?

如果我运行此命令,输出就是我所期望的,列出/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)

不过,是否有更好的方法来将远程命令的输出捕获到本地变量?

相关内容