使用 Bash 进程替换时通过 ssh 提供 sudo 密码?

使用 Bash 进程替换时通过 ssh 提供 sudo 密码?

我的问题可以看作是如何通过 ssh 进行 diff?稍有曲折。

环境

macOS Sierra(10.12.3)
OpenSSH 7.3

示例情况

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

如果我的远程用户可读取此远程文件(或者我可以使用 sudo 标志执行该命令NOPASSWD),我只需执行:

diff LOCALFILE <(ssh host 'cat REMOTEFILE')

但是我确实需要进行身份验证才能执行远程命令,这意味着我必须分配一个伪终端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

补充说明

ssh -t无论是否需要密码,我都可以在进程替换中使用时观察到完全相同的行为(也就是说,如果远程主机上不需要输入,sudo我理解的使用是值得怀疑的)。-t

结论

我在这里使用diff作为示例,但我的问题实际上更为普遍:有没有办法使用 Bash流程替代配一个SSH伪终端吗?

答案1

你可以使用下面的选项强制 sudo 从 STDIN 获取密码-S这个超级用户帖子。因此语法 diff LOCALFILE <(ssh host 'echo <password> | sudo -S cat REMOTEFILE')应该可以满足您的需要,而不需要伪终端。

相关内容