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 명령을 사용하여 nagios1에 rundeck 사용자로 로그인하면 다음 명령을 성공적으로 실행할 수 있습니다.
sudo su - root -c 'printf "Disable_Notification;web01;App:Tomcat:Log:webapp" >> /opt/nagios/nagios.cmd'
nagios1은 RHEL5를 실행 중이고 SElinus는 Permissive로 설정되어 있습니다. 원격으로 명령을 실행할 때 로그 출력(메시지 및 보안)이 표시되지 않습니다.
답변1
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 … | …
대신 이 문자열을 사용할 수 있습니다(로컬 셸이 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'"