it-swarm-vi.tech

Làm cách nào để chuyển Multihop SCP?

Tôi muốn sao chép một tập tin từ máy A của mình sang máy chủ C, nhưng chỉ có quyền truy cập vào máy chủ C thông qua máy chủ B.

Thay vì đầu tiên chuyển đến máy chủ B, đăng nhập và sau đó chuyển sang máy chủ C, Có thể chuyển tệp trực tiếp bằng SCP hoặc các chương trình tương tự không?

(Chế độ tramp Emacs có tính năng này để chỉnh sửa tệp từ xa).

87
sverrejoh

Bạn có thể thêm -o tùy chọn cho scp thay vì .ssh/config.

scp -o ProxyCommand="ssh $jump_Host nc $Host 22" $local_path $Host:$destination_path

$jump_Host là "máy chủ B" của bạn trong trường hợp này.

48
John Tantalo

Giả sử OpenSSH, thêm vào cấu hình SSH của bạn trong .ssh/config

Host distant
ProxyCommand ssh near nc distant 22

Điều này sẽ khiến SSH có thể kết nối "trực tiếp" với máy có tên xa bằng cách ủy quyền thông qua máy có tên gần. Sau đó, nó có thể sử dụng các ứng dụng như scp và sftp cho máy ở xa.

Để làm việc này, bạn cần 'nc' aka netcat được cài đặt trên máy có tên gần. Nhưng rất nhiều hệ thống hiện đại sẽ có nó.

giải pháp tar của Towo hiệu quả hơn cho các sự cố một lần, giả sử bạn đã ghi nhớ cú pháp và quy tắc hoạt động của tar.

44
tialaramex

Với các phiên bản gần đây hơn của ssh trên máy chủ gần (B), phần sau sẽ hoạt động mà không cần netcat:

Host distant
    ProxyCommand ssh near -W distant:22

Tuy nhiên, nó sẽ yêu cầu AllowTcpForwarding là có (mặc định) trên máy gần (B)

chỉnh sửa: yêu cầu OpenSSH 5.4+ trên B

19
danblack

Bạn có thể ssh đến máy chủ B bằng cách sử dụng một cái gì đó như

ssh -L 5022:<server C IP>:22 <user_serverB>@<server B IP>

Sau đó, bạn có thể ssh đến máy chủ C bằng cách sử dụng

ssh -p 5022 <user_serverC>@localhost 

Tương tự scp sẽ làm việc bằng cách sử dụng

scp -P 5022 foo.txt <user_serverc>@localhost:

Nhớ sử dụng đúng trường hợp p với scp và ssh

18
Saurabh Barjatiya

Điều đó có thể và tương đối dễ dàng, ngay cả khi bạn cần sử dụng chứng chỉ để xác thực (điển hình trong môi trường AWS).

Lệnh bên dưới sẽ sao chép các tệp từ một remotePath trên server2 trực tiếp vào máy của bạn tại localPath. Trong nội bộ, yêu cầu scp được ủy quyền thông qua server1.

scp -i user2-cert.pem -o ProxyCommand="ssh -i user1-cert.pem -W %h:%p [email protected]" [email protected]:/<remotePath> <localpath>

Cách khác cũng hoạt động (tải lên tập tin):

scp -i user2-cert.pem -o ProxyCommand="ssh -i user1-cert.pem -W %h:%p [email protected]" <localpath> [email protected]:/<remotePath>

Nếu bạn sử dụng xác thực mật khẩu thay thế, hãy thử với

scp -o ProxyCommand="ssh -W %h:%p [email protected]" [email protected]:/<remotePath> <localpath>

Nếu bạn sử dụng cùng một thông tin người dùng trong cả hai máy chủ:

scp -o ProxyCommand="ssh -W %h:%p [email protected]" [email protected]:/<remotePath> <localpath>
5
donhector

Nếu bạn muốn thực sự độc ác, bạn có thể xâu chuỗi ssh và tar, đại loại như tar c mydir | ssh server "ssh otherserver | tar x", nhưng điều này có thể chạy vào tất cả các vấn đề.

Cách dễ dàng hơn là chỉ cần thiết lập một đường hầm SSH với các phương thức SSH tích hợp; nhìn vào -D chuyển đổi trong manpage và chỉ chuyển tiếp một số cổng sang cổng ssh của máy chủ khác.

3
towo

Bạn cũng có thể làm điều này ngược lại và có thể dễ dàng hơn.

Giả sử bạn có một phiên ssh được mở bằng máy bạn muốn gửi tệp đến. PC xa nhất này, chúng tôi sẽ gọi đây là hop2. Máy chủ "proxy" của bạn sẽ là hop1. PC là Origin-file, chúng tôi sẽ gọi Origin đó.

Origin:~/asdf.txt  --> hop1 --> hop2:~/asdf.txt

Bạn có thể xây dựng các đường hầm làm cho một cổng cục bộ có sẵn trên một PC từ xa. Do đó, chúng tôi đang xác định một cổng để mở trên PC từ xa, đây sẽ là một chuyển hướng đến cổng mà bạn đã kéo qua khi bạn xây dựng đường hầm.

Trên hop2 :

ssh -R 5555:127.0.0.1:22 <hop1_user>@<hop1_IP>
#this has the effect of building a tunnel from hop2 to hop1, making hop2's port 22 available on hop1 as port 5555

Bây giờ trong phiên đường hầm đã mở, bạn có thể thực hiện tương tự từ hop1 đến file_Origin.

Trên hop1 :

ssh -R 6666:127.0.0.1:5555 <Origin_user>@<Origin_IP>
#this has the effect of building a tunnel from hop1 to Origin while also pulling the active tunnel with it, making hop1's port 5555 (hop2's port 22) available on Origin as port 6666.

Bây giờ bạn đã được chuyển từ hop2 sang hop1 sang Origin. Thật trùng hợp, bây giờ cả hai cổng 5555 và 6666 đều mở trên Origin, vốn được chuyển hướng đến cổng 22. của hop2. Trong phiên này, cả hai cách sau đây đều là các tuyến scp hợp lệ đến hop2:

Về nguồn gốc :

scp -P 6666 ~/asdf.txt <hop2_user>@<127.0.0.1>:~/asdf.txt

Theo cách này, bạn có thể có một số bước nhảy tùy ý ở giữa và dễ dàng hơn để làm việc với nhau về mặt kết nối nhiều hơn hai bước nhảy.

2
SYANiDE

Hãy thử điều chỉnh ví dụ openssh config sau đây để thiết lập có thể được sử dụng cho nhiều máy chủ:

Host uat-*
     ProxyCommand ssh bastion-uat nc %h %p

Điều này giả định một tập hợp các máy chủ bắt đầu bằng "uat-" chỉ có thể truy cập thông qua máy chủ jumpbox/gateway "bastion-uat". Có lẽ bạn cũng muốn thêm ForwardAgent yes nếu bạn đang sử dụng một khóa để đăng nhập.

1
Benjamin Goodacre

Đây không phải là scp (mà OP yêu cầu), nhưng tôi thấy nó rất đơn giản để sử dụng rsync để sao chép từ cục bộ sang từ xa qua một bước nhảy với:

rsync -v -e 'ssh -A -t [email protected] ssh -A -t [email protected]' /path/to/sourcefile :/path/to/destination

Nguồn: http://mjbright.blogspot.com/2012/09/USE-rsync-over-multi-hop-ssh.html

Tôi đã thử đề xuất -o ProxyPass ở trên và không muốn thay đổi cấu hình cho nhu cầu thay đổi của mình. Là tác giả trong liên kết ở trên, các tệp đích trước dấu hai chấm (:) rất quan trọng để chỉ ra đường dẫn được chỉ định nằm trên máy chủ đích. Ngoài ra, bằng cách sử dụng rsync, bạn có các tùy chọn so sánh ngày, đồng bộ hóa thư mục, v.v ... Tôi hy vọng điều này sẽ giúp được ai đó!

1
texas-bronius