로컬 컴퓨터에서 하나의 명령으로 프록시를 통한 SCP?


54

local.machine, proxy.machine 및 target.machine이 있습니다. local.machine은 target.machine과 직접 접촉하지 않지만 proxy.machine을 거쳐야합니다.

target.machine에서 local.machine으로 파일을 scp하고 싶습니다. local.machine의 명령 하나만으로도 가능합니까?

답변:


64

나는 이것이 늦은 대답이라는 것을 알고 있지만 방금 멋진 방법을 찾았습니다. 기본적으로 Holger Just의 답변이지만 저장된 구성 파일에 있습니다.

~/.ssh/configlocal.machine 의 파일에 파일 을 넣어야합니다 (없는 경우 파일 작성).

Host target.machine
  User          targetuser
  HostName      target.machine
  ProxyCommand  ssh proxyuser@proxy.machine nc %h %p 2> /dev/null

파일을 저장 한 후 사용할 수 있습니다

ssh target.machine

당신이 연결하고 싶을 때마다. Scp는 ssh 구성 파일도 존중하므로 작동합니다. 그놈을 사용하고 GUI를 사용하고 싶다면 노틸러스도 마찬가지입니다.


5
간단한 메모입니다. ssh에 대해 -i 명령 행 옵션을 통해 대체 ID 파일을 사용하는 경우 ProxyCommand 구성 및 ssh 명령 행 모두에 대해 해당 옵션을 지정해야합니다.
BillMan

7
도움이 될 수있는 3 가지 사항, 1) Host proxy.machine동일한 ~/.ssh/config파일에 행을 표시하면 도움이 됩니다. 2) 이러한 명령을 중첩 할 수 있는지 여부를 언급합니다 (예 : 클라이언트가 프록시 호스트 1에 연결하여 프록시 호스트 2에 연결). ..target), 3) 무엇을 nc %h %p의미
PUK

프록시를 사용하여 로컬 컴퓨터에서 대상 컴퓨터로 어떻게 복사 할 수 있습니까?
Mulagala

19

하나의 명령으로 수행 할 수 있지만 프록시 시스템에 netcat (nc)가 설치되어 있어야합니다.

ssh -o "ProxyCommand ssh poxyuser@proxy.machine nc -w 1 %h 22" targetuser@target.machine

[편집 : 기계의 순서를 섞었다 ...]


좋은 시도이지만 프록시 및 로그인을 위해 사용자 이름을 어디에 추가해야합니까?
grm

기계 이름 앞에 Jzst를 @로 표시하십시오. 나는 그것을 반영하기 위해 대답을 편집했다.
Holger Just

19

이제 어디서나 요구하지 않고 단일 라이너로이 작업을 수행 할 수 있습니다 nc.

scp -o "ProxyCommand ssh pcreds@proxy.machine -W %h:%p" tcreds@target.machine:file .

설명

pcredstcreds프록시를 대표하고 필요한 경우 (자격 증명을 대상 username, username:password등).

내장 된 netcat과 같은 기능 nc으로 인해 중간 호스트에 대한 요구 사항이 제거 될 수 있습니다. 를 사용 ssh -W host:port하여 지정된 호스트 및 포트에 터널을 설정하고 stdin / stdout에 연결 한 다음 scp터널을 통해 실행합니다.

%h%p에는 ProxyCommand사용자가 지정하는 대상 호스트 및 포트로 대체됩니다.

더 편리하게 ssh 구성에서 프록시를 구성 할 수 있습니다.

Host target.machine
    ProxyCommand ssh pcreds@proxy.machine -W %h:%p

그리고 그때부터 그냥

scp tcreds@target.machine:file .

* OpenSSH 5.4 이후 -2010 년 3 월 출시


1
이것이 실제로 잘 작동하고 프록시 머신에 오래된 NC 프로세스가 남아 있지 않은지 확인했습니다.
LaXDragon

1
프록시 포트를 어디에서 지정할 수 있습니까?
Marged

1
내가 지금 여기에 그것을 시도 할 위치에 있지,하지만 난 당신이 포함 할 수 있어야한다고 생각 @Marged -p <portnum>전과 -W프록시 포트를 지정하거나 방법
CupawnTae

1
-i 옵션 (필요한 경우)이 따옴표 안에 들어가는 것을 알아내는 데 시간이 걸렸습니다 . 프록시 ssh는 기본적으로 scp에 직접 제공된 -i 옵션으로 지정된 동일한 개인 키를 사용하지 않습니다. 나는 당신이 그것에 대해 생각할 때 분명한 것 같아요.
Keeely

18

scp 대신 rsync를 사용하지 않아도 다음과 같은 단일 라이너를 사용할 수 있습니다.

rsync -v --rsh "ssh proxy.machine ssh" target.machine:/remote/file /local/dir/

(프록시 시스템에 비밀번호없이 액세스해야합니다.)


8
$ ssh -f -N -L <localport>:<target.machine:port> user@proxy.machine
$ scp target-user@local.machine:/remote/file -P <localport> .

실제로 두 명령은 ...


1
프록시 포트를 어떻게 지정합니까? 내 경우8080
18:00에

@Marged -p <portnumber>ssh 명령에 추가
weeheavy

6

하나의 라이너? 내 머리 꼭대기에서 벗어나지 마십시오. 먼저 프록시를 설정해야하며 scp 자체로는 프록시를 설정할 수 없습니다.

수동으로 할 때 터널에 대한 스크린 세션을 엽니 다.

screen -S tunnel

Screen은 터널을 백그라운드 쉘로 유지하는 데 사용됩니다. 백그라운드에서 터널을 열어두고 싶은 기술을 사용하십시오 (@weeheavy의 답변이 가장 간단합니다). 스크린 세션에서 터널을 시작합니다.

ssh -L 2222:target.machine:22 [user@]proxy.machine

기본적으로 "내 로컬 컴퓨터에서 포트 2222를 열고 localhost : 2222에 충돌하는 모든 연결은 proxy.machine을 통해 target.machine : 22로 프록시됩니다"라고 표시합니다.

ssh 연결과 터널이 설정되면 "Ca d"를 사용하여 화면 세션에서 분리하십시오. 해당 화면 세션으로 돌아가려면 다음을 입력하십시오.screen -raAd tunnel

원래 쉘로 돌아 오면 scp 명령은 다음과 같습니다.

scp -P 2222 localhost:your/file/on/target.machine local/path

localhost 포트 2222는 실제로 target.machine으로가는 터널이라는 것을 기억하십시오.


3

scp가 ssh처럼 "-o"옵션을 지원하는 것으로 보이지만 프록시 사용자 이름 / 암호를 전달하는 방법을 잘 모르겠습니다.

scp -o "ProxyCommand=nc -X connect -x proxyhost:proxyport %h %p" remote_user@remote_host:remote_path local_path

당신이 얻을 경우 nc: invalid option -- X참조 https://stackoverflow.com/a/23616021/32453


마약 마약 브로, 바로 일했다 :)
Elouan Keryell-Even

2

어때요 :

scp -o "ProxyCommand ssh user@myproxyserver.com nc %h %p" your.filename username@yourdestination.yourdomain.com:/whatever_location

아니면 username : password입니까?
rogerdpack

1

다음과 같은 것을 시도해 볼 수 있습니다.

ssh user@proxy.machine "ssh user@target.machine 'cat > file'" < file

그러나 proxy.machine이 암호를 요구 해야하는 경우 작동하지 않습니다 (SSH가 TTY에 있지 않으므로 askpass가 실패합니다).

파일이 두 개 이상인 경우 tar를 다음과 같이 사용할 수 있습니다 (추천하지 않은 경우 일반적으로 netcat을 사용합니다).

tar cf - file1 file2 folder1/ | ssh user@proxy.machine "ssh user@target.machine 'tar xvf -'"

1

또 단순한 솔루션은 전송하는 source_file를 으로부터 source_host A를 destination_host 비아 proxy_host :

proxy_server 에 로그인하십시오 .

ssh login@proxy_host

프록시 서버에서 source_filesource_host 에서 destination_host 로 전송하십시오 ( \아래에 표시된 대로이를 한 줄로 생략 하거나 두 줄로 입력 할 수 있음 ).

scp login@source_host:/path_to_source_file \
  login@destination_host:/path_to_destination_directory

source_host에서 proxy_host에 로그인 할 때 rsa_key를 사용해야합니다.


0

공개 키를 사용해야 할 경우 이와 같은 것이 필요합니다.

Host target-machine
  User          target-user
  HostName      target.example.com
  IdentityFile  /path/to/file.pem
  ProxyCommand  ssh bastion -W %h:%p

Host bastion
  User         bastion-user
  HostName     bastion.example.com
  IdentityFile /path/to/file.pem

0

나는이 기사를 따르고 나에게 맞는 대답을 찾았다. (위의 답변이 저에게 효과적이지 않기 때문에).

scp중간 호스트 (일명 점프 호스트)를 통해 파일을 만드는 방법 http://mperdikeas.github.io/networking.html.files/scp-a-file-through-jump-host.html

내 대답은 다음과 같습니다.

scp -oProxyCommand="ssh -W %h:%p {username}@{proxy_IP}" \
        {source_file} {remote_username}@{remote_IP}:{remote_file_path}

예:

scp -oProxyCommand="ssh -W %h:%p ubuntu@10.60.10.145" \
        archive.gz wise@35.xxx.xxx.xxx:/home/wise/archive.gz

이 답변이 도움이 되길 바랍니다.

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