Hoe een bestand downloaden via een SSH-server?

Ik heb een server in de VS (Linux box B) en mijn pc thuis (Linux box A), en ik moet een bestand downloaden van website C,

Het probleem is, het is erg traag om een ​​bestand rechtstreeks van A te downloaden, dus ik moet het bestand downloaden wanneer ik me aanmeld in B, en sftp krijg het bestand van A.

Is er een manier dat ik het bestand kan downloaden en B als proxy rechtstreeks kan gebruiken via slechts één regelopdracht?

27

7 antwoord

(Vreemde situatie, houdt iets als de driehoeksongelijkheid vast voor internetroutering?)

Probeer in elk geval het volgende op A , ssh in B met een argument -D ,

ssh -D 1080 address-of-B

welke fungeert als een SOCKS5-proxy op 127.0.0.1:1080 , die kan worden gebruikt door alles dat SOCKS5 proxy-verbindingen ondersteunt. Blijkbaar kan wget dit doen , door de omgevingsvariabele te gebruiken

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

Merk op dat soms curl handiger is (dat wil zeggen, ik weet niet zeker of wget hostname-opzoekingen kan doen via SOCKS5, maar dit is niet een van uw zorgen, veronderstel ik); Firefox kan ook volledig werken via zo'n SOCKS5-proxy.

Edit I've just now noticed that you're looking for a one-line solution. Well, how about

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

ie omleiding van de wget -gehaalde output naar stdout en omleiden van de lokale output (van ssh met wget op afstand) naar een bestand.

Dit lijkt te werken, de wget -uitvoer is slechts een beetje verwarrend (" opgeslagen in - "), je kunt het verwijderen door -q naar de aanroep wget .

42
toegevoegd
Volgens dit andere antwoord heeft wget geen ondersteuning voor SOCKS_SERVER variabel. Dat antwoord suggereert het gebruik van curl --socks5-hostname of curl --socks5 .
toegevoegd de auteur Yossi, de bron
Blijkbaar heeft de omgevingsvariabele SOCKS_SERVER geen effect op Ubuntu 14.04.
toegevoegd de auteur kasperd, de bron
@cnst Ik heb geen bewijs gezien dat elke versie van wget sokken ondersteunt. socksify is geen instelling, het is een apart programma.
toegevoegd de auteur kasperd, de bron
@kasperd, dus, is het gewoon ubuntu waar het niet werkt, of is de variabele helemaal niet gerelateerd aan wget? het lijkt erop dat de variabele voor socksify is.
toegevoegd de auteur user28354, de bron
dus, in principe, als je wilt dat SOCKS_SERVER effect heeft op wget , dan moet je ports.su/security/dante en voer dan socksify wget uit in plaats van alleen wget
toegevoegd de auteur user28354, de bron

Een andere benadering zou kunnen zijn dat u zich normaal gesproken aanmeldt bij B , waar u een scherm -sessie start. Daar doet u de wget van uw bestanden - alles in één map.

En daar kan het programma met plezier worden uitgevoerd; je maakt gewoon los van het scherm, maar laat het op de achtergrond draaien.

Als de downloads zijn voltooid (misschien zelfs eerder), kunt u de gegevens van B in A gebruiken met rsync (mijn voorkeur).

3
toegevoegd

Geïnspireerd door nog een antwoord op een andere vraag , raad ik aan om proxychains-ng (dit is de nieuwere versie van proxychains ) .

  1. Download, compile, and optionally install proxychains-ng.
  2. Create a proxychains.conf file in the current directory, or at ~/.proxychains/proxychains.conf, or at /etc/proxychains.conf.
    • Alternatively, create one file anywhere else, or with another name, and specify if through -f command-line argument, or through PROXYCHAINS_CONF_FILE environment variable.
    • There is a sample config file available. The most relevant options are at the very end.
  3. In your proxychains.conf file, add:

    [ProxyList]
    socks5 127.0.0.1 1234
    
  4. Run ssh -D 1234 your_host_b. This will make ssh listen on port 1234 on localhost, and use your remote host as a SOCKS proxy.

    • Alternatively, run ssh -ND 1234 your_host_b instead. -N will prevent ssh from running any command on the remote server (i.e. it won't open a shell).
  5. Run: proxychains4 yourcommandhere yourparametershere. See some examples:
    • proxychains4 wget -O - http://ifconfig.co/
    • proxychains4 -q links http://ifconfig.co/
2
toegevoegd

U zou een tunnel op machine B moeten maken die de doorverwijzing naar website C zou omleiden. Maar ik ben verbaasd waarom dit sneller zou zijn, tenzij uw ISP als enkele beperkingen.

Ik ken geen oneliner, maar dit is niet veel ingewikkelder.

On machine A, you do (I took 11111 randomly, you can take whatever you want as long as it is > 1024, or you would need to be root)

ssh -f -C -N -L 11111:C:80 [email protected]

De gebruikersnaam op B is degene die u gebruikt om verbinding te maken met B. Dit moet een tunnel maken op poort 11111 op machine B die omleidt naar poort 80 (website in HTTP gebruik 443 voor HTTPS) op machine C (ik hoop dat ik niet rommelig heb gemaakt de bestelling ;) )

Vervolgens kunt u het bestand rechtstreeks van machine A via machine B downloaden. Ik neem aan dat het bestand zich op http://C/pad/naar/bestand bevindt, zodat u vervolgens het volgende kunt gebruiken:

wget http://B:11111/path/to/file
1
toegevoegd
Zou dit niet alleen werken als het bestand toegankelijk is zonder HTTP 1.1 op naam gebaseerde virtuele hosting? Aangezien het GET-verzoek van wget de hostnaam zou vermelden als B, niet als C.
toegevoegd de auteur Michael Kjörling, de bron
@ MichaelKjörling Ik heb niet genoeg kennis om je te beantwoorden.
toegevoegd de auteur jason, de bron

U kunt een ssh-tunnel uitvoeren vanuit box A naar box B en toevoegen aan de routeringstabel in vak A, die website C bereikbaar is via tunnel naar box B. U moet pakketdoorschakeling toestaan ​​in vak B.

Here you can see a very good step-by-step tutorial...

1
toegevoegd

You can do this via port forwarding (ssh tunneling). Here's a resource: http://www.jfranken.de/homepages/johannes/vortraege/ssh2_inhalt.en.html#ToC9

In principe moet u port forwarding instellen op B. Wanneer een probleem naar B wordt verplaatst, stuurt B de pakketten door naar C en stuurt de resultaten terug naar A.

1
toegevoegd

Optie 0:

Om wget te gebruiken met een SOCKS5-proxy van ssh , u moet de security/dante pakket om de optie SOCKS_SERVER te gebruiken met het hulpprogramma socksify .

sudo pkg_add dante

Vervolgens open je een SSH-verbinding op de achtergrond:

ssh -N -C -D1080 [email protected] &

En gebruik wget via een SOCKS5-proxy via socksify:

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

Optie 1:

Pijp het bestand gewoon naar stdout op de server en lees het van stdin af op uw werkstation.

ssh -C [email protected] "wget -O- http://website-C" >> file-from-website-C
1
toegevoegd