remote1 호스트를 통해 내 로컬 컴퓨터에서 직접 remote2 호스트의 파일을 SCP 할 수있는 방법이 있는지 궁금합니다.
네트워크는 remote1 호스트에서 remote2 호스트로의 연결 만 허용합니다. 또한 remote1 호스트도 remote2 호스트도 내 로컬 컴퓨터로 scp 할 수 없습니다.
다음과 같은 것이 있습니까?
scp user1@remote1:user2@remote2:file .
첫 번째 창 : ssh remote1
, scp remot2:file .
.
두 번째 쉘 : scp remote1:file .
첫 번째 창 : rm file; logout
이 모든 단계를 수행하는 스크립트를 작성할 수 있지만 직접적인 방법이 있다면 사용하는 것이 좋습니다.
감사.
편집 : SSH 터널을 여는 것과 같은 것을 생각하고 있지만 어디에 넣을 가치가 있는지 혼란 스럽습니다.
현재, 액세스하려면 로컬 컴퓨터에 remote1
다음이 $HOME/.ssh/config
있습니다.
Host remote1
User user1
Hostname localhost
Port 45678
일단 켜진 remote1
후 액세스 remote2
하려면 표준 로컬 DNS 및 포트 22입니다. 무엇을 입히고 remote1
변경해야 localhost
합니까?
답변
하나의 명령으로 파일을 직접 복사하는 방법은 모르겠지만 포트 포워딩 터널을 열어두기 위해 백그라운드에서 SSH 인스턴스를 실행하는 것을 인정할 수 있다면 하나의 명령으로 파일을 복사 할 수 있습니다.
이렇게 :
# First, open the tunnel
ssh -L 1234:remote2:22 -p 45678 user1@remote1
# Then, use the tunnel to copy the file directly from remote2
scp -P 1234 user2@localhost:file .
당신이로 연결하는 것이 주 user2@localhost
실제에 scp
가 먼저 로컬 호스트 포트 1234에 있기 때문에, 명령 ssh
인스턴스에 연결을 전달 듣고있다 remote2
. 또한 모든 후속 파일 복사에 대해 첫 번째 명령을 실행할 필요가 없습니다. 단순히 실행 상태로 둘 수 있습니다.
답변
더블 ssh
복잡한 경우에도 간단히 ssh
;-)를 사용하여 단일 명령 줄을 사용하여 파일 전송을 처리 할 수 있습니다 . 다음에 연결할 수없는
경우 유용합니다 .remote1
localhost
ssh user1@remote1 'ssh user2@remote2 "cat file"' > file
tar
하지만 파일 속성 (소유권, 권한 …)이 손실됩니다.
그러나 tar
다음 파일 속성을 유지하는 것이 친구입니까?
ssh user1@remote1 'ssh user2@remote2 "cd path2; tar c file"' | tar x
네트워크 대역폭을 줄이기 위해 압축 할 수도 있습니다.
ssh user1@remote1 'ssh user2@remote2 "cd path2; tar cj file"' | tar xj
또한 tar
기본을 통해 재귀 디렉토리를 전송할 수 있습니다 ssh
.
ssh user1@remote1 'ssh user2@remote2 "cd path2; tar cj ."' | tar xj
ionice
파일이 크고 다른 중요한 네트워크 응용 프로그램을 방해하지 않으려는 경우 및 도구에서 제공하는 네트워크 처리량 제한을 놓칠 수 있습니다 (예 : 1Mbits / 초 이상 사용하지 않음).scp
rsync
scp -l 1024 user@remote:file
그러나 해결 방법은 ionice
단일 명령 줄을 유지하는 데 사용 하는 것입니다.
ionice -c2 -n7 ssh u1@remote1 'ionice -c2 -n7 ssh u2@remote2 "cat file"' > file
참고 : ionice
이전 배포에서는 사용할 수 없습니다.
답변
이것은 트릭을 할 것입니다.
scp -o 'Host remote2' -o 'ProxyCommand ssh user@remote1 nc %h %p' \
user@remote2:path/to/file .
호스트에서 remote2
직접 파일에 SCP를 지정하려면 ~ / .ssh / config 파일에 두 가지 옵션 ( Host
및 ProxyCommand
)을 추가 합니다 ( 슈퍼 유저에 대한 이 답변 참조 ). 그런 다음 다음을 실행할 수 있습니다.
scp user@remote2:path/to/file .
생각할 필요없이 로컬 컴퓨터에서 remote1
.
답변
openssh 버전 7.3 이상을 사용하면 쉽습니다. 구성 파일에서 ProxyJump 옵션을 사용하십시오 .
# Add to ~/.ssh/config
Host bastion
Hostname bastion.client.com
User userForBastion
IdentityFile ~/.ssh/bastion.pem
Host appMachine
Hostname appMachine.internal.com
User bastion
ProxyJump bastion # openssh 7.3 version new feature ProxyJump
IdentityFile ~/.ssh/appMachine.pem. #no need to copy pem file to bastion host
로그인 또는 복사를 위해 실행할 명령
ssh appMachine # no need to specify any tunnel.
scp helloWorld.txt appMachine:. # copy without intermediate jumphost/bastion host copy.**
물론 구성 파일에 구성되어 있지 않은 경우 ssh 명령에 “-J”옵션을 사용하여 요새 점프 호스트를 지정할 수 있습니다.
참고로 scp 는 현재 “-J”플래그를 지원 하지 않는 것 같습니다. (맨 페이지에서 찾을 수 없습니다. 그러나 위의 scp는 구성 파일 설정에서 작동합니다)
답변
scp
매우 편리한 동일한 작업을 위해 최근에 추가 하는 새로운 옵션 이 -3
있습니다.
TL; DR ssh 구성 파일에 이미 인증이 설정된 현재 호스트의 경우 다음을 수행하십시오.
scp -3 remote1:file remote2:file
사용자는 scp
최신 버전에서해야합니다.
언급 된 다른 모든 기술을 사용하려면 remote1에서 remote2로 또는 그 반대로 인증을 설정해야합니다. 이는 항상 좋은 생각은 아닙니다.
인수 -3
는 현재 호스트를 중개자로 사용하여 두 개의 원격 호스트에서 파일을 이동하려는 것을 의미하며,이 호스트는 실제로 두 원격 호스트 모두에 대한 인증을 수행하므로 서로 액세스 할 필요가 없습니다.
ssh 구성 파일에서 인증을 설정하기 만하면됩니다. 이는 매우 쉽고 잘 문서화되어 있으며 TL; DR에서 명령을 실행하기 만하면됩니다.
답변
이 구성은 나에게 잘 작동합니다.
Host jump
User username
Hostname jumphost.yourorg.intranet
Host production
User username
Hostname production.yourorg.intranet
ProxyCommand ssh -q -W %h:%p jump
그런 다음 명령
scp myfile production:~
myfile 을 프로덕션 시스템에 복사 합니다.
답변
이 소스 를 사용하여 작업 한 Olibre 솔루션에 대한 작은 추가 사항 입니다.
당신이 사용하는 세 가지 방법이있는 것처럼 tar
지역에 원격 호스트에서 복사를 들어, 원격 호스트에 로컬 호스트에 대한 다음과 같은 작품을 두 번 SSH 상황에서 복사 : (이를 실행 에 파일을 복사해야 할 디렉토리, 그렇지 않으면 fullpath에를 사용 /파일 이름)
압축없이 단일 파일 전송 :
tar c filename | ssh user1@remote1 'ssh -Y user2@remote2 "path2 && tar x"'
압축을 사용하여 단일 파일 전송 :
tar cj filename | ssh user1@remote1 'ssh -Y user2@remote2 "path2 && tar xj"'
재귀 디렉토리 전송 :
tar cj . | ssh user1@remote1 'ssh -Y user2@remote2 "path2 && tar xj"'
여기서 &&는 명령의 전반부가 작동하지 않는 경우 (예 : 디렉토리가 누락되었거나 소스 / 대상 경로 이름에 오류가있는 경우) 명령이 실행되지 않도록합니다.
