한 세션에서 SSH를 복사하고 명령을 실행합니다.

한 세션에서 SSH를 복사하고 명령을 실행합니다.

중복 가능성:
설정된 SSH 채널 사용

이것은 내 동기화 스크립트입니다.

ssh [email protected] /etc/init.d/some_service stop
scp [email protected]:/var/some_service/events ./events
scp ./new_data [email protected]:/var/some_service/new_data
ssh [email protected] /etc/init.d/some_service start

보시다시피 서비스를 중지하고 scp를 사용하여 일부 복사를 수행한 다음 서비스를 다시 시작합니다.

문제는 4개의 "유사한" SSH 연결을 연속적으로 "소비"한다는 것입니다.

하나의 물리적 SSH 연결을 사용하여 모든 작업을 수행할 수 있는 방법이 있습니까?

답변1

SSH 연결 공유 사용을 고려할 수 있습니다.

Host *.some-domain
ControlMaster auto
ControlPath ~/.ssh/master-%r@%h:%p

대상에 한 번만 연결하고 SSH 프로세스를 백그라운드에 두기만 하면 됩니다. 그런 다음 다른 명령을 실행하고 마지막으로 첫 번째 프로세스를 종료합니다.

또는 SSH 연결에서 여러 작업을 캡슐화해 볼 수도 있습니다.

예를 들어 다음과 같은 디렉터리가 있다고 가정해 보겠습니다.

 mycommands
 |
 +- run
 +- new_data

그런 다음 이 데이터를 tar로 패키징하여 스크립트로 보낼 수 있습니다.

tar cf - -C mycommands . | ssh localhost 'D=`mktemp -d`; tar xf - -C $D; $D/run'

이제 run스크립트는 모든 입력 데이터에 액세스할 수 있습니다(여기에는 new_data예제의 데이터만 있습니다). 귀하의 예를 고수하기 위해 run스크립트는 다음과 같습니다.

#!/bin/sh
BASE=`dirname $0`

/etc/init.d/some_service stop
cat /var/some_service/events

mv $BASE/new_data /var/some_service/new_data
/etc/init.d/some_service start

rm -rf $BASE

이제 파일을 저장하면 됩니다 events.

tar cf - -C mycommands . | ssh localhost 'D=`mktemp -d`; tar xf - -C $D; $D/run' >./events

보다 일반적으로는 run스크립트가 tar를 생성한 다음 sshtar를 파이프하여 로컬에서 압축을 풀도록 할 수 있습니다.

답변2

이 논리를 대상 서버에서 실행되는 스크립트로 옮긴 다음 단일 SSH 명령을 사용하여 실행할 수 있습니다. 아마도 이것은 이상적이지 않을 것입니다. 그렇지 않으면 그렇게했을 것입니다 :)

SSH 마스터 연결을 사용하면 새 SSH 연결을 여는 비용을 줄일 수 있습니다. 이는 첫 번째 SSH 명령이 평소와 같이 새로운 연결을 열 것임을 의미합니다. 동일한 서버에 대한 후속 연결에서는 이 기존 연결을 재사용하여 세 개의 추가 연결을 만드는 오버헤드를 절약합니다.

설정에 대한 좋은 가이드는 다음과 같습니다.http://www.linuxjournal.com/content/speed-multiple-ssh-connections-same-server

답변3

이는 로컬 서버가 원격 서버를 신뢰하여 비밀번호 없이 명령을 실행한다고 가정합니다. 그렇지 않으면 헤드리스 연결을 실행하고 입력을 제공할 수 없기 때문에 작동하지 않습니다.

ssh remoteserver "/etc/init.d/some_service stop; scp /var/some_service/events localhost:${PWD}/events; scp localserver:${PWD}/new_data /var/some_service/new_data; /etc/init.d/some_service start"

위의 모든 코드는 터미널에서 하나의 연속된 줄에 있어야 합니다. 또는 스크립트 내에서 실행하는 경우 이 모두는 줄 바꿈으로 구분되지 않고 하나의 명령이어야 합니다.

원격 서버에서 로컬 서버까지 신뢰할 수 있는 키 쌍이 있는 경우 이것이 작동하지 않는 이유가 없습니다.

관련 정보