다음과 같은 간접 체인이 있습니다.
ssh -t root@host1 ssh host2 << EOF\nsu - user2 -c 'kill `cat ~/file_with_pid`'\nEOF
결국 필요한 것은 호스트 2의 프로세스를 user2로 종료하는 것입니다(파일에서 pid를 읽음). 작은따옴표 사이의 부분을 제외하고는 많이 변경할 수 없습니다.
'kill `cat ~/file_with_pid`'
그러므로 나는 단순히
ssh user2@host2 'kill `cat ~/file_with_pid`'
내 문제는 ~
파일 경로의 홈이 잘못된 홈으로 확장된다는 것입니다. 이것은 백틱이 평가될 때와 관련이 있을 수 있습니다(긴 명령 체인으로 인해 이것이 언제 발생하는지 잘 모르겠습니다).
원하는 것을 얻기 위해 작은따옴표로 묶인 부분을 어떻게 변경합니까?
host2
(참고: 사용자로서 어디서든 이 작업을 수행 할 수 있으므로 집을 하드코딩할 수 없으므로 '집'이 매번 결정되기를 user2
바랍니다 .)user2
답변1
-J
@pLumo가 제안한 것처럼 ssh의 ("JumpHost") 옵션을 사용하여 일부 참조 지옥에서 벗어날 수 있습니다.
ssh -J root@host1 root@host2 "su user2 -c 'kill \"\$(cat ~/file_with_pid)\"'"
또는 여기에 있는 설명서를 사용하세요.
ssh -J root@host1 -T root@host2 <<'EOT'
su user2 -c 'kill "$(cat ~/file_with_pid)"'
EOT
<<'EOT'
; 대신 닫는 태그를 사용 하면 <<EOT
이 문서에서 변수, 백틱 등이 확장되지 않습니다.
일반적으로 이는 -T
ssh가 pseudo-tty를 할당하는 것을 방지합니다. 이 경우 ssh가 pseudo-tty를 할당하지 않았다는 경고를 방지합니다. 어떤 이유로 의사 터미널이 정말로 필요한 경우 두 가지 -t
옵션을 사용하여 ssh가 하나를 할당하도록 강제합니다.현지의stdin은 tty가 아닙니다. exit
여기 문서에 하나를 추가하십시오 .
ssh -J root@host1 -tt root@host2 <<'EOT'
su user2 -c 'kill "$(cat ~/file_with_pid)"'
exit
EOT
점프 호스트에서 22번이 아닌 다른 포트에 연결해야 하는 경우 다음 형식 -J user@host1:port
을 사용해야 합니다 -p
.host2
ssh -J root@host1:port1 -p port2 root@host2 "su user2 -c 'kill \"\$(cat ~/file_with_pid)\"'"
점프 호스트에 대해 다른 ID를 사용할 수 있는 바로가기 옵션이 있는지 모르겠습니다(예: -i
). 이를 위해 구성 파일을 사용해야 하는 것 같습니다.
귀하의 예에서 EOF\nsu
인용되지 않은 것은 단지 EOFnsu
, not 입니다 EOF<newline>su
(그렇더라도 작동하지 않습니다).
그러나 표준 입력을 리디렉션하면 ssh
( <<
여기 문서에서와 같이) 두 번째 호스트에서 대화형 인증이 방지되므로 그래도 예제가 수정되지는 않습니다.