ProxyCommand에서 이러한 명령을 사용할 수 없는 이유는 무엇입니까?

ProxyCommand에서 이러한 명령을 사용할 수 없는 이유는 무엇입니까?

ProxyCommand어떻게 작동하는지 이해하려고 노력 중이에요

%> ssh -oProxyCommand='ls' root@ubuntu
ssh_exchange_identification: Connection closed by remote host

%> ssh -oProxyCommand='useradd' root@ubuntu
/bin/bash: line 0: exec: useradd: not found
ssh_exchange_identification: Connection closed by remote host

또한 다음과 같은 내장 명령을 시도했지만 env출력도 제공되지 않았습니다.

임의의 명령을 실행할 수 없는 이유에 대한 아이디어가 있습니까?

편집하다

유사한 명령을 실행할 수 있다는 것을 알고 있습니다 ssh host $command. ProxyCommand가 명령을 실행할 수 없는 이유를 알아내려고 노력 중입니다. 실제로 사람들이 반대하는 이유는 모르겠습니다.

답변1

ProxyCommand옵션은 원격 시스템에서 실행하기 위한 임의의 명령이 아닙니다.연기일부 데이터 흐름. ~에서매뉴얼 페이지ssh_config(강조하다):

프록시 명령

사용할 명령을 지정하십시오.서버에 연결. 명령 문자열은 행 끝까지 확장되며 쉘 프로세스 지연을 피하기 위해 사용자의 쉘 ​​'exec' 명령을 사용하여 실행됩니다.

명령 문자열에서 "%h"는 연결할 호스트 이름으로, "%p"는 포트로, "%r"은 원격 사용자 이름으로 대체됩니다. 명령은 기본적으로 무엇이든 될 수 있으며 표준 입력에서 읽고 표준 출력에 써야 합니다. 결국에는 일부 시스템에서 실행 중인 sshd(8) 서버에 연결하거나 어딘가에서 sshd -i를 수행해야 합니다..

ssh원격 시스템에서만 명령을 실행하려면 아래와 같이 명령줄 끝에 제공하십시오.

ssh root@ubuntu ls

답변2

귀하가 ProxyCommand지정했습니다아니요원격 호스트에서 실행됩니다. 원격 호스트(일반적으로 포트 22)에 대한 TCP 연결을 열기 위한 대체 연결 방법으로 로컬(클라이언트) 측에서 실행됩니다. 실행 중인 실행 파일은 소켓 자체 프록시를 통해 ProxyCommand로컬 SSH 클라이언트와 통신할 것으로 예상되지만 클라이언트의 관점에서 해당 동작은 실제 SSH 서버에 대한 TCP 세션을 바이트 단위로 대체하는 것으로 예상됩니다.stdoutstdinrecv()send()

일반적인 사용법 ProxyCommand은 한 서버를 통해 SSH 터널을 설정하여 보조 서버에 연결하는 것입니다. 그렇지 않으면 보조 서버가 직접 연결을 설정할 수 없습니다. 이는 소켓 측에서 netcatto 및 to 링크를 처리하는 (nc) 명령과 함께 ssh 클라이언트를 사용하여 달성할 수 있습니다.netcatstdoutsend()stdinrecv()

ProxyCommand설정되지 않은 항목을 호출 stdout하고 stdinSSH 프로토콜이 올바른 SSH 전송을 협상할 것으로 예상하는 것과 일치하는 경우 클라이언트는 다음 오류와 함께 종료됩니다 ssh_exchange_identification: Connection closed by remote host.

SSH 세션이 설정되고 인증된 후 실제로 원격 호스트에서 명령이 실행되기를 원하는 경우 이를 ssh 명령줄 끝에 포함하면( 없이 ProxyCommand) SSH 클라이언트가 원격 호스트에서 명령을 호출합니다. 대화형 쉘이 아닌 원격 호스트.

시도 ssh root@ubuntu ls해봐.

관련 정보