답변:
OpenSSH 7.3의 새로운 기능 :
A$ scp -oProxyJump=B thefile C:destination
(내부적으로 이것은 단지 ProxyCommand 및 사용 ssh -W
.)
다른 답변에서 -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
A$ ssh -f -N -L 4567:C:22 B
(continues running in background)
A$ scp -P 4567 thefile localhost:destinationPath
완료되면 이전에 시작한 ssh
프로세스 (으로 인해 백그라운드로 떨어짐)를 종료하는 것을 잊지 마십시오 -f -N
.
-f
ssh에게 명령 실행 직전에 백그라운드로 이동하도록 요청합니다. 이것은 ssh가 비밀번호 나 비밀번호 문구를 요구할 때 유용하지만 사용자는 백그라운드에서 비밀번호를 원합니다. 이것은 -n을 의미합니다.-N
원격 명령을 실행하지 마십시오. 포트를 전달하는 데 유용합니다.그래도 항상 작동하지는 않습니다.
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 소켓으로 전달되도록 지정합니다.scp
에서 C, 비록 B, 에 A, 당신이 할 수 있습니다 A$ scp -oProxyJump=B C:destination thefile
.
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
거의 모든 이미 내 마지막 페니는 여기에 말했지만되었습니다 나는없이 ProxyCommand 변형을 사용 nc
하거나 soc
. OpenSSH 프록시와 Jumphost Cookbook을 기반으로 다음 구성을 만들었습니다.
그래서 우리는 다음과 같은 선수를 가지고 있습니다 :
우선 내 고향 호스트에서 내 로컬 공개 키를 추가 .ssh/id_dsa.pub
로 .ssh/authorized_keys
두 홉 및 대상 호스트의. 예, 홈 호스트와 두 호스트 모두 동일한 공개 키입니다. 일반적으로 TARGET 키에 추가해야하는 HOP 공개 키일 것으로 예상됩니다.
그런 .ssh/config
다음 다음 항목을 추가하여 조금 조정 했습니다.
Host TARGET_HOST
User TARGET_USER
ProxyCommand ssh -W %h:%p HOP_USER@HOP_HOST
그 후 복사 작업은 다음과 같이 간단합니다 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)이 필요합니다. 항상 우리가 가진 것은 아닙니다. 시도해 볼 가치가 있습니다.
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 시스템에 전달을 설정합니다.
Grawity의 ProxyCommand 답변은 저에게 효과적이지만 SSH에 익숙하지 않기 때문에 약간의 실험이 필요했습니다. Grawity의 답변을 더 자세히 설명하여 다른 초보자가 나처럼 SSH를 도울 수 있다고 생각했습니다. 보다 명확한 표기법에 대한 정의는 다음과 같습니다.
머신 A : 현재 사용중인 머신
서버 B : userB@ip.address.for.B (점프 호스트 또는 중간 서버)
서버 C : userC@ip.address.for.C (복사하려는 원격 서버)
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
희망이 필요한 사람들이 다른 사람들보다 조금 더 도움이되기를 바랍니다.
A$ rsync <options> -e 'ssh B ssh' source C:destination