【问题标题】:ssh sudo pipe commandssh sudo 管道命令
【发布时间】:2023-12-14 09:36:01
【问题描述】:

此命令有效

ssh -t www.foo.com 'sudo ls -l'

我立即被要求输入密码,一旦输入我就会得到目录内容

如果我尝试通过管道传输此命令,它会失败 - 我从来没有被问到我的密码,所以我从来没有得到任何内容。

ssh -t www.foo.com 'sudo ls -l' | grep 'foo'

这是一个基本示例,我知道我可以在“ls”命令中通过管道/grep 输出。对于我的应用程序,我需要通过主机上的程序来管道输出。

【问题讨论】:

  • 请澄清:在ssh -t www.foo.com 'sudo ls -l'中,输入密码时是ssh还是sudo? IE。 (1) ssh 使用 pubkey auth 并且不需要密码,但远程 sudo 需要密码;或相反:(2)使用基于密码的ssh,但远程系统允许无密码sudo
  • 对不起,密码是 sudo 命令的。 SSH 全部由 pubkey 密钥处理。
  • 谢谢。这缩小了问题的范围。有趣的问题。我正在努力寻找解决方案。

标签: linux bash shell ssh


【解决方案1】:
ssh -t www.foo.com 'echo your_pass | sudo -S ls -l' | grep 'foo'

【讨论】:

    【解决方案2】:

    也可以:

    ssh -t www.foo.com 'sudo -S ls -l <~/passwd.txt' | grep 'foo'
    

    【讨论】:

      【解决方案3】:

      为了在发出 sudo 命令时不被要求输入密码,您需要在 /etc/sudoers 中有一个条目(或者更好的是在 /etc/sudoers.d 中的一个文件),以便您执行此操作。关于使用 sudoers here 有一个很好的问题。

      允许您以 root 身份运行 ls 的 sudoers 配置可以是:

      <yourusername> ALL = (root) NOPASSWD: /bin/ls
      

      需要注意的一点是 ls 很可能是内置的 shell,因此您可能无法允许它。您应该能够将您的 shell 设置为遵循系统二进制文件。

      试图通过它推送您的真实密码不是一个安全的解决方案。

      【讨论】:

        【解决方案4】:

        您没有提示输入密码的原因是因为您将“ssh -t www.foo.com 'sudo ls -l'”的输出提供给您正在寻找“foo”的管道。所以在这种情况下不会显示密码提示,但实际上该过程正在等待您的输入。

        尝试在运行命令后得到的空白新行上输入密码。

        我试过了,效果很好。举个例子,

        $ ssh -t user@host 'sudo ls -l /' | grep '根' user@host's password:

        试试看它是否适合你。

        【讨论】: