Bash 如何仅抑制在远程主机上执行的sudo的标准输出?
现在我想通过ssh在远程服务器上创建一个文件, 我想通过函数更改权限Bash 如何仅抑制在远程主机上执行的sudo的标准输出?,bash,ssh,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: fail
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
}
上面的函数是一个简化版本,echo for log就是一个例子。所以请不要在意细节
我的问题是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的消息
非常感谢。当SSH创建一个伪tty时,它将远程命令的所有输出合并到标准输出中。没有办法把它们分开 您应该能够通过使用
-S
标志运行sudo
来解决特定问题,使其使用标准错误和标准输入,而不是直接使用tty。然后,您可以在不使用伪tty的情况下运行ssh,并且可以避免记录sudo提示符,这将是标准错误。为了避免在键入密码时将密码回显到屏幕上,您可以将standard与read
命令绑定。像这样的方法应该会奏效:
ssh -q user@domain "sudo -S chmod 744 /home/user/test_file" < <(read -s && echo $REPLY)
ssh-quser@domain“sudo-S chmod 744/home/user/test_文件”<