두 번째 원격 호스트로 scp하는 방법


82

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합니까?

답변:


94

하나의 명령으로 파일을 직접 복사하는 방법은 모르겠지만 포트 포워딩 터널을 열어두기 위해 백그라운드에서 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. 또한 모든 후속 파일 복사에 대해 첫 번째 명령을 실행할 필요가 없습니다. 단순히 실행 상태로 둘 수 있습니다.


1
고마워요, 이것이 제가 필요한 것 근처에있는 것 같습니다. 그래서 터널을 만들었는데 지문이 서버의 지문과 일치하지만 "Permision denied (publickey)"오류가 발생했습니다. 네트워크 / 시스템 관리자에게 왜 작동하지 않는지 물어봐야한다고 생각합니다.
Danosaure 2012

3
감사! 내 remote1 SSH가 포트 22를 수신하므로 로 변경 -p 45678해야 -p 22했습니다.
Montaro

또한 사용했다 -p 22대신 -p 45678. 또한 scp -P 1234 ...나를 위해 작동하지 않습니다. 나는 얻고있다 ssh: connect to host localhost port 1234: Connection refused. 내가 시도했을 때 scp -P 22 ...작동하지만 remote 1로컬 컴퓨터가 아닌 파일을 복사합니다 ( remote2).
죄인

동일한 UI 도구가 있습니까?
ExploringApple

70

더블 ssh

복잡한 경우에도 간단히 ssh;-)를 사용하여 단일 명령 줄을 사용하여 파일 전송을 처리 할 수 ​​있습니다 . 다음에 연결할 수없는
경우 유용합니다 .remote1localhost

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 / 초 이상 사용하지 않음).scprsyncscp -l 1024 user@remote:file

그러나 해결 방법은 ionice단일 명령 줄을 유지하는 데 사용 하는 것입니다.

ionice -c2 -n7 ssh u1@remote1 'ionice -c2 -n7 ssh u2@remote2 "cat file"' > file

참고 : ionice이전 배포에서는 사용할 수 없습니다.


모든 설명에 감사하지만 Dolda2000의 솔루션이 더 쉽다고 생각합니다. 내가 시도했지만 알아낼 수 없었습니다.
Danosaure

5
이것은 매우 좋은 대답이며 더 많은 표를받을 가치가 있습니다. 또한 내 의견으로는 받아 들여지는 대답보다 훨씬 쉽습니다.
Rik Smith-Unna

2
나는 이것이 허용되는 답변보다 더 나은 해결책이라는 데 동의합니다. 이렇게하면 연결이 자동으로 정리됩니다.
Doug

감사합니다, 아주 좋은 답변입니다! 반대로 로컬에서 원격으로 복사하는 것은 어떻습니까?
DomTomCat

31

이것은 트릭을 할 것입니다.

scp -o 'Host remote2' -o 'ProxyCommand ssh user@remote1 nc %h %p' \ 
    user@remote2:path/to/file .

호스트에서 remote2직접 파일에 SCP를 지정하려면 ~ / .ssh / config 파일에 두 가지 옵션 ( HostProxyCommand)을 추가 합니다 ( 슈퍼 유저에 대한 답변 참조 ). 그런 다음 다음을 실행할 수 있습니다.

scp user@remote2:path/to/file .

생각할 필요없이 로컬 컴퓨터에서 remote1.


좋은 접근! 비록 -o 'Host remote2'명령 줄에서 시작할 때 정말 필요하지 않는 것 (즉 감동 ~ / 스푸핑 / 설정없이 한 번에 복사)
마이크

여기도 마찬가지입니다. 이것은 -o 'Host remote2'. 감사.
죄인

7

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는 구성 파일 설정에서 작동합니다)


1
프록시에만 사용되는 경우 (즉, 다른 IdentityFile 등이 아님) 구성 파일에 배스 천 서버를 추가 할 필요가 없습니다. 간단히 ProxyJump bastion.client.com을 appMachine 섹션에 추가하면됩니다.
Tomer Cohen

1

scp매우 편리한 동일한 작업을 위해 최근에 추가 하는 새로운 옵션 이 -3있습니다.

TL; DR ssh 구성 파일에 이미 인증이 설정된 현재 호스트의 경우 다음을 수행하십시오.

scp -3 remote1:file remote2:file

사용자는 scp최신 버전에서해야합니다.

언급 된 다른 모든 기술을 사용하려면 remote1에서 remote2로 또는 그 반대로 인증을 설정해야합니다. 이는 항상 좋은 생각은 아닙니다.
인수 -3는 현재 호스트를 중개자로 사용하여 두 개의 원격 호스트에서 파일을 이동하려는 것을 의미하며,이 호스트는 실제로 두 원격 호스트 모두에 대한 인증을 수행하므로 서로 액세스 할 필요가 없습니다.
ssh 구성 파일에서 인증을 설정하기 만하면됩니다. 이는 매우 쉽고 잘 문서화되어 있으며 TL; DR에서 명령을 실행하기 만하면됩니다.

이 답변의 출처는 https://superuser.com/a/686527/713762입니다.


0

이 구성은 나에게 잘 작동합니다.

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프로덕션 시스템에 복사 합니다.


0

소스 를 사용하여 작업 한 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"'

여기서 &&는 명령의 전반부가 작동하지 않는 경우 (예 : 디렉토리가 누락되었거나 소스 / 대상 경로 이름에 오류가있는 경우) 명령이 실행되지 않도록합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.