SSH를 통해 명령을 실행하고 연결을 열어 두는 방법은 무엇입니까?

SSH를 통해 명령을 실행하고 연결을 열어 두는 방법은 무엇입니까?

내가 달릴 때

FOO=$(ssh -L 40000:localhost:40000 [email protected] cat /foo)

콘텐츠를 얻었 /foo으나 연결이 끊어졌습니다.

내가 원하는 것은 어떻게든 콘텐츠를 가져오고 /foo포트 40000이 여전히 동일한 서버로 전달되도록 연결을 열어 두는 것입니다. 가능합니까?

이렇게 두 개의 SSH 연결을 발행해 보는 것이 어떨까요?

FOO=$(ssh [email protected] cat /foo)
ssh -L 40000:localhost:40000 [email protected] -f -N

내 경우에는 이렇게 할 수 없는 이유는 ip( 1.2.3.4)가 여러 임의의 백엔드로 연결을 전달하는 로드 밸런서이기 때문입니다. SSH를 통해 다른 컴퓨터에 연결할 때마다 1.2.3.4콘텐츠 /foo는 컴퓨터마다 다릅니다. 또한 전달된 포트(40000)를 통해 보내는 데이터는 /foo.A 컴퓨터의 콘텐츠를 스크랩한 /foo다음 포트 40000을 통해 B 컴퓨터로 데이터를 보내면 작동하지 않습니다.

답변1

설명하는 내용을 SSH 멀티플렉싱이라고 합니다.

DevOps 설정에서 이 설정을 사용하여 모든 가상 머신에 대한 연결을 캐시합니다.

이렇게 하면 모든 새 명령에서 전체 SSH 연결을 재협상하고 사용자를 인증할 필요 없이 최대 30분 동안 동일한 연결을 재사용/캐시할 수 있습니다.

VM/서버에 (여러) 명령을 지속적으로 보내면 속도가 엄청나게 향상됩니다.

설정은 클라이언트 측에서 수행되며, 30분 캐시의 경우 /etc/ssh/ssh_config다음과 같이 설정을 수행할 수 있습니다.

ControlPath ~/.ssh/cm-%r@%h:%p
  ControlMaster auto
  ControlPersist 30m

MaxSessions매개변수는 ssh_config동시에 연결이 허용되는 다중화 연결 수를 정의합니다. 기본값은 10입니다. 더 많은 연결을 동시에 캐시해야 하는 경우 이를 변경해야 할 수도 있습니다.

예를 들어, 최대 20개의 캐시된 연결의 경우:

MaxSessions 20

자세한 내용은 다음을 참조하세요.OpenSSH/요리책/멀티플렉싱

SSH 멀티플렉싱의 장점은 새로운 TCP 연결을 생성하는 오버헤드를 제거한다는 것입니다.
...
두 번째 및 후속 연결은 각각의 새 SSH 연결에 대해 새 TCP 연결을 생성할 필요 없이 설정된 TCP 연결을 반복해서 재사용합니다.

또한보십시오SSH 멀티플렉싱 사용

SSH 멀티플렉싱은 단일 TCP 연결을 통해 여러 SSH 세션을 호스팅하는 기능입니다.

멀티플렉싱을 사용하지 않으면 SSH 클라이언트는 이 명령을 실행할 때마다 원격 호스트와의 새 TCP 연결 및 새 SSH 세션을 설정해야 합니다. 멀티플렉싱을 사용하면 특정 기간 동안 활성 상태로 유지되는 단일 TCP 연결을 설정하고 해당 연결을 통해 SSH 세션을 설정하도록 SSH를 구성할 수 있습니다. 이로 인해 원격 SSH 호스트에 대해 명령을 반복적으로 실행할 때 속도가 증가할 수 있습니다.

마지막으로, 멀티플렉싱은 클라이언트와 서버 간의 TCP 연결을 열어두기 때문에 캐시가 켜져 있거나 활성 상태인 한 로드 밸런서에 있는 동일한 시스템과의 통신이 보장됩니다.

답변2

이를 수행하는 방법은 여러 가지가 있습니다. 시도해 볼 수 있는 방법은 다음과 같습니다.

 ssh -fT -L 40000:localhost:40000 [email protected] 'sleep 60'
 FOO=$(ssh root@localhost -p 40000 cat /foo)

잠시 쉬었다가 계속하세요...

여기서 -f는 이를 백그라운드로 두고 -T는 tty 할당을 비활성화합니다. sleep 명령을 사용하여 세션을 60초 동안 활성 상태로 유지하고 세션이 자체적으로 종료되도록 허용합니다. 이는 수정되거나 보상될 수 있습니다.

예를 들어, 간단한 접근 방식은 /tmp/a.txt 파일을 볼 때까지 세션을 활성 상태로 유지하고 작업이 완료되면 파일을 생성하면 while 루프가 이를 확인하고 clean rm /tmp/a를 실행하는 것입니다. txt를 입력하고 세션을 종료합니다.

ssh -fT -L 40000:localhost:40000 [email protected] 'while [[ ! -f /tmp/a.txt ]] ; do sleep 2 ; done ; rm /tmp/a.txt'
FOO=$(ssh root@localhost -p 40000 cat /foo)
do you work..
ssh root@localhost -p 40000 touch /tmp/a.txt

자신에게 더 적합한 다른 조건을 사용하여 생명을 유지할 수 있습니다.

답변3

쉬운 방법은 이것을 .ssh/config에 추가하는 것입니다:

Host someUserFriendlyName
  HostName 1.2.3.4
  User root
  LocalForward 40000 localhost:40000
  RequestTTY yes
  RemoteCommand cat /foo;bash -l

그러면 ssh someUserFriendlyName 실행하는데 문제가 없을 것입니다.

답변4

나는 사용한다sshpass

로컬 컴퓨터의 패키지 관리자를 사용하여 설치하십시오.

그런 다음 실행

sshpass -p 'YOUR_SSH_PASSWORD' [email protected] 'YOUR-COMMAND' 

관련 정보