在使用Bash进程replace时通过ssh提供sudo密码?

我的问题可以看作是如何通过SSH的差异扩展? 有点扭曲。

环境

macOS Sierra(10.12.3)
OpenSSH 7.3

示例情况

我试图在两个文件之间打印diff ,其中一个位于远程主机上,需要读取sudo

如果这个远程文件是我的远程用户可读(或者如果我可以用sudo标志NOPASSWD执行命令),我只需要执行:

 diff LOCALFILE <(ssh host 'cat REMOTEFILE') 

然而,我确实需要进行身份validation才能执行远程命令,这意味着我必须分配一个伪terminal与ssh -t ,并且下面的执行永远不会完成:

 diff LOCALFILE <(ssh -t host 'sudo cat REMOTEFILE') 

故障排除

ps显示我的ssh进程已停止:

 STAT TIME COMMAND S+ 0:00.00 diff LOCALFILE /dev/fd/12 T 0:00.03 ssh -t host sudo cat REMOTEFILE 

在这一点上, ssh进程没有响应SIGTERM,上面的文件描述符不存在:

 ❯ ls -l /dev/fd total 0 crw--w---- 1 me tty 16, 2 Feb 23 17:36 0 crw--w---- 1 me tty 16, 2 Feb 23 17:36 1 crw--w---- 1 me tty 16, 2 Feb 23 17:36 2 dr--r--r-- 1 root wheel 0 Feb 23 09:33 4 

额外的笔记

我可以观察到任何时候在进程replace中使用ssh -t时的完全相同的行为,无论是否需要密码sudo (这表示我明白,如果没有input预期在远程主办)。

底线

我在这里使用diff作为示例,但是我的问题实际上是更一般的:是否有任何方法使用Bash 进程replace与SSH伪terminal分配?

您可以强制sudo使用-S选项从STDIN中获取密码,并按照这个超级用户权限进行操作 。 因此,语法diff LOCALFILE <(ssh host 'echo <password> | sudo -S cat REMOTEFILE')应该做你所需要的,而不需要伪terminal。