답변:
대신에 -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의 타르 솔루션은 원샷 문제에 더 효과적입니다.
near
다른 distant
경우 가까운 사용자가로 이동 ProxyCommand ssh nearuser@near...
하고 먼 사용자가 별도의 User distantuser
줄을 입력합니다.
(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 환경에서는 일반적으로) 가능하고 비교적 쉽습니다.
이 명령은 아래에서 파일을 복사 remotePath
에 server2
귀하의 컴퓨터에 직접 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 세션을 열었다 고 가정하십시오. 이 가장 먼 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
이러한 방식으로 사이에 임의의 수의 홉을 가질 수 있으며 두 개 이상의 홉을 함께 연결하는 측면에서 작업하기가 더 쉽습니다.
여러 호스트에 사용할 수있는 설정에 대해 다음 예제 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
.
이것은 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를 사용하면 날짜 비교, 폴더 동기화 등의 옵션이 있습니다. 누군가에게 도움이되기를 바랍니다.