하나의 SSH 세션에서 SSH와 scp를 결합합니다.

하나의 SSH 세션에서 SSH와 scp를 결합합니다.

다음과 같은 스크립트가 있습니다.

ssh host command1
scp file1 host:/tmp
ssh host command2

그것들을 모두 하나의 호출로 결합하는 방법이 있습니까 ssh/scp? 내가 겪고 있는 문제는 파일 복사와 명령 실행을 결합하는 것입니다. 이 작업은 시차를 두고 수행해야 합니다. 다음과 같은 것을 바랐습니다.

ssh_sometool host -c command1 -cp file1 /tmp -c command2

이것은 구문과는 아무 관련이 없지만(이와 같은 함수를 작성할 수 있습니다) ssh동일한 세션에서 발생하는 모든 것

답변1

첫째, 원하는 작업을 수행하는 직접적이거나 표준적인 방법이 없습니다. 또한 명확하게 설명하겠습니다.기본 SSH 클라이언트로는 원하는 작업을 수행할 수 있는 방법이 없습니다..

아주 오래된 포크가 있어요SSH-xfer. 이 도구의 개발자조차도 자신의 솔루션이 "해킹적"이고 매우 오래되었으므로 사용해서는 안 된다고 강조합니다. 이 도구와 함께 사용하기 위해 패치된 최신 SSH 버전은 OpenSSH-3.8.1p1(Arch Linux의 경우 현재 버전은 OpenSSH_7.6p1)입니다.

작업 속도를 높이고 호스트 간의 연결/핸드셰이크 수를 줄이는 것이 중요하다면 일종의 구성/조정 도구를 고려할 수 있습니다.안시푸르많은 추가 구성 없이 작업을 수행하는 가장 쉬운 방법인 것 같습니다.소금아마도 가장 빠른 것 같습니다.

그럼에도 불구하고 Ansible과 Salt는 모두 추가 연결을 활용하여 작업을 수행하며 ssh/scp 콤보 대신 이를 사용하여 성능상의 이점을 얻을 수 있을지 확신할 수 없습니다.

업데이트: 많은 파일을 푸시 및 풀해야 하고 해당 전송 사이에 몇 가지 추가 스크립트를 실행해야 하는 경우 거의 모든 프로비저닝 도구(Chef, Puppet, Salt, Ansible)가 일반 ssh/scp보다 더 빠르게 작업을 수행합니다.

답변2

SSH를 사용하면 연결이 끊어진 후에도 일정 기간 동안 세션이 유지되므로 다음에 연결을 시작할 필요가 없습니다. 이를 활성화하는 SSH 구성 옵션은 다음과 같습니다.

Host *
ControlMaster auto
ControlPath ~/.ssh/sockets/%r@%h-%p
ControlPersist 30

ControlMaster단일 네트워크 연결을 통해 여러 세션을 공유할 수 있습니다. 로 설정하면 auto각각의 새로운 시도는 해당 연결이 존재하는지 확인하고 이를 사용하거나 새 연결을 생성합니다.

ControlPath연결이 저장되는 경로를 지정합니다.경로가 존재하는지 확인하세요!즉, 디렉토리를 생성합니다(소켓여기에 있지만 원하는 경우 수동으로 이름을 지정할 수 있습니다).

ControlPersist연결 해제 후 연결 기간을 지정합니다. 시간은 초 단위로 허용됩니다.

옵션을 추가로 지정하려면 를 사용하십시오 man ssh_config.

이를 추가하면 ~/.ssh/config이 세 가지 명령에 대해 하나의 세션만 열립니다.

내 컴퓨터에서는 5배의 속도 향상을 제공합니다. 일부 (근처) 호스트에 대한 100개의 연속 연결은 지속적인 세션 없이 30초 안에 작동하는 반면, 해당 호스트에 대한 연결은 5-6초밖에 걸리지 않습니다.

PS 때로는(예: 네트워크를 변경하는 경우) 연결이 포함된 파일이 존재하기 때문에 기존 SSH 연결이 끊어지고 새 연결이 설정되지 않습니다. 이 경우 ~/.ssh/sockets필요한 파일을 수동으로 삭제하면 됩니다.

답변3

SSH stdin을 통해 모든 파일을 참여하고 전달하고 원격 세션에서 받을 수 있습니다. 즉, 다음과 같습니다.

tar -cf - file1 file2 | ssh host 'TDIR=`mktemp -d`; tar -xf - -C "$TDIR"; cat "$TDIR/file1"; command1; command2 ...'


  • cat "$TDIR/file1"명령은 수신된 파일에 액세스하는 방법의 예일 뿐입니다.
  • 압축 파일을 전달하려면 로컬 및 원격 측에서 -j 또는 -J 스위치와 함께 tar를 사용하십시오.
  • 모든 명령을 bash 스크립트에 넣고 아카이브에 포함시킨 후 원격 측에서 실행할 수 있습니다....tar -xf - -C "$TDIR"; bash "$TDIR/script.sh"'

답변4

스크립트에서 첫 번째 줄이 실행되면...

ssh host command1

실행은 ssh로 넘겨지며 두 번째 명령(scp)은 command1이 완료될 때만 실행됩니다. 이러한 작업을 병렬로 실행하는 한 가지 방법은 다음과 같이 각 작업을 백그라운드에서 실행하는 것입니다.

ssh host command1 &
scp file1 host:/tmp &
ssh host command2 &

이제 세 가지 작업이 모두 백그라운드에서 동시에 실행됩니다.

관련 정보