我需要用ssh远程命令将一些字符串重定向到fifo文件,但总是被拒绝权限,我执行的命令是:
ssh rundeck@nagios1 sudo su - root -c 'printf "Disable_Notification;web01;App:Tomcat:Log:webapp" >> /opt/nagios/nagios.cmd'
然后得到以下错误:
bash: /opt/nagios/nagios.cmd Permission denied
nagios.cmd的文件许可是:
prw-rw---- 1 nagios nagios 0 Mar 16 10:32 /opt/nagios/nagios.cmd
但是,在以运行库用户身份登录到nagios1时,我可以使用sudo命令成功执行该命令:
sudo su - root -c 'printf "Disable_Notification;web01;App:Tomcat:Log:webapp" >> /opt/nagios/nagios.cmd'
nagios1正在运行RHEL5,SELinus设置为允许性。在远程执行命令时,我看不到任何日志输出(消息和安全)。
发布于 2015-03-07 00:07:07
SSH运行shell命令。它将参数与中间的空格连接起来,并远程运行该命令。因此,当您在本地shell中键入此内容时
ssh rundeck@nagios1 sudo su - root -c 'printf "Disable_Notification;web01;App:Tomcat:Log:webapp" >> /opt/nagios/nagios.cmd'
这就是在远程shell中执行的内容:
sudo su - root -c printf "Disable_Notification;web01;App:Tomcat:Log:webapp" >> /opt/nagios/nagios.cmd
如您所见,重定向应用于由sshd
调用的外部远程shell,而不是应用于由su
启动的内部shell中。您需要一个额外的引用层:一个用于保护特殊字符不受本地shell的影响,从而使它们能够到达远程shell;另一个用于保护来自外部远程外壳的特殊字符,以使它们到达su
调用的内部远程shell (加上围绕字符串打印的第三个字符以使其通过该内部shell)。
ssh rundeck@nagios1 'sudo su - root -c '\''printf "Disable_Notification;web01;App:Tomcat:Log:webapp" >> /opt/nagios/nagios.cmd'\'
您可以通过在非特权shell中执行打印并将其传递到只写入文件的特权命令(不需要是shell)来进行少一级引用。
ssh rundeck@nagios1 'printf "Disable_Notification;web01;App:Tomcat:Log:webapp" | sudo tee /opt/nagios/nagios.cmd'
您甚至可以在本地进行打印,这就消除了另一种必要的引用。
printf "Disable_Notification;web01;App:Tomcat:Log:webapp" | ssh rundeck@nagios1 sudo tee /opt/nagios/nagios.cmd
而不是使用print … | …
,您可以使用这里的字符串(假设本地shell是ksh、bash或zsh)。
ssh rundeck@nagios1 sudo tee /opt/nagios/nagios.cmd <<<"Disable_Notification;web01;App:Tomcat:Log:webapp"
发布于 2015-03-06 14:32:20
参考这个答案,结合一些其他sudo和ssh标志来分配伪TTY。
ssh -t rundeck@nagios1 "sudo -u root sh -c 'printf \"Disable_Notification;web01;App:Tomcat:Log:webapp\" >> /opt/nagios/nagios.cmd'"
https://unix.stackexchange.com/questions/188567
复制相似问题