![SSH 제어 소켓이 이미 존재하는 경우 어떻게 중단합니까?](https://linux55.com/image/171384/SSH%20%EC%A0%9C%EC%96%B4%20%EC%86%8C%EC%BC%93%EC%9D%B4%20%EC%9D%B4%EB%AF%B8%20%EC%A1%B4%EC%9E%AC%ED%95%98%EB%8A%94%20%EA%B2%BD%EC%9A%B0%20%EC%96%B4%EB%96%BB%EA%B2%8C%20%EC%A4%91%EB%8B%A8%ED%95%A9%EB%8B%88%EA%B9%8C%3F.png)
내 스크립트에서는 다음 줄을 사용합니다.
ssh -f -N -M -S <control socket> <host>
이는 초기 연결이 백그라운드에만 유지되며 후속 호출에 사용할 수 있음을 의미합니다 ssh
.
ssh -S <control socket> <host> <command>
그러나 동일한 제어 소켓을 사용하고 "백그라운드" 호출을 모든 스크립트에 넣어야 하는 명령이 포함된 여러 스크립트가 있는 경우 ssh
어느 시점에서 다음 메시지가 표시됩니다.
ControlSocket <control socket> already exists, disabling multiplexing
ssh
분명히 소켓이 존재하고 후속 명령에서 사용될 수 있기 때문에 이것은 스크립트의 나머지 부분에는 영향을 미치지 않습니다 . 그러나 "백그라운드" 세션이 소켓 열기에 실패하더라도 종료되지 않고 활성 상태로 유지됩니다. 단지 멀티플렉싱되지 않았을 뿐입니다.
[ -S
소켓이 존재하는지 확인 하거나 사용 ssh -O check
하면 여전히 경쟁 조건이 발생할 가능성이 남아 있습니다.
"제어 소켓이 아직 없으면 열고, 있으면 종료"하려면 어떻게 해야 합니까?
답변1
당신이 찾고 있는 것은 ControlMaster auto
구성 파일에 지정하거나 명령줄에서 직접 사용할 수 있다고 생각합니다 -o ControlMaster=auto
.
이를 통해 연결 열기 및 사용 명령을 통합할 수 있습니다(또한 매우 유용함 ControlPersist
).