¿Hay alguna manera de reanudar un scp interrumpido de un archivo?

11

De vez en cuando descargo un archivo muy grande a través de scp y cada vez hay una pequeña posibilidad de que la conexión se caiga y corte la transferencia a mitad de camino.

¿Hay alguna manera de reanudarlo?

GJ
fuente

Respuestas:

9

Puede probar la siguiente aproximación: en lugar de scp, use dd para omitir la parte descargada y agregar el resto al archivo.

sofar=`ls -l ./destfile | awk '{print $5}'`
ssh rsys "dd if=./srcfile bs=1 skip=$sofar" >> ./destfile

Posible optimización: trabajar con grandes bloques. Dejemos esto como tarea.

yrk
fuente
Todavía no lo he probado, pero acepto la respuesta tentativamente, ya que usar dd parece un gran enfoque para la solución.
GJ.
Lo acabo de probar, funciona perfectamente, ¡gracias!
Kossak
@Kossak, ¡me alegra saberlo!
yrk
ddcon bloques pequeños puede ser lento (solo 350 kB / s aquí). Afortunadamente, las scptransferencias parecen venir en bloques de 1024 bytes. Si es así para su archivo (o de lo contrario, truncando al bloque más cercano 1024 bytes), que puede acelerar de esta manera: ssh rsys "dd if=./srcfile bs=1024 skip=$sofar" >> ./destfile. (¡Tenga en cuenta que $sofarentonces debe ser el número de bloques de 1024 bytes para omitir!)
tanius
2
Me tomó un tiempo darme cuenta de que rsysen la segunda línea hay solo un nombre de host de ejemplo, no un argumento especial para ello ssh. Le sugiero que lo reemplace user@hostpara evitar confusiones.
Ahmed Essam
7

Con scpno.

Si ambos extremos lo tienen, puede usar rsync -LvzP remoteserver:path/to/file localfilepara transferir un solo archivo.

usuario1686
fuente
Esto me ahorró horas de descargar un archivo enorme que se interrumpió. Gracias.
phette23
3

Sí, hay formas de reanudar desde el punto de interrupción, pero no es posible usar scp. sftp reget filenamehace lo que necesitas Yarek y Grawity han proporcionado soluciones válidas que I +1 a ambos, pero para reanudar desde un punto de interrupción, me gusta rsync. Los comandos de ejemplo proporcionados suponen que está recuperando un archivo de un servidor remoto a su estación de trabajo local (descargando). Tenga en cuenta que los dos parámetros finales deben considerarse source_file y target_file en ese orden. La sintaxis del nombre de archivo varía en función de si el archivo de origen o de destino es local o remoto. Si estuviera enviando (cargando) archivos [de texto], volvería a escribir los ejemplos proporcionados como:

# De local a remoto
sofar = `ssh remote_system ls -l archivo_interrumpido | awk '{print $ 5}' ';
dd if = archivo_origen bs = 1 skip = $ sofar | ssh remote_system "cat >> ./interrupted_file"

Y a la solución rsync, agrego -e ssh. Debe considerar si necesita o no verbosidad, compresión, preservar la propiedad, permisos, marca de tiempo, directorios recurrentes, etc. Verifique las páginas man y google, con respecto al parámetro -L. Es posible que desee que los enlaces simbólicos permanezcan como enlaces en lugar de hacer referencia a ellos.

rsync -P -e ssh local_source_file remoteserver:path/to/interrupted_target_file

Daniel Liston
fuente
1

Hay otra solución (además de la rsynco ddlas soluciones indicadas aquí), que me sorprende que nadie ha mencionado: es el reputmando de sftp.

knocte
fuente
0
scp -o ConnectTimeout 60

Le permite especificar el tiempo de espera para una conexión. Puede evitar que su conexión se rompa.

usuario1055604
fuente
0

Sí, si ambos extremos admiten sftp: después de un scp remoteuser@remotehost:/absolute/filename .error, puede continuar haciendo sftp remoteuser@remotehosty luego reget /absolute/filenamereanudar la descarga.

Jason Drane
fuente