중간 호스트를 통한 scp 파일


85

A, B 및 C의 3 대 컴퓨터에 액세스 할 수 있습니다. 가능한 유일한 (ssh) 연결은 다음과 같습니다.

A -> B
B <-> C

파일을 A에서 C로 가져와야하므로 파일을 A에서 B로 scp 한 다음 B에서 C로 scp 할 수 있습니다. 그러나 B의 디스크 공간이 충분하지 않으므로이 옵션이 아닙니다. B를 통해 A에서 C로 파일을 scp하는 방법이 있습니까? 참고로, 어떤 컴퓨터에서도 루트 액세스 권한이 없으므로 영구 터널을 설정할 수 있다고 생각하지 않지만 틀린 경우 수정하십시오!


6
나는 이것이 질문에 대답하지 않는다는 것을 알고 있지만 rsync에 대해 알지 못하거나 호스트를 홉하는 데 그것을 사용하는 방법을 모른다면 유용한 팁이 될 수 있습니다 : '-e'옵션 사용 이 rsync와 함께 :A$ rsync <options> -e 'ssh B ssh' source C:destination
Eddified

답변:


108

ProxyJump

OpenSSH 7.3의 새로운 기능 :

A$ scp -oProxyJump=B thefile C:destination

(내부적으로 이것은 단지 ProxyCommand 및 사용 ssh -W.)

ProxyCommand

다른 답변에서 -W를 포함하도록 업데이트되었습니다.

A$ scp -oProxyCommand="ssh -W %h:%p B" thefile C:destination

A에 아주 오래된 SSH 클라이언트가 설치되어 -W있거나 ( 지원 없이 ) B가 TCP 전달을 허용하지 않도록 구성되어 있지만 (쉘 명령은 허용) 다른 방법을 사용하십시오.

A$ scp -oProxyCommand="ssh B socat stdio tcp:%h:%p" thefile C:destination
A$ scp -oProxyCommand="ssh B nc %h %p" thefile C:destination

파이프

A$ tar cf - thefile anotherfile | ssh B "ssh C \"cd destination && tar xvf -\""
A$ (echo thefile; echo anotherfile) | cpio -o | ssh B "ssh C \"cd destination && cpio -i\""

하나의 파일 만 :

A$ ssh B "ssh C \"cd destination && cat > thefile\"" < thefile

B를 통한 "터널"

A$ ssh -f -N -L 4567:C:22 B
(continues running in background)

A$ scp -P 4567 thefile localhost:destinationPath

완료되면 이전에 시작한 ssh프로세스 (으로 인해 백그라운드로 떨어짐)를 종료하는 것을 잊지 마십시오 -f -N.

  • -fssh에게 명령 실행 직전에 백그라운드로 이동하도록 요청합니다. 이것은 ssh가 비밀번호 나 비밀번호 문구를 요구할 때 유용하지만 사용자는 백그라운드에서 비밀번호를 원합니다. 이것은 -n을 의미합니다.
  • -N원격 명령을 실행하지 마십시오. 포트를 전달하는 데 유용합니다.

B를 통해 A로 "터널"반전

그래도 항상 작동하지는 않습니다.

A$ ssh -f -N -R 4567:localhost:22 B
(now you can reach A from B, by using localhost:4567)

B$ scp -P 4567 localhost:thefile C:destination
  • -R 원격 (서버) 호스트의 지정된 TCP 포트 또는 Unix 소켓에 대한 연결이 로컬의 지정된 호스트 및 포트 또는 Unix 소켓으로 전달되도록 지정합니다.

이 예제 @grawity에 대해 대단히 감사합니다. 한 가지 질문-`tar c 파일을 다른 파일로 뒤집을 수 있습니까? C에서 A로 다운로드를 복사하기위한 ssh B "ssh C \"cd destination && tar xv \ ""´
dmeu

@dmeu : 예, 가능합니다.
grawity

MacOS를 사용한다고 말하면 이전에 시작한 ssh 프로세스를 "kill"하는 방법은 무엇입니까?
에어로 윈드 워커

참고 : 평소처럼, 당신이하려는 경우 scp 에서 C, 비록 B, A, 당신이 할 수 있습니다 A$ scp -oProxyJump=B C:destination thefile.
jvriesem

@Pablo -S를 사용한 다음 -O를 사용하는 것이 좋습니다. 아니면 ... 적어도 pkill -f.
grawity

24

2011 년 초 이후의 scp 버전에는 "-3"옵션이있을 수 있습니다.

 -3      Copies between two remote hosts are transferred through the local
         host.  Without this option the data is copied directly between
         the two remote hosts.  Note that this option disables the
         progress meter.

이것을 가지고 있다면 다음을 실행할 수 있습니다.

B$ scp -3 A:file C:file

필자의 경우 호스트 A는 B (VPN을 통해)에서만 액세스 할 수있었습니다. 호스트 C는 B와 동일한 LAN에있었습니다. 파일을 A에서 C로 가져 오려고했고 scp -3이 훌륭하게 해결했습니다.
Joe

두 호스트 모두 암호를 요청할 때 문제가 발생했습니다. 한 번에 두 줄을 요청하는 것처럼 보이며 (두 줄의 암호 프롬프트가 같은 줄에 나타남) 내 암호를 수락하지 못했습니다. 결국 암호를 반복적으로 입력하여 (두 호스트에서 동일한 암호) 작동하도록 할 수는 있지만 알아 내기는 어려웠습니다.
Colin D

8

거의 모든 이미 내 마지막 페니는 여기에 말했지만되었습니다 나는없이 ProxyCommand 변형을 사용 nc하거나 soc. OpenSSH 프록시와 Jumphost Cookbook을 기반으로 다음 구성을 만들었습니다.

  1. 그래서 우리는 다음과 같은 선수를 가지고 있습니다 :

    • HOME_HOST : 파일을 대상 호스트로 복사하는 곳
    • HOP_HOST : 이 호스트를 통해 복사 합니다 (HOP_USER로 기록됨)
    • TARGET_HOST : 목적지입니다 (TARGET_USER로 인증 됨)
  2. 우선 내 고향 호스트에서 내 로컬 공개 키를 추가 .ssh/id_dsa.pub.ssh/authorized_keys두 홉 및 대상 호스트의. 예, 홈 호스트와 두 호스트 모두 동일한 공개 키입니다. 일반적으로 TARGET 키에 추가해야하는 HOP 공개 키일 것으로 예상됩니다.

  3. 그런 .ssh/config다음 다음 항목을 추가하여 조금 조정 했습니다.

    Host TARGET_HOST
       User TARGET_USER
       ProxyCommand ssh -W %h:%p HOP_USER@HOP_HOST
    
  4. 그 후 복사 작업은 다음과 같이 간단합니다 scp FILE TARGET_HOST:. 홉과 대상 노드 모두에서 이중 배너를 표시하지만 작동합니다.

물론 위의 내용을 사용하여 대상에 직접 ssh 할 수도 있습니다 ssh TARGET_HOST. scp 및 ssh와 함께 작동합니다.

또 다른 일반적인 옵션은 일종의 투명한 프록시 인 sshuttle 유틸리티 일 수 있습니다 (vpn over ssh). 따라서 A-> B <-> C의 경우 C 네트워크의 각 노드에 연결할 수 있습니다 : A-> B- [CDEFG]. 관리자가 필요하지는 않지만 Python 2.7 (3.5도 OK)이 필요합니다. 항상 우리가 가진 것은 아닙니다. 시도해 볼 가치가 있습니다.


7
ssh -L 4321:hostC:22 youruser@hostB

다른 껍질에서 :

scp -P 4321 localfile youruser@127.0.0.1

포트 포워딩을 사용하고 있습니다. 여기서 유일한 제한 사항은 포트 전달을 허용하도록 호스트 B를 구성해야한다는 것입니다. 그렇지 않으면 이것은 잘 작동합니다.

설명의 방법에서 -L-R당신이 포트를 전달 할 수 있습니다. 에서 -L주어진 첫 번째 포트는 포트 SSH는 원래 컴퓨터 (호스트 A)에서 수신 시작됩니다, 그리고 그것이 B를 호스트하기 위해 SSH 연결을 통해 해당 포트에서 수신 아무것도 포트 22에 C를 호스팅 할 다음 경로를 전달할 수 있습니다.

편집하다

구문을 약간 엉망으로 만들었습니다. LOCAL 시스템에 전달을 설정합니다.


@astrofrog-우리의 답변 중 하나가 귀하의 요구를 충족시키는 경우 그 중 하나를 수락해야합니다.
브라이언 반덴버그

2

Grawity의 ProxyCommand 답변은 저에게 효과적이지만 SSH에 익숙하지 않기 때문에 약간의 실험이 필요했습니다. Grawity의 답변을 더 자세히 설명하여 다른 초보자가 나처럼 SSH를 도울 수 있다고 생각했습니다. 보다 명확한 표기법에 대한 정의는 다음과 같습니다.

머신 A : 현재 사용중인 머신

서버 B : userB@ip.address.for.B (점프 호스트 또는 중간 서버)

서버 C : userC@ip.address.for.C (복사하려는 원격 서버)

ProxyCommnad

    A$ scp -oProxyCommand="ssh -W %h:%p userB@ip.address.for.B" thefile userC@ip.address.for.C:destination

구체적인 예

구체적인 예를 들어, (서버 C) 0.0.1.2라는 사용자 계정 으로 IP를 가진 서버에 액세스 할 수 있다고 가정하십시오 bar. 그러나이를 위해서는 먼저 0.0.1.1사용자 서버 이름이 foo(서버 B) 인 IP 로 서버에 로그인해야합니다 . 이제 baz.txt현재 머신 (Machine A)에있는 파일을 서버 0.0.1.2/home/bar/디렉토리 로 복사하려고합니다 . 이 예제 에서 위의 ProxyCommand 를 사용하려면 다음을 실행하십시오.

    A$ scp -oProxyCommand="ssh -W %h:%p foo@0.0.1.1" baz.txt bar@0.0.1.2:/home/bar/

파일과 대상의 순서를 전환하여 서버 C에서 파일을 쉽게 복사 할 수도 있습니다. 예를 들어 baz.txt이미 서버 0.0.1.2에있는 경우 /home/bar/다음을 사용하여 컴퓨터에 복사 할 수 있습니다.

    A$ scp -oProxyCommand="ssh -W %h:%p foo@0.0.1.1" bar@0.0.1.2:/home/bar/baz.txt /destination/path/on/A

희망이 필요한 사람들이 다른 사람들보다 조금 더 도움이되기를 바랍니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.