Jak pobrać plik przez serwer SSH?

31

Mam serwer w USA (Linux B) i mój domowy komputer (Linux A) i muszę pobrać plik ze strony C,

Problem polega na tym, że pobieranie pliku bezpośrednio z A jest bardzo powolne, więc muszę pobrać plik po zalogowaniu się B i sftppobrać plik z A.

Czy jest jakiś sposób, że mogę pobrać plik i użyć B jako proxy bezpośrednio za pomocą tylko jednego polecenia wiersza?

linjunhalida
źródło

Odpowiedzi:

46

(Dziwna sytuacja, czy coś takiego jak nierówność trójkąta nie dotyczy routingu przez Internet?)

W każdym razie wypróbuj poniższe, na A , sshdo B z -Dargumentem,

ssh -D 1080 address-of-B

który działa jako serwer proxy SOCKS5 127.0.0.1:1080, z którego można korzystać we wszystkich elementach obsługujących połączenia proxy SOCKS5. Najwyraźniej wgetmożna to zrobić za pomocą zmiennej środowiskowej

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

Zauważ, że czasami curljest to bardziej przydatne (tzn. Nie jestem pewien, czy wgetmogę wyszukiwać nazwy hostów za pośrednictwem SOCKS5; ale nie jest to jedna z twoich obaw); także Firefox jest w stanie działać całkowicie za pośrednictwem takiego proxy SOCKS5.

Edit Właśnie teraz zauważyła, że szukasz w jednej linii rozwiązania. A co powiesz na to?

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

tj. przekierowanie wgetwyjścia -fetched do stdouti przekierowanie lokalnego wyjścia (z zdalnego sshuruchamiania wget) do pliku.

Wydaje się, że to działa, wgetwyjście jest trochę mylące („ zapisane w - ”), możesz się go pozbyć, dodając -qdo wgetwywołania.

sr_
źródło
6
Najwyraźniej SOCKS_SERVERzmienna środowiskowa nie ma wpływu na Ubuntu 14.04.
kasperd
4
Zgodnie z tą inną odpowiedzią , wgetnie ma wsparcia dla SOCKS_SERVERzmiennej. Ta odpowiedź sugeruje użycie curl --socks5-hostnamelub curl --socks5.
Denilson Sá Maia,
@kasperd, więc czy to po prostu ubuntu tam, gdzie nie działa, czy zmienna w ogóle nie jest powiązana z wget? wydaje się, że zmienna może być socksifyzamiast.
cnst
@ cnst Nie widziałem żadnych dowodów na to, że jakakolwiek wersja wget ma obsługę skarpet. socksifynie jest ustawieniem, to osobny program.
kasperd
więc, w zasadzie, jeśli chcesz SOCKS_SERVERmieć jakikolwiek wpływ wget, musisz zainstalować ports.su/security/dante , a następnie uruchomić socksify wgetzamiastwget
cnst
3

Innym podejściem może być to, że zwykle logujesz się w miejscu B, w którym zaczynasz screensesję. Tam robisz wgetswoje pliki - wszystko w jednym katalogu.

I tam program z radością może działać; po prostu odłączysz się od ekranu, ale pozwól mu działać w tle.

Jeśli pobieranie zostanie zakończone (może nawet wcześniej), możesz wybrać dane od Bdo Aużywania rsync(moje preferencje).

glglgl
źródło
2

Zainspirowany innym odpowiedź na inne pytanie , proponuję przy użyciu proxychains-ng (która jest nowsza wersja proxychains ).

  1. Pobierz, skompiluj i opcjonalnie zainstaluj proxy-łańcuchy .
  2. Utwórz proxychains.confplik w bieżącym katalogu, w ~/.proxychains/proxychains.conflub w /etc/proxychains.conf.
    • Ewentualnie utwórz jeden plik gdziekolwiek indziej lub pod inną nazwą i określ, czy poprzez -fargument wiersza poleceń, czy poprzez PROXYCHAINS_CONF_FILEzmienną środowiskową.
    • Dostępny jest przykładowy plik konfiguracyjny . Najbardziej odpowiednie opcje są na samym końcu.
  3. W swoim proxychains.confpliku dodaj:

    [ProxyList]
    socks5 127.0.0.1 1234
    
  4. Uruchom ssh -D 1234 your_host_b. Spowoduje to, że ssh nasłuchuje na porcie 1234 na localhost i użyje twojego zdalnego hosta jako proxy SOCKS.

    • Alternatywnie uruchom ssh -ND 1234 your_host_bzamiast tego. -Nzapobiegnie uruchomieniu przez ssh dowolnej komendy na zdalnym serwerze (tzn. nie otworzy powłoki).
  5. Run: proxychains4 yourcommandhere yourparametershere. Zobacz kilka przykładów:
    • proxychains4 wget -O - http://ifconfig.co/
    • proxychains4 -q links http://ifconfig.co/
Denilson Sá Maia
źródło
2

Opcja 0:

Aby korzystać wgetz proxy SOCKS5 z ssh, musisz zainstalować security/dantepakiet, aby móc korzystać z SOCKS_SERVERopcji socksifynarzędzia.

sudo pkg_add dante

Następnie otwierasz połączenie SSH w tle:

ssh -N -C -D1080 user@hostB &

I użyj wget poprzez proxy SOCKS5 poprzez socksify:

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

Opcja 1:

Po prostu potokuj plik stdoutna serwerze i odczytaj go ze stdinstacji roboczej.

ssh -C user@hostB "wget -O- http://website-C" >> file-from-website-C
cnst
źródło
1

Możesz wykonać tunel ssh z pola A do pola B i dodać do tabeli routingu w polu A, że strona C jest osiągalna przez tunel do skrzynki B. Musisz zezwolić na przekazywanie pakietów na polu B.

Tutaj możesz zobaczyć bardzo dobry samouczek krok po kroku ...

Jan Marek
źródło
1

Będziesz musiał stworzyć tunel na maszynie B, który przekierowałby połączenie do strony C. Ale zastanawiam się, dlaczego byłoby to szybsze, chyba że twój dostawca usług internetowych stanowiłby pewne ograniczenia.

Nie znam onelinera, ale to nie jest dużo bardziej skomplikowane.

Na komputerze A robisz (losowo wziąłem 11111, możesz wziąć, co chcesz, dopóki jest to> 1024, albo musisz być rootem)

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

Nazwa użytkownika na B jest tą, której używasz do łączenia się z B. To powinno utworzyć tunel na porcie 11111 na komputerze B, który przekierowuje do portu 80 (strona internetowa w HTTP używa 443 dla HTTPS) na komputerze C (mam nadzieję, że nie zadzwoniłem kolejność ;) )

Następnie możesz pobrać plik bezpośrednio z komputera A za pośrednictwem komputera B. Zakładam, że plik jest w, http://C/path/to/filewięc użyjesz:

wget http://B:11111/path/to/file
Huygens
źródło
Czy nie zadziałałoby to tylko wtedy, gdy plik jest dostępny bez wirtualnego hostingu opartego na nazwie HTTP 1.1? Ponieważ żądanie GET wydane przez wget podaje nazwę hosta jako B, a nie C.
CVn
@ MichaelKjörling Nie mam wystarczającej wiedzy, aby ci odpowiedzieć.
Huygens