멀티 홉 SCP 전송은 어떻게합니까? 다음 서버 C로

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

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

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



답변

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

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

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


답변

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

Host distant
ProxyCommand ssh near nc distant 22

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

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

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


답변

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

Host distant
    ProxyCommand ssh near -W distant:22

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

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


답변

다음과 같은 것을 사용하여 서버 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를 사용해야합니다.


답변

인증을 위해 인증서를 사용해야하는 경우에도 (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>


답변

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

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


답변

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

파일을 보내려는 시스템에서 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

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