편집된 질문에:

편집된 질문에:

소켓 파일이 있으면 SSH는 연결을 재사용할 수 있습니다. 소켓을 생성하려면 다음을 사용합니다.

ssh -M -S /tmp/hello [email protected]

예를 들어, 이 소켓 파일을 사용하여 서버에서 명령을 실행하려면 다음을 수행하십시오.

ssh -S /tmp/hello example.com uname -a 

SSH는 사용할 때 host필드가 필요 -S /tmp/hello하지만 상관하지 않습니다. 다음은 동일한 효과를 갖습니다.

ssh -S /tmp/hello whocares uname -a

SSH에 호스트 이름이 필요하지만 신경 쓰지 않는 이유는 무엇입니까?

SSH의 이러한 동작(소켓 파일( )에 설명된 연결을 공유 /tmp/hello하고 모든 자격 증명을 무시함)은 내가 원하고 기대하는 것입니다. 하지만호스트 이름이 필요합니다조금 혼란 스럽습니다.

문제는 다음과 같이 이 명령을 사용하면 문제가 발생한다는 것입니다.

ssh -S /path/to/my-first-host.socket example.com .... # expect connecting first host
ssh -S /path/to/my-second-host.socket example.com .... # expect connecting second host
ssh -S /path/to/my-third-host.socket example.com .... # expect connecting third host

답변1

~/.ssh/config등을 통해 SSH 호스트 이름을 기반으로 추가 구성을 지정할 수 있습니다. /etc/ssh/ssh_config제어 소켓을 통해 연결할 때 호스트 이름 자체는 중요하지 않을 수 있지만 해당하는 경우 다음 옵션이 적용됩니다.

$ cat ~/.ssh/config
Host foo
    LocalForward 8080 localhost:9000
$ ssh -fMS /tmp/hello localhost sleep 1d
muru@localhost's password:
$ ssh -fS /tmp/hello foo sleep 1d & sudo lsof -i :8080
[1] 6971
[sudo] password for muru:
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
ssh     6859 muru    8u  IPv6 148286      0t0  TCP ip6-localhost:http-alt (LISTEN)
ssh     6859 muru    9u  IPv4 148287      0t0  TCP localhost:http-alt (LISTEN)

~/.ssh/config분명히 SSH는 제어 소켓을 사용하더라도 내가 지정한 포트 전달 규칙을 적용합니다 . 실제로 포트 전달은 소켓을 생성하는 프로세스에 의해 수행됩니다.

$ pgrep -fa hello
6859 ssh -fMS /tmp/hello localhost sleep 1d
6971 ssh -fS /tmp/hello foo sleep 1d

답변2

SSH에 호스트 이름이 필요하지만 신경 쓰지 않는 이유는 무엇입니까?

제어 소켓은 매뉴얼 페이지에 명시된 대로 연결하려는 호스트 이름을 기반으로 해야 하기 때문입니다 ssh_config.

ControlPath

위의 ControlMaster 섹션에 설명된 대로 연결 공유에 사용되는 제어 소켓의 경로를 지정하거나 문자열 none을 지정하여 연결 공유를 비활성화합니다. ControlPath에 대한 매개 변수는 물결표 구문을 사용하여 사용자의 홈 디렉터리 또는 TOKENS 섹션에 설명된 토큰을 참조할 수 있습니다. 기회적 연결 공유에 사용되는 ControlPath에는 최소한 %h, %p 및 %r(또는 %C)이 포함되는 것이 좋습니다.다른 사용자가 쓸 수 없는 디렉토리에 저장됩니다. *이렇게 하면 공유 연결이 고유하게 식별됩니다.

이러한 권장 사항을 따르지 않고 동일한 소켓을 사용하여 다른 호스트에 연결을 시도하는 경우, ssh작성된 호스트 이름에 관계없이 기존 소켓을 찾아서 사용하십시오.

편집된 질문에:

이 명령을 다음과 같이 사용하면 문제가 발생합니까?

ssh -S /path/to/my-first-host.socket example.com .... # expect connecting first host
ssh -S /path/to/my-second-host.socket example.com .... # expect connecting second host
ssh -S /path/to/my-third-host.socket example.com .... # expect connecting third host

예. 현재는 시행/사용되지 않지만 문서화되지 않거나 정의되지 않은 동작을 분명히 사용하고 있으며 이는 향후 버전에서 예고 없이 변경될 수 있습니다.

답변3

ssh -S매뉴얼 페이지의 섹션에 대해서는 매뉴얼 페이지의 ssh(5) 및 섹션을 참조하십시오 . ControlMaster차례로 다음과 같이 지적합니다.ControlPathssh_config

컨트롤 마스터 단일 네트워크 연결을 통해 여러 세션을 공유할 수 있습니다. [...] 이러한 세션은 새 네트워크 연결을 시작하는 대신 마스터 인스턴스의 네트워크 연결을 재사용하려고 시도합니다.그러나 제어 소켓이 존재하지 않거나 수신 대기 중이 아닌 경우에는 정상적인 연결이 복원됩니다.

요약하자면, ssh가능하다면 제어 소켓을 사용하고, 그렇지 않으면 일반 연결로 대체하십시오. 정상적인 연결을 위해서는 대상 호스트 이름이 필요합니다.

그런데 ControlPatha의 이름(템플릿)에는 적어도 대상 호스트 이름( %h)이 포함되어 있어야 서로 다른 대상 호스트가 서로 다른 제어 경로 값을 받을 수 있도록 하는 것이 좋습니다. 각 연결에 대해 임의로 다른 호스트 이름 값을 맹목적으로 사용하는 경우에는 이 조언을 적용할 수 없습니다.

관련 정보