Любое специальное разрешение ssh удаленная команда, работающая над файлом fifo (так называемый канал)?

Мне нужно перенаправить некоторые строки в файл fifo с удаленной командой ssh, но всегда получило разрешение, и я выполнил следующую команду:

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 в качестве пользователя rundeck с помощью команды sudo:

 sudo su - root -c 'printf "Disable_Notification;web01;App:Tomcat:Log:webapp" >> /opt/nagios/nagios.cmd' 

В nagios1 работает RHEL5, для SELinus установлено значение Permissive. Я не вижу никаких выходных данных журнала (сообщение и безопасность) во время выполнения команды удаленно.

SSH запускает команду оболочки. Он объединяет свои параметры с пробелами между ними и запускает их удаленно. Таким образом, когда вы вводите это в свою локальную оболочку

 ssh rundeck@nagios1 sudo su - root -c 'printf "Disable_Notification;web01;App:Tomcat:Log:webapp" >> /opt/nagios/nagios.cmd' 

это то, что выполняется в удаленной оболочке:

 sudo su - root -c printf "Disable_Notification;web01;App:Tomcat:Log:webapp" >> /opt/nagios/nagios.cmd 

Как вы можете видеть, перенаправление применяется во внешней удаленной оболочке, вызванной sshd , а не во внутреннюю оболочку, запущенную su . Вам нужен дополнительный уровень цитирования: один для защиты специальных символов от локальной оболочки, чтобы они попадали в удаленную оболочку, и один для защиты специальных символов из внешней удаленной оболочки, чтобы они достигли внутренней удаленной оболочки, вызванной su (плюс третий вокруг строки для печати, чтобы она проходила через эту внутреннюю оболочку).

 ssh rundeck@nagios1 'sudo su - root -c '\''printf "Disable_Notification;web01;App:Tomcat:Log:webapp" >> /opt/nagios/nagios.cmd'\' 

Вы можете сделать это с меньшим уровнем цитирования, выполнив печать в непривилегированной оболочке и передав ее в привилегированную команду (которая не обязательно должна быть оболочкой), которая просто записывает в файл.

 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 … | … print … | … вы можете использовать строку здесь (предполагая, что ваша локальная оболочка – ksh, bash или zsh).

 ssh rundeck@nagios1 sudo tee /opt/nagios/nagios.cmd <<<"Disable_Notification;web01;App:Tomcat:Log:webapp" 

Обратитесь к этому ответу в сочетании с некоторыми другими флагами sudo и ssh, чтобы выделить Pseudo TTY.

 ssh -t rundeck@nagios1 "sudo -u root sh -c 'printf \"Disable_Notification;web01;App:Tomcat:Log:webapp\" >> /opt/nagios/nagios.cmd'"