Jak mogę wznowić przesyłanie dużych plików SCP podczas korzystania z przekierowania portów?

10

Mam maszynę kilka przeskoków i muszę skonfigurować przekierowanie portów, aby przesyłać pliki.

Edycja: Aby wyjaśnić, wiele skoków jest potrzebnych, aby uzyskać dostęp do zdalnego komputera. Z mojego komputera skonfigurowałem VPN, do którego mogę uzyskać dostęp do 10.255.xx - to jedyna maszyna, z którą mogę się połączyć za pośrednictwem VPN. Po zalogowaniu się do .xx mogę połączyć się z innymi komputerami - jednym z nich jest.

Z mojej maszyny:

ssh -L 4567:localhost:4567 [email protected]

Następnie z tej maszyny:

ssh -L 4567:localhost:22 [email protected]

Mogę wtedy

scp -P 4567 me@localhost:/path/to/large/file.gz .

Zostawiłem to w spokoju, ale okazało się, że transfer umarł w pewnym momencie.

Widziałem kilka sugestii, aby użyć rsync over ssh, aby wznowić przesyłanie, ale nie jestem pewien, jak to skonfigurować. czy to możliwe?

Chris
źródło
Do czego służą te wszystkie chmiel? Czy nie scp [email protected]:/path/to/large/file.gz .osiągnąłby dokładnie tego samego? Która wersja scp (ssh) jest zainstalowana na kliencie i serwerze?
Dennis
@Dennis: scp nie obsługuje wznawiania transferu - sugerujesz, że wznowi pobieranie.
Chris
Niektóre wersje działają (scp mojego laptopa działa, a mój VPS nie). Pytam dlatego, że chmiel wydaje mi się zbędny, a rsynchronizacja bez chmielu będzie o wiele łatwiejsza.
Dennis
Ta odpowiedź również może ci pomóc: unix.stackexchange.com/a/43097/14084
Bernhard

Odpowiedzi:

9

W przypadku niektórych wersji scp (wersja na komputerze źródłowym wydaje się być kluczem) wystarczy ponowne wykonanie polecenia scp, aby wznowić przesyłanie. Ale bądź ostrożny! Jeśli Twoja wersja nie obsługuje przesyłania częściowego, plik częściowy zostanie po prostu nadpisany.

Następujące przełączniki rsync są przydatne do wznowienia przerwanego transferu, jeśli scp go nie obsługuje:

     --append                append data onto shorter files
     --append-verify         like --append, but with old data in file checksum
 -e, --rsh=COMMAND           specify the remote shell to use
     --progress              show progress during transfer

Komenda

rsync --append-verify --progress --rsh="ssh -p 4567" me@localhost:/path/to/large/file.gz .

powinien mieć pożądany efekt. Zauważ, że -pprzełącznik musi być małymi literami dla ssh.

Dennis
źródło
Przeskoki są potrzebne ze względu na sposób skonfigurowania sieci na serwerze docelowym. Problem z użyciem rsync przez ssh polega na tym, że muszę użyć lokalnego portu 4567, plik nie istnieje na serwerze 10.255.xx.
Chris
Mój błąd. Zakładałem, że 10.255.y.yto komputer kliencki.
Dennis
Zaktualizowałem swoją odpowiedź.
Dennis
i co zrobić, jeśli nie ma możliwości użycia rsync? W moim przypadku mam tylko ftp dostępne na zdalnym hoście.
dr.dimitru
1
@Enzo Pytanie dotyczy SCP, odpowiedź musi dotyczyć SCP. Pytanie dotyczy niekompletnego transferu scp, a nie narzędzia scp. Dosłownie mówi , że widziałem kilka sugestii, aby użyć rsync zamiast ssh, aby wznowić przesyłanie, ale nie jestem pewien, jak to skonfigurować. czy to możliwe? na dnie.
Dennis
3

Użyj sftp zamiast scp

W Twoim przypadku:

sftp -a -P 4567 me@localhost:/path/to/large/file.gz .

Ze strony podręcznika użytkownika sftp:

-a      Attempt to continue interrupted downloads rather than overwriting existing partial or complete copies of files.  If the remote file contents differ from the partial local copy then the resultant file is likely to be corrupt.
AlexR
źródło
1

rsync domyślnie używa ssh, może być konieczne podanie dokładnej komendy ssh za pomocą przełącznika -e rsync. Ma także opcję --partial, która powinna przechowywać niekompletny plik, aby mógł wznowić przesyłanie.

Luke Hollins
źródło
-1

Naprawdę nie rozumiem, jaki jest sens waszych tuneli, więc oto jak poszedłbym rozwiązać problem:

ssh -R $tunnelPort:localhost:$localSSHPort $remoteUser@$remoteHost -p $remoteSSHPort

spowoduje to otwarcie tunelu zwrotnego z komputera lokalnego (localhost) na komputer zdalny (remotehost). $ tunnelPort to port, na którym tunel znajduje się na zdalnym hoście. $ localSSHPort to port, na którym działa lokalny sshd, a $ remoteSSHPort to miejsce, w którym nasłuchuje sshd zdalnego hosta.

Teraz, gdy jesteś w tunelu (wstecz!), Możesz mniej więcej zrobić to, co zaproponował Dennis:

rsync --apend-verify -az -e 'ssh -p $tunnelPort' /path/to/large/file $user@localhost:/destination

flagi -a i -z są wyjaśnione na stronie podręcznika rsync, więc nie będę ich omawiać. To, co dzieje się teraz, polega na tym, że po uruchomieniu rsync na zdalnym hoście, jak wyżej, wypycha wszystkie dane do portu $ tunnelPort, który jest następnie przesyłany do sshd $ localSSHPort twojego localhosta.

Mam nadzieję, że to pomogło.

pomysłowy
źródło
@ingenous: Dodałem wyjaśnienie dotyczące tuneli.
Chris