하나의 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 표준 입력을 통해 모든 파일에 참여하고 전달하고 원격 세션에서 해당 파일을 받을 수 있습니다. 즉, 다음과 같습니다.

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 &

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

관련 정보