我的问题可以看作是
How do diff over ssh?的延伸而有点扭曲.
环境
macOS Sierra(10.12.3)
OpenSSH 7.3
示例情况
我试图在两个文件之间打印差异,其中一个位于远程主机上,需要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
额外的笔记
无论sudo是否需要密码,我都可以在进程替换中使用ssh -t时观察完全相同的行为(我知道如果遥控器上没有预期输入,则使用-t是有问题的主办).
底线
我在这里使用diff作为例子,但我的问题实际上更为通用:有没有办法将Bash process substitution和SSH伪终端分配一起使用?
您可以使用-S选项强制sudo从STDIN获取密码,每
this superuser post.因此语法 diff LOCALFILE<(ssh host'echo< password> | sudo -S cat REMOTEFILE’)应该做你需要的,而不需要伪终端.