Làm cách nào để tải xuống tệp qua máy chủ SSH?


31

Tôi có một máy chủ ở Hoa Kỳ (Linux hộp B) và PC tại nhà của tôi (Linux hộp A) và tôi cần tải xuống một tệp từ trang web C,

Vấn đề là, rất chậm để tải xuống một tệp trực tiếp từ A, vì vậy tôi cần tải xuống tệp khi tôi đăng nhập B và sftpnhận tệp từ A.

Có cách nào để tôi có thể tải xuống tệp và sử dụng B làm proxy trực tiếp chỉ bằng một lệnh không?

Câu trả lời:


46

(Tình huống kỳ lạ, không phải thứ gì đó giống như bất đẳng thức tam giác giữ cho định tuyến internet?)

Dù sao, hãy thử như sau, trên A , sshvào B với một -Dđối số,

ssh -D 1080 address-of-B

hoạt động như một proxy SOCKS5 127.0.0.1:1080, có thể được sử dụng bởi bất kỳ thứ gì hỗ trợ các kết nối được ủy quyền của SOCKS5. Rõ ràng, wgetcó thể làm điều này , bằng cách sử dụng biến môi trường

export SOCKS_SERVER=127.0.0.1:1080
wget http://server-C/whatever

Lưu ý rằng đôi khi curltiện dụng hơn (nghĩa là tôi không chắc wgetcó thể thực hiện tra cứu tên máy chủ thông qua SOCKS5 hay không, nhưng đây không phải là một trong những mối quan tâm của bạn mà tôi cho là); Firefox cũng có thể hoạt động hoàn toàn thông qua proxy SOCKS5 như vậy.

Chỉnh sửa Tôi vừa nhận thấy rằng bạn đang tìm kiếm một giải pháp một dòng . Chà, thế còn

ssh address-of-B 'wget -O - http://server-C/whatever' >> whatever

tức là chuyển hướng wgetđầu ra được tìm nạp đến stdoutvà chuyển hướng đầu ra cục bộ (từ sshchạy wgettừ xa) sang một tệp.

Điều này dường như hoạt động, wgetđầu ra chỉ là một chút khó hiểu ("được lưu vào - "), bạn có thể thoát khỏi nó bằng cách thêm -qvào wgetcuộc gọi.


6
Rõ ràng SOCKS_SERVERbiến môi trường không có tác dụng trên Ubuntu 14.04.
kasperd

4
Theo câu trả lời khác này , wgetkhông có hỗ trợ cho SOCKS_SERVERbiến. Câu trả lời đó gợi ý sử dụng curl --socks5-hostnamehoặc curl --socks5.
Denilson Sá Maia

@kasperd, vì vậy, nó chỉ là Ubuntu, nơi nó không hoạt động, hay là biến không liên quan đến wget? thay vào đó, có vẻ như biến đó có thể socksifythay thế
cnst

@cnst Tôi chưa thấy bằng chứng nào cho thấy phiên bản wget nào có vớ hỗ trợ. socksifykhông phải là một thiết lập, nó là một chương trình riêng biệt.
kasperd

vì vậy, về cơ bản, nếu bạn muốn SOCKS_SERVERcó bất kỳ ảnh hưởng nào wget, thì bạn phải cài đặt cổng.su / security / dante , và sau đó chạy socksify wgetthay vì chỉwget
cnst

3

Một cách tiếp cận khác có thể là bạn thường đăng nhập vào B, nơi bạn bắt đầu một screenphiên. Ở đó bạn làm các wgettập tin của bạn - tất cả vào một thư mục.

Và ở đó chương trình có thể vui vẻ chạy; bạn chỉ cần tách khỏi màn hình, nhưng để nó chạy trong nền.

Nếu tải xong (thậm chí có thể sớm hơn), bạn có thể fech dữ liệu từ Bđể Asử dụng rsync(sở thích của tôi).


2

Lấy cảm hứng từ một câu trả lời khác cho một câu hỏi khác , tôi đề nghị sử dụng proxychains-ng (là phiên bản mới hơn của proxy ).

  1. Tải xuống, biên dịch và tùy chọn cài đặt proxychains-ng .
  2. Tạo một proxychains.conftệp trong thư mục hiện tại, hoặc tại ~/.proxychains/proxychains.conf, hoặc tại /etc/proxychains.conf.
    • Hoặc, tạo một tệp ở bất kỳ nơi nào khác hoặc với tên khác và chỉ định nếu thông qua -fđối số dòng lệnh hoặc thông qua PROXYCHAINS_CONF_FILEbiến môi trường.
    • Có một tập tin cấu hình mẫu có sẵn. Các tùy chọn có liên quan nhất là ở cuối.
  3. Trong proxychains.conftệp của bạn , thêm:

    [ProxyList]
    socks5 127.0.0.1 1234
    
  4. Chạy đi ssh -D 1234 your_host_b. Điều này sẽ khiến ssh lắng nghe trên cổng 1234 trên localhost và sử dụng máy chủ từ xa của bạn làm proxy SOCKS.

    • Thay ssh -ND 1234 your_host_bvào đó , chạy thay thế. -Nsẽ ngăn ssh chạy bất kỳ lệnh nào trên máy chủ từ xa (tức là nó sẽ không mở shell).
  5. Chạy : proxychains4 yourcommandhere yourparametershere. Xem một số ví dụ:
    • proxychains4 wget -O - http://ifconfig.co/
    • proxychains4 -q links http://ifconfig.co/

2

Tùy chọn 0:

Để sử dụng wgetvới proxy SOCKS5 từ ssh, bạn phải cài đặt security/dantegói để sử dụng SOCKS_SERVERtùy chọn với socksifytiện ích.

sudo pkg_add dante

Sau đó, bạn mở một kết nối SSH trong nền:

ssh -N -C -D1080 user@hostB &

Và sử dụng wget thông qua proxy SOCKS5 thông qua vớify:

env SOCKS_SERVER=127.0.0.1:1080 socksify wget http://website-C

Lựa chọn 1:

Chỉ cần đặt tệp stdoutvào máy chủ và đọc nó từ stdintrên máy trạm của bạn.

ssh -C user@hostB "wget -O- http://website-C" >> file-from-website-C

1

Bạn có thể thực hiện một đường hầm ssh từ hộp A đến hộp B và thêm vào bảng định tuyến trong hộp A, trang web C có thể truy cập thông qua đường hầm đến hộp B. Bạn phải cho phép chuyển tiếp gói trên hộp B.

Ở đây bạn có thể thấy một hướng dẫn từng bước rất tốt ...


1

Bạn sẽ cần tạo một đường hầm trên máy B tha sẽ chuyển hướng cuộc gọi đến trang web C. Nhưng tôi bối rối vì tại sao điều này sẽ nhanh hơn, trừ khi ISP của bạn có một số hạn chế.

Tôi không biết một oneliner, nhưng điều này không phức tạp hơn nhiều.

Trên máy A, bạn làm (tôi lấy ngẫu nhiên 1111, bạn có thể lấy bất cứ thứ gì bạn muốn miễn là> 1024, hoặc bạn sẽ cần phải root)

ssh -f -C -N -L 11111:C:80 username@B

Tên người dùng trên B là tên bạn sử dụng để kết nối với B. Điều này sẽ tạo một đường hầm trên cổng 11111 trên máy B chuyển hướng đến cổng 80 (trang web trong HTTP sử dụng 443 cho HTTPS) trên máy C (Tôi hy vọng tôi không làm phiền mệnh lệnh ;) )

Sau đó, bạn có thể tải xuống tệp trực tiếp từ máy A qua máy B. Tôi giả sử tệp đang ở http://C/path/to/filenên bạn sẽ sử dụng:

wget http://B:11111/path/to/file

Điều này sẽ không hoạt động chỉ khi tệp có thể truy cập mà không có lưu trữ ảo dựa trên tên HTTP 1.1? Vì yêu cầu GET được phát hành bởi wget sẽ ghi tên máy chủ là B, không phải C.
CVn

@ MichaelKjorling Tôi không có đủ kiến ​​thức để trả lời bạn.
Huygens

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.