现在我想通过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的消息?
非常感谢。
答案 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
脚本。