จะดาวน์โหลดไฟล์ผ่านเซิร์ฟเวอร์ SSH ได้อย่างไร?


31

ฉันมีเซิร์ฟเวอร์ในสหรัฐอเมริกา (Linux box B) และพีซีที่บ้านของฉัน (Linux box A) และฉันต้องการดาวน์โหลดไฟล์จากเว็บไซต์ C

ปัญหาคือมันช้ามากในการดาวน์โหลดไฟล์โดยตรงจาก A ดังนั้นฉันต้องดาวน์โหลดไฟล์เมื่อฉันเข้าสู่ระบบ B และ sftpรับไฟล์จาก A

มีวิธีใดบ้างที่ฉันสามารถดาวน์โหลดไฟล์และใช้ B เป็นพร็อกซีโดยตรงผ่านคำสั่งบรรทัดเดียว?

คำตอบ:


46

(สถานการณ์แปลก ๆ ไม่เหมือนสามเหลี่ยมที่ไม่เท่ากันสำหรับการจัดเส้นทางอินเทอร์เน็ตใช่ไหม)

อย่างไรก็ตามพยายามต่อไปนี้ใน, เข้าBมีอาร์กิวเมนต์ssh-D

ssh -D 1080 address-of-B

ซึ่งทำหน้าที่เป็นพร็อกซี SOCKS5 บน127.0.0.1:1080ซึ่งสามารถใช้โดยสิ่งใดก็ตามที่รองรับการเชื่อมต่อพร็อกซี SOCKS5 เห็นได้ชัดว่าwgetสามารถทำได้โดยใช้ตัวแปรสภาพแวดล้อม

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

โปรดทราบว่าบางครั้งcurlมีประโยชน์มากกว่า (เช่นฉันไม่แน่ใจว่าwgetสามารถทำการค้นหาชื่อโฮสต์ผ่าน SOCKS5 ได้หรือไม่ แต่นี่ไม่ใช่ข้อกังวลอย่างหนึ่งของคุณ) Firefox ยังสามารถทำงานได้อย่างสมบูรณ์ผ่านพร็อกซี SOCKS5 ดังกล่าว

แก้ไขฉันเพิ่งสังเกตเห็นว่าคุณกำลังมองหาโซลูชันบรรทัดเดียว แล้วจะเป็นอย่างไร

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

คือการเปลี่ยนเส้นทางของwgetเอาท์พุท - ดึงไปยังstdoutและเปลี่ยนเส้นทางออกในท้องถิ่น (จากการsshทำงานwgetจากระยะไกล) ไปยังไฟล์

ดูเหมือนว่าจะใช้งานได้wgetผลลัพธ์เป็นเพียงความสับสนเล็กน้อย (" บันทึกเป็น - ") คุณสามารถกำจัดมันได้โดยเพิ่ม-qการwgetโทร


6
เห็นได้ชัดว่าSOCKS_SERVERตัวแปรสภาพแวดล้อมไม่มีผลกับ Ubuntu 14.04
kasperd

4
ตามคำตอบอื่น ๆ , wgetมีการสนับสนุนไม่มีSOCKS_SERVERตัวแปร คำตอบที่แสดงให้เห็นการใช้หรือcurl --socks5-hostname curl --socks5
Denilson Sá Maia

@kasperd ดังนั้นมันเป็นแค่อูบุนตูที่มันใช้งานไม่ได้หรือเป็นตัวแปรที่ไม่เกี่ยวข้องกับ wget เลย? ปรากฏว่าตัวแปรอาจใช้socksifyแทน
cnst

@cnst ฉันไม่เคยเห็นหลักฐานที่แสดงว่า wget ทุกรุ่นมีถุงเท้ารองรับ socksifyไม่ใช่การตั้งค่า แต่เป็นโปรแกรมแยกต่างหาก
kasperd

ดังนั้นโดยทั่วไปถ้าคุณต้องการSOCKS_SERVERมีผลกระทบใด ๆwgetคุณต้องติดตั้งพอร์ต. su / ความปลอดภัย / danteแล้วเรียกใช้socksify wgetแทนเพียงแค่wget
cnst

3

วิธีการอื่นอาจเป็นได้ว่าโดยปกติคุณเข้าสู่ระบบBที่คุณเริ่มscreenเซสชั่น ที่นั่นคุณทำwgetไฟล์ของคุณ - ทั้งหมดไว้ในไดเรกทอรีเดียว

และโปรแกรมก็สามารถรันได้อย่างมีความสุข คุณเพิ่งแยกออกจากหน้าจอ แต่ปล่อยให้มันทำงานในพื้นหลัง

หากการดาวน์โหลดเสร็จสิ้น (อาจจะเร็วกว่านี้) คุณสามารถ fech ข้อมูลจากBไปยังการAใช้rsync(การตั้งค่าของฉัน)


2

แรงบันดาลใจจากคำตอบสำหรับคำถามอื่นฉันขอแนะนำให้ใช้proxychains-ng (ซึ่งเป็นรุ่นที่ใหม่กว่าของproxychains )

  1. ดาวน์โหลดรวบรวมและเลือกที่จะติดตั้งproxychains-ng
  2. สร้างproxychains.confแฟ้มในไดเรกทอรีปัจจุบันหรือที่หรือที่ ~/.proxychains/proxychains.conf/etc/proxychains.conf
    • อีกวิธีหนึ่งคือสร้างไฟล์หนึ่งที่ใดก็ได้หรือด้วยชื่ออื่นแล้วระบุว่าผ่าน-fอาร์กิวเมนต์บรรทัดคำสั่งหรือผ่านPROXYCHAINS_CONF_FILEตัวแปรสภาพแวดล้อม
    • มีไฟล์กำหนดค่าตัวอย่างที่ใช้ได้ ตัวเลือกที่เกี่ยวข้องที่สุดอยู่ท้ายที่สุด
  3. ในproxychains.confไฟล์ของคุณเพิ่ม:

    [ProxyList]
    socks5 127.0.0.1 1234
    
  4. ssh -D 1234 your_host_bวิ่ง สิ่งนี้จะทำให้ ssh ฟังพอร์ต 1234 บน localhost และใช้รีโมตโฮสต์ของคุณเป็นพร็อกซี SOCKS

    • หรือเรียกใช้ssh -ND 1234 your_host_bแทน -Nจะป้องกัน ssh ไม่ให้รันคำสั่งใด ๆ บนเซิร์ฟเวอร์ระยะไกล (เช่นจะไม่เปิดเชลล์)
  5. proxychains4 yourcommandhere yourparametershereเรียกใช้: ดูตัวอย่าง:
    • proxychains4 wget -O - http://ifconfig.co/
    • proxychains4 -q links http://ifconfig.co/

2

ตัวเลือก 0:

ในการใช้งานwgetกับพร็อกซี SOCKS5 จากsshคุณจะต้องติดตั้งsecurity/danteแพคเกจเพื่อใช้SOCKS_SERVERตัวเลือกกับsocksifyยูทิลิตี้

sudo pkg_add dante

จากนั้นคุณเปิดการเชื่อมต่อ SSH ในพื้นหลัง:

ssh -N -C -D1080 user@hostB &

และใช้ wget ผ่านพร็อกซี SOCKS5 ผ่านถุงเท้า:

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

ตัวเลือกที่ 1:

เพียงไพพ์ไฟล์ไปที่stdoutบนเซิร์ฟเวอร์และอ่านจากstdinบนเวิร์กสเตชันของคุณ

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

1

คุณสามารถทำ ssh tunnel จากกล่อง A ไปยังกล่อง B และเพิ่มตารางการเราต์ในกล่อง A เว็บไซต์ C นั้นสามารถเข้าถึงได้ผ่านทาง tunnel ไปยังกล่อง B คุณต้องอนุญาตให้ส่งต่อแพ็กเก็ตบนกล่อง B

ที่นี่คุณสามารถดูบทแนะนำทีละขั้นตอนที่ดีมาก ...


1

คุณจะต้องสร้างอุโมงค์ในเครื่อง B tha จะเปลี่ยนเส้นทางการโทรไปยังเว็บไซต์ C แต่ฉันสับสนเพราะเหตุนี้จะเร็วขึ้นเว้นแต่ ISP ของคุณเป็นข้อ จำกัด บางอย่าง

ฉันไม่รู้จักผู้ใช้บริการออนไลน์ แต่มันไม่ซับซ้อนกว่านี้มากนัก

บนเครื่อง A คุณทำ (ฉันเอา 11111 แบบสุ่มคุณสามารถเอาอะไรก็ได้ที่คุณต้องการตราบใดที่> 1024 หรือคุณต้องรูท)

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

ชื่อผู้ใช้บน B คือชื่อที่คุณใช้เชื่อมต่อกับ B สิ่งนี้ควรสร้างช่องสัญญาณบนพอร์ต 11111 บนเครื่อง B ที่เปลี่ยนเส้นทางไปยังพอร์ต 80 (เว็บไซต์ใน HTTP ใช้ 443 สำหรับ HTTPS) บนเครื่อง C (ฉันหวังว่าฉันจะไม่ยุ่ง การสั่งซื้อสินค้า ;) )

จากนั้นคุณสามารถดาวน์โหลดไฟล์ได้โดยตรงจากเครื่อง A ผ่านเครื่อง B ฉันกำลังสมมติว่าไฟล์อยู่ที่http://C/path/to/fileดังนั้นคุณจะต้องใช้:

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

จะใช้งานไม่ได้เฉพาะในกรณีที่ไฟล์นั้นสามารถเข้าถึงได้โดยไม่ใช้โฮสต์เสมือนที่ใช้ชื่อ HTTP 1.1 ตั้งแต่คำขอ GET ที่ออกโดย wget จะระบุชื่อโฮสต์เป็น B ไม่ใช่ C
CVn

@ MichaelKjörlingฉันไม่มีความรู้เพียงพอที่จะตอบคุณ
Huygens

1

คุณสามารถทำได้ผ่านการส่งต่อพอร์ต (ssh tunneling) นี่คือทรัพยากร: http://www.jfranken.de/homepages/johannes/vortraege/ssh2_inhalt.en.html#ToC9

โดยพื้นฐานแล้วคุณควรตั้งค่าการส่งต่อพอร์ตบน B เมื่อปัญหาที่ wget เป็น B, B จะส่งต่อแพ็กเก็ตไปยัง C และส่งผลลัพธ์กลับไปที่ A

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.