Làm cách nào tôi có thể tải xuống tệp từ máy chủ lưu trữ mà tôi chỉ có thể SSH qua máy chủ khác?


30

Tôi muốn tải tập tin từ máy tính văn phòng về máy tính xách tay của tôi.

Tôi có thể kết nối máy văn phòng của mình bằng SSH với máy chủ tổ chức và sau đó SSH từ máy chủ đến máy văn phòng của tôi.

Các lệnh duy nhất mà máy chủ tổ chức chấp nhận là ssh, ssh1 và ssh2.

Làm cách nào tôi có thể tải xuống một tệp từ máy văn phòng (từ xa) thông qua máy chủ vào máy tính xách tay (cục bộ) của tôi?


2
Sử dụng đường hầm SSH ngược? Xem câu trả lời của tôi ở đây và điều chỉnh nó khi cần thiết: superuser.com/questions/1186905/ Khăn
Darren

1
SSH nhiều bước nhảy?
mckenzm

Câu trả lời:


37

Các câu trả lời trước đề cập đến cách sử dụng chỉ thị ProxyJump (được thêm vào trong OpenSSH 7.3) để kết nối thông qua một máy chủ trung gian (thường được gọi là máy chủ pháo đài), nhưng đề cập đến nó như là một đối số dòng lệnh.

Trừ khi đó là máy bạn sẽ không kết nối trong tương lai, điều tốt nhất là bạn định cấu hình nó ~/.ssh/config.

Tôi sẽ đặt một tập tin như:

Host office-machine
Hostname yochay-machine.internal.company.local
ProxyJump bastion-machine

Host bastion-machine
Hostname organization-server.company.com
...

Nếu bạn đang sử dụng phiên bản OpenSSH trước đó không hỗ trợ ProxyJump, bạn sẽ thay thế nó bằng tương đương:

ProxyCommand ssh -W %h:%p bastion-machine

và nếu phiên bản ssh địa phương của bạn là một phiên bản thực sự cổ xưa không hỗ trợ -W:

ssh bastion-machine nc %h %p

mặc dù cái cuối cùng này yêu cầu máy pháo đài đã nccài đặt.

Cái hay của ssh là bạn có thể cấu hình từng đích trên tệp và chúng sẽ xếp chồng rất độc đáo. Do đó, bạn kết thúc làm việc với office-machinetên máy chủ trên tất cả các công cụ (ssh, scp, sftp ...) khi chúng được kết nối trực tiếp và chúng sẽ tìm ra cách kết nối dựa trên ssh_config. Bạn cũng có thể có các ký tự đại diện Host *.internal.company.localđể làm cho tất cả các máy chủ kết thúc như thế đi qua một pháo đài cụ thể và nó sẽ áp dụng cho tất cả chúng. Sau khi được cấu hình đúng, sự khác biệt duy nhất giữa thực hiện một kết nối hop hoặc hai mươi sẽ là thời gian kết nối chậm hơn.


36

Nếu bạn có OpenSSH (8.0) gần đây, bạn có thể sử dụng công tắc -J(nhảy) :

scp -J user@intermediate user@target:/path

Với các phiên bản cũ hơn (nhưng ít nhất là 7.3), bạn có thể sử dụng ProxyJumpchỉ thị , trên dòng lệnh:

scp -o ProxyJump=user@intermediate user@target:/path

hoặc trong ssh_configtệp, như câu trả lời của @ Ángel hiển thị.


Có các tùy chọn khác như ProxyCommandchuyển tiếp cổng, mà bạn có thể sử dụng trên các phiên bản OpenSSH cũ hơn. Những điều này được đề cập trong OpenSSH có hỗ trợ đăng nhập multihop không?


2
@yochaymaganssh -J userA@orgserv userB@officecomp cat remote/path > local/path
mosvy

4
Đối với scp, nó đã được thêm vào trong 7.10
Ángel

4
Ngay cả khi scpkhông hỗ trợ -J, nó vẫn có thể đủ mới để hỗ trợ ProxyJumptùy chọn; hãy thử một trong những câu trả lời khác sử dụng tùy chọn này một cách rõ ràng.
Gordon Davisson

2
Đây phải là câu trả lời được chấp nhận. Tôi coi thường tất cả các câu trả lời cho các sshcâu hỏi gợi ý sửa đổi configmáy chủ của bạn cho các máy chủ cụ thể khi một tùy chọn dòng lệnh đơn giản là đủ để thực hiện công việc.
clemisch

2
"Khinh bỉ" dường như là một phản ứng cực đoan. Chắc chắn, có những trường hợp sửa đổi nhanh dòng lệnh dễ hơn là trước tiên phải sửa đổi tệp cấu hình. Nhưng nếu bạn dự định kết nối với cùng một máy chủ nhiều lần, tôi chắc chắn sẽ cập nhật tệp cấu hình của mình một lần thay vì sử dụng -J user@intermediatemỗi khi tôi cần kết nối.
chepner

10

Đôi khi chúng ta chỉ có thể sử dụng đường ống. Đó là thời điểm hôm nay.

ssh -A user@host1 ssh user@host2 cat filename > filename

Bạn cũng có thể tải lên

ssh -A user@host1 ssh user@host2 cat \\\> filename < filename

Vâng, có những giải pháp khác liên quan đến ủy quyền, v.v. nhưng biết cách làm điều này rất hữu ích.


Công dụng hữu ích của cat!
Piskvor

Lưu ý điều này cung cấp cho bất kỳ người dùng đặc quyền nào đủ quyền truy cập máy chủ trung gian vào tác nhân và khóa ssh của bạn. Dữ liệu chảy giữa máy chủ của bạn và máy chủ2 cũng sẽ không được mã hóa trên máy chủ1. Các phương pháp sử dụng proxy và nhảy lên trên tránh được cả hai vấn đề này.
james

@james: Tôi không biết. Máy chủ Bastion như thế này thường rất đáng tin cậy.
Joshua

7

Sử dụng ProxyJumpcấu hình:

ProxyJump
Chỉ định một hoặc nhiều proxy nhảy là [user @] host [: port] hoặc ssh URI. Nhiều proxy có thể được phân tách bằng ký tự dấu phẩy và sẽ được truy cập tuần tự. Đặt tùy chọn này sẽ khiến ssh (1) kết nối với máy chủ đích bằng cách trước tiên tạo kết nối ssh (1) với máy chủ ProxyJump được chỉ định và sau đó thiết lập chuyển tiếp TCP đến mục tiêu cuối cùng từ đó.

scp -o ProxyJump=user@intermediate user@target:/path

2

Có một giao thức cổ được gọi là ZMODEM : ngày nay có rất ít chương trình hỗ trợ, nhưng khi nó hoạt động, nó có thể khá thuận tiện.

Trước tiên hãy kiểm tra xem chương trình đầu cuối của máy tính xách tay của bạn có hỗ trợ ZMODEM không. (Ví dụ: bạn có thể định cấu hình iTerm2 (trên Mac) để hỗ trợ ZMODEM. Một tập lệnh ví dụ có sẵn ở đây .)

Trong máy văn phòng của bạn, chạy: sudo apt install lrzsz

Bây giờ tất cả những gì bạn phải làm là ssh vào máy văn phòng của bạn và chạy sz (filename). Các tập tin sẽ được tải xuống thông qua thiết bị đầu cuối của bạn.


1

Cấu hình dưới ssh của người dùng: ~/.ssh/config

Host *
    UserKnownHostsFile=/dev/null
    StrictHostKeyChecking=no
    ServerAliveInterval 300
    ServerAliveCountMax 2
    ForwardAgent yes


Host jump server
    HostName server.company.org
    User root

Host jump1 server1
    HostName server1.dmz.company.org
    User root
    ProxyJump jump

Host jump2 server2
    HostName server.dmz2.company.org
    User root
    ProxyJump jump1

Host *.intranet.company.org
    User user
    ProxyJump jump2

Bạn có thể sao chép ngay từ máy chủ mạng nội bộ trực tiếp trên 3 máy chủ nhảy.

scp user@server.intranet.company:/home/user/ ./*

Tôi ưu tiên điều này vì không còn cần phải chỉ định máy chủ nhảy với scp


0

Qua SCP -3:

scp -3 user1@remote1:/root/file1.txt user2@remote2:/root/file1.txt

2
Các -3tùy chọn được mô tả là "bản sao giữa hai máy chủ từ xa sẽ được chuyển qua các máy chủ địa phương." trong khi tôi tin rằng câu hỏi này quy định rằng máy chủ lưu trữ cục bộ không thể truy cập "remote2".
Jeff Schaller

2
@JeffSchaller: bạn kết nối với máy ở giữa, sau đó sử dụng -3. Nhưng điều này giả định rằng bạn có thể kết nối từ máy giữa trở lại máy đầu tiên.
Joe

Tôi không thấy bất kỳ lợi thế của điều này hơn -J/ JumpHost. Hoàn toàn ngược lại vì nó có giới hạn mà @Joe đề cập.
Martin Prikryl
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.