Cách quét bằng máy chủ từ xa thứ hai


82

Tôi tự hỏi liệu có cách nào để tôi có thể SCP tệp từ máy chủ remote2 trực tiếp từ máy cục bộ của tôi bằng cách chuyển qua máy chủ remote1 không.

Các mạng chỉ cho phép kết nối với máy chủ remote2 từ máy chủ remote1. Ngoài ra, cả máy chủ remote1 và máy chủ remote2 đều không thể truy cập vào máy cục bộ của tôi.

Có một cái gì đó như:

scp user1@remote1:user2@remote2:file .

Cửa sổ đầu tiên : ssh remote1, sau đó scp remot2:file ..

Vỏ thứ hai: scp remote1:file .

Cửa sổ đầu tiên: rm file; logout

Tôi có thể viết một kịch bản để thực hiện tất cả các bước này, nhưng nếu có một cách trực tiếp, tôi muốn sử dụng nó.

Cảm ơn.

EDIT: Tôi đang nghĩ một cái gì đó giống như mở đường hầm SSH nhưng tôi bối rối không biết giá trị nào để đặt ở đâu.

Hiện tại, để truy cập remote1, tôi có phần sau $HOME/.ssh/configtrên máy cục bộ của mình.

Host remote1
   User     user1
   Hostname localhost
   Port     45678

Sau khi remote1truy cập remote2, đó là DNS cục bộ tiêu chuẩn và cổng 22. Tôi nên đặt remote1và / hoặc thay đổi những localhostgì?

Câu trả lời:


94

Tôi không biết có cách nào để sao chép tệp trực tiếp trong một lệnh duy nhất, nhưng nếu bạn có thể chấp nhận chạy một phiên bản SSH trong nền để chỉ giữ một đường hầm chuyển tiếp cổng mở, thì bạn có thể sao chép tệp trong một lệnh.

Như thế này:

# 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 .

Lưu ý rằng bạn kết nối như user2@localhosttrong scplệnh thực , vì nó nằm trên cổng 1234 trên localhost mà phiên bản đầu tiên sshđang lắng nghe các kết nối chuyển tiếp tới remote2. Cũng lưu ý rằng bạn không cần phải chạy lệnh đầu tiên cho mọi bản sao tệp tiếp theo; bạn chỉ cần để nó chạy.


1
Cảm ơn, điều này có vẻ là gần những gì tôi cần. Vì vậy, tôi đã tạo đường hầm, dấu vân tay khớp với dấu vân tay của máy chủ, nhưng tôi gặp lỗi "Permision từ chối (khóa công khai)". Tôi nghĩ rằng tôi cần phải hỏi mạng / sysadmin của mình tại sao nó không hoạt động.
Danosaure

3
Cảm ơn! Tôi đã phải thay đổi -p 45678thành -p 22vì SSH từ xa1 của tôi đang nghe cổng 22
Montaro

Tôi cũng đã phải sử dụng -p 22thay vì -p 45678. Cũng scp -P 1234 ...không làm việc cho tôi. Tôi đang nhận được ssh: connect to host localhost port 1234: Connection refused. Khi tôi thử với scp -P 22 ...nó, nó hoạt động nhưng nó đang sao chép tệp vào remote 1chứ không phải trên máy cục bộ của tôi ( remote2).
tội nhân

Bất kỳ công cụ giao diện người dùng nào cho giống nhau?
ExploringApple

70

Gấp đôi ssh

Ngay cả trong trường hợp phức tạp của bạn, bạn có thể xử lý việc chuyển tệp bằng một dòng lệnh đơn giản với ssh;-)
Và điều này rất hữu ích nếu remote1không thể kết nối với localhost:

ssh user1@remote1 'ssh user2@remote2 "cat file"' > file

tar

Nhưng bạn bị mất các thuộc tính tệp (quyền sở hữu, quyền ...).

Tuy nhiên, tarbạn của bạn có giữ các thuộc tính tệp này không:

ssh user1@remote1 'ssh user2@remote2 "cd path2; tar c file"' | tar x

Bạn cũng có thể nén để giảm băng thông mạng:

ssh user1@remote1 'ssh user2@remote2 "cd path2; tar cj file"' | tar xj

tarcũng cho phép bạn chuyển một thư mục đệ quy thông qua cơ bản ssh:

ssh user1@remote1 'ssh user2@remote2 "cd path2; tar cj ."' | tar xj

ionice

Nếu tệp lớn và bạn không muốn làm phiền các ứng dụng mạng quan trọng khác, bạn có thể bỏ lỡ giới hạn thông lượng mạng được cung cấp bởi scprsynccác công cụ (ví dụ: scp -l 1024 user@remote:filekhông sử dụng nhiều hơn 1 Mbits / giây).

Tuy nhiên, một giải pháp được sử dụng ioniceđể giữ một dòng lệnh duy nhất:

ionice -c2 -n7 ssh u1@remote1 'ionice -c2 -n7 ssh u2@remote2 "cat file"' > file

Lưu ý: ionicecó thể không có trên các bản phân phối cũ.


Cảm ơn tất cả các mô tả, nhưng tôi nghĩ giải pháp của Dolda2000 dễ dàng hơn. Đó là điều mà tôi đã cố gắng nhưng không thể tìm ra.
Danosaure

5
Đây là một câu trả lời hay và xứng đáng được bình chọn nhiều hơn. Ngoài ra, nó dễ hơn nhiều so với câu trả lời được chấp nhận theo ý kiến ​​của tôi.
Rik Smith-Unna

2
Tôi đồng ý đây là một giải pháp tốt hơn câu trả lời được chấp nhận. Bằng cách này, kết nối sẽ tự động được dọn dẹp.
Doug

Cảm ơn bạn, câu trả lời rất hay! Còn ngược lại, sao chép từ cục bộ sang từ xa thì sao?
DomTomCat

31

Điều này sẽ thực hiện thủ thuật:

scp -o 'Host remote2' -o 'ProxyCommand ssh user@remote1 nc %h %p' \ 
    user@remote2:path/to/file .

Để SCP remote2trực tiếp tệp từ máy chủ lưu trữ , hãy thêm hai tùy chọn ( HostProxyCommand) vào tệp ~ / .ssh / config của bạn (xem thêm câu trả lời này trên superuser). Sau đó, bạn có thể chạy:

scp user@remote2:path/to/file .

từ máy cục bộ của bạn mà không cần phải suy nghĩ về remote1.


Cách tiếp cận tốt! Mặc dù -o 'Host remote2'dường như không thực sự cần thiết khi khởi chạy từ dòng lệnh (tức là sao chép một lần mà không cần chạm vào ~ / .ssh / config)
Mike

Ở đây cũng vậy. Điều này làm việc cho tôi mà không cần -o 'Host remote2'. Cảm ơn.
tội nhân

7

Với phiên bản openssh 7.3 trở lên thật dễ dàng. Sử dụng tùy chọn ProxyJump trong tệp cấu hình.

# 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  

Các lệnh chạy để đăng nhập hoặc sao chép

ssh appMachine   # no need to specify any tunnel. 
scp helloWorld.txt appMachine:.   # copy without intermediate jumphost/bastion host copy.** 

tất nhiên bạn có thể chỉ định máy chủ lưu trữ bastion Jump bằng cách sử dụng tùy chọn "-J" cho lệnh ssh, nếu không được cấu hình trong tệp cấu hình.

Lưu ý scp không không dường như hỗ trợ "-J" cờ như của bây giờ. (Tôi không thể tìm thấy trong các trang nam. Tuy nhiên ở trên scp hoạt động với cài đặt tệp cấu hình)


1
Không cần thêm máy chủ bastion vào tệp cấu hình nếu nó chỉ được sử dụng cho proxy (tức là không có IdentityFile khác, v.v.), chỉ cần thêm ProxyJump bastion.client.com vào phần appMachine.
Tomer Cohen

1

Có một tùy chọn mới trong scpđó bổ sung gần đây cho chính xác công việc này rất thuận tiện, đó là -3.

TL; DR Đối với máy chủ hiện tại đã thiết lập xác thực trong tệp cấu hình ssh, chỉ cần thực hiện:

scp -3 remote1:file remote2:file

Của bạn scpphải từ các phiên bản gần đây.

Tất cả các kỹ thuật được đề cập khác yêu cầu bạn thiết lập xác thực từ remote1 đến remote2 hoặc ngược lại, điều này không phải lúc nào cũng là một ý kiến ​​hay.
Đối số -3có nghĩa là bạn muốn di chuyển tệp từ hai máy chủ từ xa bằng cách sử dụng máy chủ hiện tại làm trung gian và máy chủ này thực sự thực hiện xác thực cho cả hai máy chủ từ xa, vì vậy chúng không cần phải có quyền truy cập vào nhau.
Bạn chỉ cần thiết lập xác thực trong các tệp cấu hình ssh, khá dễ dàng và được ghi chép đầy đủ, sau đó chỉ cần chạy lệnh trong TL; DR

Nguồn cho câu trả lời này là https://superuser.com/a/686527/713762


0

Cấu hình này hoạt động tốt đối với tôi:

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

Sau đó, lệnh

scp myfile production:~

Sao chép myfile vào máy sản xuất .


0

Bổ sung nhỏ cho giải pháp của Olibre ở đây, mà tôi đã làm việc bằng cách sử dụng nguồn này .

Cũng như bạn có ba cách để sử dụng tarđể sao chép từ máy chủ từ xa sang máy chủ cục bộ, các cách sau phù hợp với việc sao chép máy chủ cục bộ sang máy chủ từ xa trong các trường hợp ssh kép: (chạy chúng trong thư mục nơi tệp phải được sao chép từ đó, nếu không hãy sử dụng fullpath / filename)

Chuyển một tệp mà không cần nén:

tar c filename |  ssh user1@remote1 'ssh -Y user2@remote2 "path2 && tar x"'

Chuyển một tập tin có nén:

tar cj filename |  ssh user1@remote1 'ssh -Y user2@remote2 "path2 && tar xj"'

Chuyển thư mục đệ quy:

tar cj . |  ssh user1@remote1 'ssh -Y user2@remote2 "path2 && tar xj"'

Dấu && ở đây ngăn lệnh chạy nếu nửa đầu của lệnh không hoạt động - ví dụ: nếu thiếu thư mục hoặc có lỗi trong tên đường dẫn nguồn / đích.

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.