Come posso riprendere un trasferimento di file scp di grandi dimensioni quando utilizzo il port forwarding?


10

Ho una macchina a un paio di hop di distanza e ho bisogno di impostare il port forwarding per trasferire i file.

Modifica: per essere chiari, sono necessari più salti per accedere al computer remoto. Dalla mia macchina, ho impostato una VPN, dove posso accedere a 10.255.xx - questa è l'unica macchina a cui posso connettermi tramite VPN. Una volta effettuato l'accesso a .xx, posso quindi collegarmi ad altre macchine - .yy è una di quelle.

Dalla mia macchina:

ssh -L 4567:localhost:4567 me@10.255.x.x

Quindi da quella macchina:

ssh -L 4567:localhost:22 me@10.255.y.y

Posso allora

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

Ho lasciato questo overnite in esecuzione, solo per scoprire che il trasferimento è morto ad un certo punto.

Ho visto un paio di suggerimenti per usare rsync su ssh per riprendere il trasferimento, ma non sono chiaro come configurarlo. È possibile?


A cosa servono tutti questi luppoli? Non scp me@10.255.x.x:/path/to/large/file.gz .otterresti esattamente lo stesso? Quale versione di scp (ssh) è installata su client e server?
Dennis,

@Dennis: scp non supporta il ripristino di un trasferimento: ciò che suggerisci riavvierà il download.
chris

Alcune versioni lo fanno (lo scp del mio laptop lo fa, il mio VPS no). Il motivo per cui lo sto chiedendo è perché il luppolo mi sembra superfluo e la risincronizzazione senza luppolo sarà molto più semplice.
Dennis,

Questa risposta potrebbe aiutarti anche: unix.stackexchange.com/a/43097/14084
Bernhard

Risposte:


9

Con alcune versioni di scp (la versione sul computer di origine sembra essere la chiave), sarà sufficiente rieseguire il comando scp per riprendere il trasferimento. Ma fa attenzione! Se la tua versione non supporta i trasferimenti parziali, il file parziale verrà semplicemente sovrascritto.

I seguenti switch rsync sono utili per riprendere un trasferimento interrotto se scp non lo supporta:

     --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

Il comando

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

dovrebbe avere l'effetto desiderato. Si noti che l' -pinterruttore deve essere minuscolo per ssh.


Gli hop sono necessari a causa della configurazione della rete sul server di destinazione. Il problema con l'uso di rsync su ssh è che devo usare la porta locale 4567, il file non esiste sul server 10.255.xx.
chris

Errore mio. Supponevo che 10.255.y.yfosse il computer client.
Dennis,

Ho aggiornato la mia risposta.
Dennis,

e cosa fare se non c'è modo di usare rsync? Nel mio caso ho solo ftp disponibile sull'host remoto.
dr.dimitru,

1
@Enzo La domanda riguarda SCP, la risposta deve riguardare SCP. La domanda riguarda un trasferimento SCP incompleto, non lo strumento SCP. Dice letteralmente che ho visto un paio di suggerimenti per usare rsync su ssh per riprendere il trasferimento, ma non sono chiaro come configurarlo. È possibile? in fondo.
Dennis,

3

Usa sftp invece di scp

Nel tuo caso:

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

Dalla pagina man 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.

1

rsync usa ssh di default, potrebbe essere necessario specificare il comando esatto ssh usando l'opzione -e di rsync. Ha anche un --partial che dovrebbe mantenere il file incompleto in modo da poter riprendere il trasferimento.


-1

Non riesco davvero a vedere qual è il punto dei tuoi tunnel, quindi ecco come andrei a risolvere il tuo problema:

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

questo apre un tunnel inverso dal computer locale (localhost) al computer remoto (remotehost). $ tunnelPort è la porta su cui è possibile trovare il tunnel su remotehost. $ localSSHPort è la porta su cui viene eseguito lo sshd locale e $ remoteSSHPort è dove ascolta l'sshd di remotehost.

Ora che sei all'interno del tunnel (al contrario!) Puoi più o meno fare ciò che Dennis ha proposto:

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

le bandiere -a e -z sono spiegate nella pagina man di rsync, quindi non approfondirò. Quello che succede ora è che quando esegui rsync su remotehost come sopra, spinge tutti i dati nella porta $ tunnelPort che viene quindi inoltrata allo sshd $ localSSHPort del tuo host locale.

Spero che abbia aiutato.


@ingeno: ho aggiunto una spiegazione per i tunnel.
chris
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.