使用Bash进程替换时,在ssh上提供sudo密码?

前端之家收集整理的这篇文章主要介绍了使用Bash进程替换时,在ssh上提供sudo密码?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我的问题可以看作是 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’)应该做你需要的,而不需要伪终端.

猜你在找的Bash相关文章