O SSH executa um comando shell. Ele concatena seus parâmetros com espaços intermediários e executa esse comando remotamente. Assim, quando você digita isso em seu shell local
ssh rundeck@nagios1 sudo su - root -c 'printf "Disable_Notification;web01;App:Tomcat:Log:webapp" >> /opt/nagios/nagios.cmd'
isto é o que é executado no shell remoto:
sudo su - root -c printf "Disable_Notification;web01;App:Tomcat:Log:webapp" >> /opt/nagios/nagios.cmd
Como você pode ver, o redirecionamento é aplicado no shell remoto externo chamado por sshd
, não no shell interno lançado por su
. Você precisa de uma camada adicional de cotação: uma para proteger caracteres especiais do shell local para que eles atinjam o shell remoto e outra para proteger caracteres especiais do shell remoto externo para que eles atinjam o shell remoto interno chamado por su
( mais um terço ao redor da corda para imprimir de modo que passe por aquela casca interna).
ssh rundeck@nagios1 'sudo su - root -c '\''printf "Disable_Notification;web01;App:Tomcat:Log:webapp" >> /opt/nagios/nagios.cmd'\'
Você pode fazer com um nível de cotação a menos fazendo a impressão em um shell não privilegiado e canalizando-o para um comando privilegiado (que não precisa ser um shell) que apenas grava no arquivo.
ssh rundeck@nagios1 'printf "Disable_Notification;web01;App:Tomcat:Log:webapp" | sudo tee /opt/nagios/nagios.cmd'
E você pode até fazer a impressão localmente, o que elimina outro nível de cotação necessária.
printf "Disable_Notification;web01;App:Tomcat:Log:webapp" | ssh rundeck@nagios1 sudo tee /opt/nagios/nagios.cmd
E, em vez de usar print … | …
, você pode usar uma string aqui (supondo que seu shell local seja ksh, bash ou zsh).
ssh rundeck@nagios1 sudo tee /opt/nagios/nagios.cmd <<<"Disable_Notification;web01;App:Tomcat:Log:webapp"