Czy muszę sftp na serwerze pośrednim?

11

Nie mogę sftp bezpośrednio do konkretnego hosta. Aby przenieść plik z mojego komputera domowego na host, muszę sftp pliku na host pośredni; ssh do hosta pośredniego; i sftp plik do ostatecznego miejsca docelowego. Czy można uniknąć takiego szaleństwa?

użytkownik74094
źródło

Odpowiedzi:

28

Z komputera lokalnego możesz utworzyć tunel SSH przez host pośredni do hosta końcowego:

ssh user@intermediate -L 2000:final:22 -N

Spowoduje to otwarcie portu 2000 na lokalnym hoście, który połączy się bezpośrednio z serwerem końcowym na porcie 22, tunelując przez host pośredni. Teraz w kolejnym pytaniu połącz się z sftp na porcie 2000, aby przejść przez tunel do serwera końcowego, zauważając, że podany tutaj użytkownik jest dla hosta końcowego:

sftp -P 2000 user@localhost

Wygląda na to, że należy do superuser.com lub serverfault.com .

WhiteFang34
źródło
Dzięki, spróbuję; i masz rację, to złe forum; Przepraszam.
Po podaniu hasła dla użytkownika @ localhost otrzymałem wiadomość: Zbyt długo otrzymałem wiadomość 1131376238
user74094
14

Możesz użyć opcji ProxyCommand SFTP, aby transparentnie tunelować połączenie SFTP przez połączenie SSH (nieco podobne do odpowiedzi WhiteFang34, ale zamiast stdin i stdout połączenia SSH, a nie przekazywanego lokalnego portu TCP):

sftp -o "ProxyCommand=ssh -e none user@intermediatehost exec /usr/bin/nc %h %p 2>/dev/null" user@finalhost

(Zakładając, że host pośredni ma zainstalowany netcat jako / usr / bin / nc - jeśli nie, być może będziesz musiał znaleźć / zainstalować jakiś równoważny sposób bramkowania stdin i stdout do sesji TCP.)

Naprawdę fajne w tej opcji jest to, że możesz dodać ją do pliku ~ / .ssh / config, co czyni ją przezroczystą:

Host finalhost
    ProxyCommand ssh -e none user@intermediatehost exec nc %h %p 2>/dev/null

Dzięki temu wpisowi możesz używać sftp, scp i ssh do finalhost, a on automatycznie wywoła tunel. Jedyną nieprzejrzystą częścią jest to, że poprosi o dwa hasła (host pośredni, a następnie host końcowy), ale jeśli chcesz, możesz to również wyeliminować za pomocą kluczy SSH ...

Gordon Davisson
źródło
Dzięki Gordon. Trwa oba hasła, a następnie zatrzymuje się z komunikatem: Za długo odebrano wiadomość 1131376238
user74094
To brzmi jak coś w połączeniu - może skrypt logowania na jednym z hostów, może nc - pisze dodatkowy tekst nad połączeniem, co dezorientuje sftp (zobacz to FAQ na snailbook.com ). 1131376238 to dziesiętne kodowanie znaków ascii „Conn”, więc prawdopodobnie jest to komunikat „Łączenie z ...” „Połączono z ...” lub może „Połączenie nieudane”. Spróbuj użyć ssh zamiast sftp, sprawdź, czy wiadomość jest drukowana w widoczny sposób, a może wiesz, skąd pochodzi.
Gordon Davisson
ssh działało dobrze. Powinienem również wspomnieć, że często mam do czynienia z tym pytaniem: nie można ustalić autentyczności hosta „xxxxx (<brak hostip dla polecenia proxy>)”. Odcisk palca klucza RSA to 37: 40: d4: c7: itd. Czy na pewno chcesz kontynuować połączenie (tak / nie)? tak
74094,
Gordon, bardzo przydatny! Dodaję to do mojego pliku tekstowego linii poleceń. Wielkie dzięki!
Travis Leleu,
Czy to execkonieczne? (Tu działa dobrze bez tej części.)
equaeghe
3

Możesz przesyłać dane do procesu ssh uruchomionego na twoim komputerze, a następnie uruchomić polecenie na maszynie pośredniej, która odczytuje stdin i przesyła je odpowiednio do sftp.

Można to zrobić w programie oneliner na lokalnej maszynie, choć cytowanie argumentów w ssh wymaga ostrożności. Jestem teraz przy telefonie, więc niestety nie mogę wpisać szczegółów. Być może ktoś inny może wypełnić tę odpowiedź jako ćwiczenie!

jl6
źródło
0

Zakładam, że ostateczny host jest zaporą ogniową i mogę tylko zgadywać, jakie metody można by obejść.

Na przykład - ujawnij ssh z komputera lokalnego, następnie ssh na pierwszym hoście, następnie ssh na drugim hoście i sftp z ostatniego hosta na twoim komputerze.


źródło
0

Powiedzmy, że A i B są pierwszym i drugim hostem. Plik do skopiowania to foo

Zamiast sftp możesz użyć następujących

kot foo | ssh A „cat -> foo”

Teraz możesz połączyć łańcuchowo 2 z nich razem

kot foo | ssh A "cat - | ssh B \" cat -> foo \ ""


źródło
Podoba mi się, więc spróbowałem. Wziął hasło dla A, a następnie wyświetlił komunikat: Weryfikacja klucza hosta nie powiodła się.
user74094,