멀티 홉 SCP 전송은 어떻게합니까?


85

컴퓨터 A에서 서버 C로 파일을 복사하고 싶지만 서버 B를 통해 서버 C에만 액세스 할 수 있습니다.

먼저 서버 B로 전송하고 로그인 한 다음 서버 C로 전송하는 대신 SCP 나 유사한 프로그램으로 파일을 직접 전송할 수 있습니까?

(Emacs tramp-mode에는 파일을 원격으로 편집하기위한이 기능이 있습니다).

답변:


48

대신에 -o옵션을 추가 할 수 있습니다 .scp.ssh/config

scp -o ProxyCommand="ssh $jump_host nc $host 22" $local_path $host:$destination_path

$jump_host 이 경우 귀하의 "서버 B"입니다.


이 방법을 선호하는 방법입니다. 게이트웨이에서 직접 동일한 호스트에 액세스하는 경우 멀티 호핑을 위해 .ssh / config를 엉망으로 만드는 것이 최선의 솔루션이 아닙니다.
GabrieleV

다른 사용자 정의 사용자 이름 및 포트를 사용하는 방법은 무엇입니까?
Pablo A

나는 이것을 시도하고 암호를 입력해야합니다. 이 문제를 어떻게 해결할 수 있습니까? 감사.
hqt

44

OpenSSH를 가정하고 .ssh / config의 SSH 구성에 추가하십시오.

Host distant
ProxyCommand ssh near nc distant 22

이로 인해 SSH는 near라는 시스템을 통해 프록시하여 distant라는 시스템에 "직접"연결할 수 있습니다. 그런 다음 scp 및 sftp와 같은 응용 프로그램을 원격 시스템에 사용할 수 있습니다.

이것이 작동하려면 근처에있는 컴퓨터에 'nc'일명 netcat이 설치되어 있어야합니다. 그러나 많은 현대 시스템에는 이미 있습니다.

타르의 구문과 작동 규칙을 기억한다고 가정하면 towo의 타르 솔루션은 원샷 문제에 더 효과적입니다.


이것은 내가 사용하는 것과 같은 방법입니다 ...이 예에서 'distant'는 서버 C가되고 'near'는 설명을 위해 서버 B가됩니다 ...
Jeremy Bouse

많은 최신 머신에는 'nc'가 없습니다. 일반적으로 Linux 머신에서만 사용할 수 있으며 요청에 의해서만 사용할 수 있습니다 (표준 설치의 일부는 아님).
Mei

1
SSH는 자동으로 'NC'없이이 작업을 수행 지금 -W 옵션을 가지고,하지만 난 -W가 scp를 않는 이유를 궁금해
kubanczyk

3
내가 유일하게 명확하지 않은 경우를 대비하여 사용자 이름이 사용자 이름과 near다른 distant경우 가까운 사용자가로 이동 ProxyCommand ssh nearuser@near...하고 먼 사용자가 별도의 User distantuser줄을 입력합니다.
Mu Mind

그냥 ssh multi hope를 입력하고 Google을 누르십시오. 운이 좋은 느낌입니다
chandank

19

(B) 시스템 근처의 서버에서 최신 버전의 ssh를 사용하면 netcat없이 다음이 작동합니다.

Host distant
    ProxyCommand ssh near -W distant:22

그러나 가까운 (B) 시스템에서 AllowTcpForwarding이 yes (기본값) 여야합니다.

편집 : B에서 OpenSSH 5.4 이상 필요


매력처럼 작동 :)
gongzhitaao

1
그리고 OpenSSH 7.4p1부터는 최소한 "ProxyJump"명령이 있는데 여기에는 각 user @ host : port 만 쉼표로 구분하여 나열하면됩니다. 좋은!
hmijail

ProxyJump는 훌륭하지만 구성 파일에서 User 및 IdentityFile을 가져 오지 않았습니다. ProxyCommand -W가이를 수행하고 scp 와도 작동합니다.
rickfoosusa

18

다음과 같은 것을 사용하여 서버 B에 ssh 할 수 있습니다

ssh -L 5022:<server C IP>:22 <user_serverB>@<server B IP>

그런 다음 다음을 사용하여 서버 C에 ssh 할 수 있습니다

ssh -p 5022 <user_serverC>@localhost 

마찬가지로 scp는 다음을 사용하여 작동합니다.

scp -P 5022 foo.txt <user_serverc>@localhost:

scp 및 ssh와 함께 올바른 p를 사용해야합니다.


5

인증을 위해 인증서를 사용해야하는 경우에도 (AWS 환경에서는 일반적으로) 가능하고 비교적 쉽습니다.

이 명령은 아래에서 파일을 복사 remotePathserver2귀하의 컴퓨터에 직접 localPath. 내부적으로 scp 요청은를 통해 프록시됩니다 server1.

scp -i user2-cert.pem -o ProxyCommand="ssh -i user1-cert.pem -W %h:%p user1@server1" user2@server2:/<remotePath> <localpath>

다른 방법으로도 작동합니다 (파일 업로드).

scp -i user2-cert.pem -o ProxyCommand="ssh -i user1-cert.pem -W %h:%p user1@server1" <localpath> user2@server2:/<remotePath>

대신 비밀번호 인증을 사용하는 경우

scp -o ProxyCommand="ssh -W %h:%p user1@server1" user2@server2:/<remotePath> <localpath>

두 서버에서 동일한 사용자 자격 증명을 사용하는 경우 :

scp -o ProxyCommand="ssh -W %h:%p commonuser@server1" commonuser@server2:/<remotePath> <localpath>

3

정말로 사악하고 싶다면 ssh와 tar를 체인으로 묶을 tar c mydir | ssh server "ssh otherserver | tar x"수는 있지만 모든 문제가 발생할 수 있습니다.

더 쉬운 방법은 내장 된 SSH 방법을 사용하여 SSH 터널을 설정하는 것입니다. -D맨 페이지 의 스위치를 보고 일부 포트를 다른 서버의 ssh 포트로 전달하십시오.


2

이 작업을 반대로 수행하면 더 쉬울 수 있습니다.

파일을 보내려는 시스템에서 ssh 세션을 열었다 고 가정하십시오. 이 가장 먼 PC, 우리는 이것을 hop2라고 부릅니다. "프록시"호스트는 hop1입니다. 파일 출처 인 PC를 그 출처라고 부릅니다.

origin:~/asdf.txt  --> hop1 --> hop2:~/asdf.txt

원격 PC에서 로컬 포트를 사용할 수 있도록 터널을 구축 할 수 있습니다. 따라서 원격 PC에서 열 포트를 정의합니다. 이는 터널을 만들 때 가져온 포트로 리디렉션됩니다.

hop2에서 :

ssh -R 5555:127.0.0.1:22 <hop1_user>@<hop1_IP>
#this has the effect of building a tunnel from hop2 to hop1, making hop2's port 22 available on hop1 as port 5555

이제 열린 터널 세션에서 hop1에서 file_origin까지 동일한 작업을 수행 할 수 있습니다.

hop1에서 :

ssh -R 6666:127.0.0.1:5555 <origin_user>@<origin_IP>
#this has the effect of building a tunnel from hop1 to origin while also pulling the active tunnel with it, making hop1's port 5555 (hop2's port 22) available on origin as port 6666.

이제 hop2에서 hop1로 터널링되어 원점이됩니다. 우연히도 이제 포트 5555와 6666은 모두 홉 2의 포트 22로 리디렉션되는 오리진에서 열려 있습니다.이 세션에서 다음 두 가지 모두 hop2에 대한 유효한 scp 경로입니다.

원산지 :

scp -P 6666 ~/asdf.txt <hop2_user>@<127.0.0.1>:~/asdf.txt

이러한 방식으로 사이에 임의의 수의 홉을 가질 수 있으며 두 개 이상의 홉을 함께 연결하는 측면에서 작업하기가 더 쉽습니다.


1

여러 호스트에 사용할 수있는 설정에 대해 다음 예제 openssh 구성을 채택하십시오.

Host uat-*
     ProxyCommand ssh bastion-uat nc %h %p

이것은 "uat-"로 시작하고 점프 박스 / 게이트웨이 서버 "bastion-uat"를 통해서만 액세스 할 수있는 서버 세트를 가정합니다. ForwardAgent yes로그인 키를 사용하는 경우 추가하고 싶을 수도 있습니다 .


이것을 사용하지 마십시오 ForwardAgent yes. 이 경우에는 요새에서 ssh 클라이언트가 실행되지 않기 때문에 에이전트 전달이 필요하지 않으며 필요하지 않은 에이전트를 전달하면 보안이 저하됩니다. 그리고 나는 ssh당신의 명령에서 빠졌다고 생각 합니다. 최신 ssh버전을 사용하는 경우 필요하지 않습니다 . 대신 nc입력 할 수 있습니다 ssh -W %h:%p bastion-uat.
kasperd

@kasperd ssh를 포함하도록 편집되었습니다. 재전송 에이전트; nc 명령 자체를 실행하기 위해 ssh 클라이언트가 실행됩니다. 아마도 당신은 껍질을 언급하고 있습니까?
Benjamin Goodacre 2016 년

1

이것은 scp가 아니지만 (OP가 요청한) rsync단일 홉을 통해 로컬에서 원격으로 복사 하는 것이 매우 간단하다는 것을 알았습니다 .

rsync -v -e 'ssh -A -t user@jumpserver ssh -A -t user@destinationserver' /path/to/sourcefile :/path/to/destination

출처 : http://mjbright.blogspot.com/2012/09/using-rsync-over-multi-hop-ssh.html

위의 -o ProxyPass 제안을 시도했지만 변경 요구에 따라 구성을 변경하고 싶지 않았습니다. 위 링크의 작성자가 명시한 것처럼 콜론 (:) 앞에있는 대상 파일은 지정된 경로가 대상 서버에 있음을 나타내는 데 중요합니다. 또한 rsync를 사용하면 날짜 비교, 폴더 동기화 등의 옵션이 있습니다. 누군가에게 도움이되기를 바랍니다.


-2

scp -o 'ProxyJump jumpboxname'somefilename.txt finaldestinationhost : / tmp /.


3
여기에 설명 할 수없는 코드를 조금만 버리지 마십시오. 이 질문에 대한 좋은 답변이 많이 있으며 기존 질문에 가치를 추가해야합니다.
Sven
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.