Scp qua proxy với một lệnh từ máy cục bộ?


54

Tôi có local.machine, proxy.machine và target.machine. local.machine không có liên hệ trực tiếp với target.machine, nhưng cần thông qua proxy.machine.

Tôi muốn scp một tập tin từ target.machine đến local.machine. Điều này có thể thực hiện chỉ với một lệnh từ local.machine không?

Câu trả lời:


64

Tôi biết đây là một câu trả lời muộn, nhưng tôi chỉ tìm ra một cách hay để làm điều này. Về cơ bản, đây là câu trả lời của Holger, nhưng trong tệp cấu hình đã lưu:

Bạn cần đặt ~/.ssh/configtệp này vào tệp của mình trên local.machine, (tạo tệp nếu nó không tồn tại)

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

Sau khi lưu tệp, bạn chỉ có thể sử dụng

ssh target.machine

bất cứ lúc nào bạn muốn kết nối. Scp cũng sẽ hoạt động vì nó cũng tôn trọng tập tin cấu hình ssh. Nautilus cũng vậy, nếu bạn đang sử dụng Gnome và muốn sử dụng GUI.


5
Chỉ là một ghi chú nhanh. Nếu bạn đang sử dụng tệp nhận dạng thay thế thông qua tùy chọn dòng lệnh -i cho ssh, bạn cần chỉ định tùy chọn đó cho cả cấu hình ProxyCommand và dòng lệnh ssh.
Billman

7
3 điều có thể hữu ích, 1) sẽ hữu ích nếu bạn cũng hiển thị các Host proxy.machinedòng trong cùng một ~/.ssh/configtệp, 2) Đề cập đến việc các lệnh này có thể được lồng vào nhau hay không (ví dụ: máy khách kết nối với máy chủ proxy 1 kết nối với máy chủ proxy 2 kết nối với. ..target) và 3) nc %h %pcó nghĩa là gì
puk 14/11/13

Làm thế nào chúng ta có thể sao chép từ máy cục bộ sang máy đích bằng proxy?
Mulagala

19

Bạn có thể thực hiện nó trong một lệnh, nhưng bạn cần cài đặt netcat (nc) trên máy proxy:

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

[EDIT: trộn lẫn thứ tự của máy móc ...]


Hãy thử, nhưng tôi nên thêm tên người dùng cho proxy và đăng nhập ở đâu?
grm

Jzst trước tên máy, với một @. Tôi chỉnh sửa câu trả lời của mình để phản ánh điều đó.
Holger Chỉ cần

19

Bây giờ bạn có thể * làm điều này như một lớp lót, mà không yêu cầu nc bất cứ nơi nào:

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

Giải trình

pcredstcredsđại diện cho proxy và mục tiêu của bạn thông tin nếu cần thiết ( username, username:password, vv).

Điều này là có thể bởi vì khả năng giống như netcat tích hợp, loại bỏ yêu cầu đối với ncmáy chủ trung gian. Sử dụng ssh -W host:portthiết lập một đường hầm đến máy chủ và cổng được chỉ định và kết nối nó với stdin / stdout, sau đó scpchạy qua đường hầm.

Các %h%ptrong ProxyCommandđược thay thế bằng máy chủ đích và cổng bạn chỉ định.

Để thuận tiện hơn nữa, bạn có thể định cấu hình proxy trong cấu hình ssh của mình:

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

và từ đó trở đi chỉ cần làm

scp tcreds@target.machine:file .

* kể từ OpenSSH 5.4 - phát hành tháng 3 năm 2010


1
Đã xác minh điều này thực sự hoạt động tốt và không để lại các quy trình NC cũ nằm trên máy proxy.
LaXDragon

1
Tôi có thể chỉ định cổng proxy ở đâu?
Đã kết hôn

1
@Marged Tôi không ở vị trí để thử nó tại thời điểm này, nhưng tôi nghĩ bạn nên có thể đưa vào -p <portnum>trước một -Wtrong hai phương thức để chỉ định cổng proxy
CupawnTae

1
Phải mất một thời gian tôi mới nhận ra rằng tùy chọn -i (nếu bạn cần) đi vào bên trong dấu ngoặc kép. Theo mặc định, ssh proxy không sử dụng cùng khóa riêng được chỉ định bởi bất kỳ tùy chọn -i nào được cung cấp trực tiếp cho scp. Tôi đoán đó là hiển nhiên khi bạn nghĩ về nó.
Keeely

18

Nếu bạn không phiền khi sử dụng rsync thay vì scp, bạn có thể sử dụng một lớp lót sau:

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

(bạn sẽ cần truy cập không mật khẩu vào máy proxy)


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

OK, thực sự là hai lệnh ...


1
Làm cách nào tôi có thể chỉ định cổng proxy của mình? Trong trường hợp của tôi8080
Đã kết hôn

@Marged thêm -p <portnumber>vào lệnh ssh của bạn
trăng mật

6

Một lớp lót? Không ra khỏi đỉnh đầu của tôi. Bạn cần thiết lập proxy trước và bạn không thể làm điều đó với scp.

Khi thực hiện thủ công, tôi mở một phiên màn hình cho đường hầm của mình:

screen -S tunnel

Màn hình được sử dụng để giữ cho đường hầm đi trong một vỏ nền. Sử dụng bất kỳ kỹ thuật nào bạn muốn giữ cho đường hầm mở ở chế độ nền (câu trả lời của @ Sydematvy có lẽ là đơn giản nhất). Một lần trong phiên màn hình tôi bắt đầu đường hầm của mình như vậy

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

Để phá vỡ điều đó, về cơ bản, nó nói rằng "Trên máy cục bộ của tôi, mở cổng 2222 và bất kỳ kết nối nào nhấn localhost: 2222 được ủy quyền thông qua proxy.machine tới target.machine: 22"

Khi bạn đã thiết lập kết nối và đường hầm ssh, hãy tách ra khỏi phiên màn hình với "Ca d". Để quay lại phiên màn hình đó, hãy nhậpscreen -raAd tunnel

Khi bạn quay lại trình bao ban đầu, lệnh scp của bạn sẽ giống như

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

Hãy nhớ rằng cổng localhost 2222 thực sự chỉ là một đường hầm đi đến target.machine.


3

Xuất hiện rằng scp hỗ trợ tùy chọn "-o" giống như ssh, mặc dù tôi không chắc chắn làm thế nào để vượt qua tên người dùng / mật khẩu proxy:

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

Nếu bạn nhận nc: invalid option -- Xthấy https://stackoverflow.com/a/23616021/32453


dope bro, làm việc ngay lập tức :)
Elouan Keryell-Ngay cả

2

Làm thế nào về:

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

hoặc có thể tên người dùng: mật khẩu ở đây?
rogerdpack

1

Bạn có thể thử một cái gì đó như:

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

Nhưng nó sẽ không hoạt động nếu proxy.machine của bạn cần hỏi mật khẩu của bạn (rằng SSH không có trong TTY, do đó, Askpass sẽ thất bại).

Nếu bạn có nhiều tệp, bạn có thể sử dụng tar như thế này (chưa được kiểm tra, tôi thường sử dụng netcat theo cách đó):

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

1

Một giải pháp đơn giản khác để chuyển một source_file từ source_host sang Destination_host thông qua proxy_host :

Đăng nhập vào proxy_server :

ssh login@proxy_host

Từ máy chủ proxy, chuyển source_file từ source_host sang Destination_host (bạn có thể nhập dòng này dưới dạng một dòng, bỏ qua \hoặc hai dòng, như hiển thị bên dưới):

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

Điều này yêu cầu đăng nhập trên source_host vào proxy_host sử dụng rsa_key.


0

Trong trường hợp bạn cần sử dụng khóa công khai, bạn sẽ cần một cái gì đó như thế này.

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

Tôi đã theo dõi bài viết này và tìm thấy một câu trả lời phù hợp với tôi. (Vì các câu trả lời ở trên không phù hợp với tôi).

Cách gửi scptệp qua máy chủ trung gian (còn gọi là máy chủ nhảy) http://mperdikeas.github.io/networking.html.files/scp-a-file- phiên- jump- host.html

Và câu trả lời của tôi là như sau:

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

Thí dụ:

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

Tôi hy vọng câu trả lời này có thể giúp bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.