对 fifo 文件(又名命名管道)有任何特殊权限的 ssh 远程命令吗?

对 fifo 文件(又名命名管道)有任何特殊权限的 ssh 远程命令吗?

我需要使用 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'"

相关内容