如何仅抑制在远程主机上执行的sudo的标准输出?

时间:2016-09-24 06:44:39

标签: bash ssh

现在我想通过ssh在远程服务器上创建一个文件, 我想通过函数更改权限

function dummy_function() {
  ssh user@domain "touch -p /home/user/test_dir"
  ssh -q -t user@domain "sudo chmod 744 /home/user/test_file"
  if [[ $? -eq 0 ]]; then
    echo "log: success"
  else
    echo "log: failure"
  fi
}

上面的函数是一个简化版本,日志的回声就是例如。所以请不要关心细节。

我的问题是sudo生成的提示与日志记录混合。

例如,上面的输出可以是

[sudo] password for user:
log: success    # or log: failure

我试过

ssh -q -t user@domain "sudo --prompt='' chmod 744 /home/user/test_file"

它抑制了sudo的提示但是当我输入密码失败时 日志消息已被污染,

Sorry, try again.
log: success    # or log: failure

似乎来自sudo的错误信息,对不起,再试一次,来自标准输出。  在sudo之后的命令通过标准输出提供一些消息的情况下,我不想关闭标准输出。我该怎么做才能在远程主机上仅抑制来自sudo的消息?

非常感谢。

1 个答案:

答案 0 :(得分:2)

当SSH创建伪tty时,它将远程命令的所有输出组合到标准输出中。没有办法将它们分开。

您应该能够通过使用sudo标志运行-S来解决您的具体问题,以使其使用标准错误和标准输入,而不是直接使用tty。然后你可以在没有伪tty的情况下运行ssh,你将能够避免记录sudo提示符,这将出现标准错误。为了避免在键入时将密码回显到屏幕,可以将标准绑定到read命令。这样的事情应该有效:

ssh -q user@domain "sudo -S chmod 744 /home/user/test_file" < <(read -s && echo $REPLY)

当然,read输入重定向只会让您在失败前正确输入密码。此外,它不会让任何其他命令访问标准输入。如果限制太多,那么您可能需要做一些更复杂的事情,可能是expect脚本。