我需要使用 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
但是,当我使用 sudo 命令以 rundeck 用户身份登录到 nagios1 时,我可以成功执行此命令:
sudo su - root -c 'printf "Disable_Notification;web01;App:Tomcat:Log:webapp" >> /opt/nagios/nagios.cmd'
nagios1 运行的是 RHEL5,SElinus 设置为 Permissive。远程执行命令时我没有看到任何日志输出(消息和安全)。
答案1
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
正如您所看到的,重定向应用于由 调用的外部远程 shell sshd
,而不是由 启动的内部 shell su
。您需要一层额外的引用:一层用于保护本地 shell 中的特殊字符,以便它们到达远程 shell,一层用于保护外部远程 shell 中的特殊字符,以便它们到达由su
(加上第三个围绕要打印的字符串,以便它穿过内壳)。
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"
答案2
参考这个答案,结合其他一些 sudo 和 ssh 标志来分配伪 TTY。
ssh -t rundeck@nagios1 "sudo -u root sh -c 'printf \"Disable_Notification;web01;App:Tomcat:Log:webapp\" >> /opt/nagios/nagios.cmd'"