我的问题可以看作是如何通过 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')
应该可以满足您的需要,而不需要伪终端。