Development Tip

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

yourdevel 2020. 10. 20. 08:14
반응형

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


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 .

첫 번째 인스턴스가에 대한 전달 연결을 수신 대기하는 localhost의 포트 1234에 있기 때문에 user2@localhost실제 scp명령 에서와 같이 ssh연결합니다 remote2. 또한 모든 후속 파일 복사에 대해 첫 번째 명령을 실행할 필요가 없습니다. 단순히 실행 상태로 둘 수 있습니다.


더블 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이전 배포에서는 사용할 수 없습니다.


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

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.


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"옵션을 사용하여 요새 점프 호스트를 지정할 수 있습니다.

Note scp does not seems to support "-J" flag as of now. (i could not find in man pages. However above scp works with config file setting)


This configuration works nice for me:

Host jump
   User username
   Hostname jumphost.yourorg.intranet
Host production
   User username
   Hostname production.yourorg.intranet
   ProxyCommand ssh -q -W %h:%p jump

Then the command

scp myfile production:~

Copies myfile to production machine.

참고URL : https://stackoverflow.com/questions/9139417/how-to-scp-with-a-second-remote-host

반응형