¿Cómo reanudar scp con archivos parcialmente copiados? [cerrado]

97

Utilizo el comando scp shell para copiar una carpeta enorme de archivos.

Pero en algún momento tuve que matar el comando en ejecución (con Ctrl + C o matar).

A mi entender, scp copió los archivos secuencialmente, por lo que solo debería haber un archivo parcialmente copiado.

¿Cómo se puede reanudar el mismo comando scp para no sobrescribir los archivos copiados correctamente y para manejar correctamente los archivos parcialmente copiados?

PD: Sé que puedo hacer este tipo de cosas en rsync, pero scp es más rápido para mí por alguna razón y lo uso en su lugar.

Bohdan
fuente
4
Sospecho que rsync es más lento porque dedica más tiempo a hacer cosas que le permiten reiniciar una transferencia. Podría considerar usar rsync para finalizar la transferencia parcial.
Keith Thompson
2
Si quieres ser inteligente, siempre puedes probar ddcon una skipvariable adecuada y canalizar a ssh:)
Mark Nunberg
1
Esto está fuera de tema para SO. Pertenece a SuperUser y, de hecho, se ha solicitado allí .
Dan Dascalescu

Respuestas:

183

Deberías usar rsyncmásssh

rsync -P -e ssh remoteuser@remotehost:/remote/path /local/path

La opción clave es -P, que es la misma que--partial --progress

También se pueden utilizar otras opciones, como -a(para el modo de archivo) y -z(para habilitar la compresión).

El manual: https://download.samba.org/pub/rsync/rsync.html

Jordi
fuente
43
Solo quería señalar que rsync reanudará una copia por lotes comenzada con scp sin problemas.
Craig Anderson
6
Obtendrá "omitiendo directorio". error, a menos que también especifique -r. Fuente: lucasb.eyer.be/snips/rsync-skipping-directory.html
Artur Czajka
4
Funcionó para mí, pero agregué --append también .... rsync -P --append -e ssh remoteuser @ remotehost: / remote / path / local / path
cnd
1
@CraigAnderson ese es el punto importante que se ha dejado fuera. La respuesta parece sugerir que la descarga debería haber comenzado con rsync para empezar.
Willa
1
Las opciones dadas en la respuesta no me funcionaron, pero esto sí:rsync -P -rsh remoteuser@remotehost:/remote/path /local/path
Bunny Rabbit
26

Una alternativa a rsync:

Uso sftpcon la opción -r(de forma recursiva copiar directorios enteros) y la opción -ade sftp's getde control para reanudar las transferencias parciales de los archivos existentes.

Requisito previo: su sftpimplementación ya tiene una opción getwith -a.

Ejemplo:

Copie el directorio /foo/bardel servidor remoto a su directorio actual local. El directorio barse creará en su directorio actual local.

echo "get -a /foo/bar" | sftp -r server
Ciro
fuente
4
Su solución es excelente porque mi servidor no permite iniciar sesión en ssh, por lo que rsync no funciona. Necesitaba cargar en lugar de descargar, así que aquí está mi comando:echo "put -a foo/bar" | sftp -r server:/foo
Carlos Rafael Ramirez
1
Esta parece una opción muy viable para reanudar archivos parcialmente descargados, porque rsync no parece ser muy compatible con ssh (con puertos no predeterminados).
codezombie
11

Desde OpenSSH 6.3, puede usar el regetcomando en sftp.

Tiene la misma sintaxis que el get, excepto que inicia una transferencia desde el final de un archivo local existente.

Martin Prikryl
fuente
6

Otra posibilidad es intentar salvar el scp que ya ha iniciado cuando se detiene.

ctrl + z en segundo plano y detenerlo, luego ssh hacia el servidor receptor e inicie sesión, luego salga. ¡Ahora fg el proceso scp y observe cómo se reanuda desde 'estancado'!

Puckfist
fuente
Me funcionó en Mac OS X. Gracias por publicar esto, ¡me salvó el tocino hoy!
Ben Hitchcock
1

Cuando rsync también se detiene después de un par de segundos cuando inicialmente funciona bien, terminé con la siguiente solución de fuerza bruta:

cat run_me.sh
#!/bin/bash
while [ 1 ]
do
  rsync --partial --progress --rsh=ssh user@host:/path/file.tgz file.tgz &
  TASK_PID=$!
  sleep 60
  kill $TASK_PID
  sleep 2
done
remigiusz boguszewicz
fuente
1

Puede hacer uso de las opciones -rshy -Pde rsync. -Pes para descarga parcial e -rshindica que la transferencia ha terminado con el procotol ssh.

El comando completo sería: rsync -P -rsh remoteuser@remotehost:/remote/path /local/path

Conejito
fuente
-5

Ayer tuve el mismo problema, transfiriendo un volcado de sql enorme a través de scp, tuve suerte con wget --continue the_url

Esa publicación de blog lo explica bastante bien http://www.cyberciti.biz/tips/wget-resume-broken-download.html

Arnaud Bouchot
fuente
Se considera una buena práctica copiar las partes relevantes de una URL en la respuesta en caso de que el sitio deje de funcionar.
Ryre
Estoy intentando subir, así que no me lo pierdas.
Rolf