¿Cómo puedo copiar múltiples archivos sobre scp en un comando?

20

Tengo que transportar muchos archivos de una PC a otra (ambos Linux). Me gustaría usar scppara eso, pero scpsolo permite transferir un archivo a la vez.

¿Cómo puedo hacer esto?

yo tengo

  • No hay posibilidad de usar rsync o cualquier otro protocolo
  • No hay posibilidad de usar certificados sin contraseña (pero tener un certificado con una frase de contraseña)
  • Una lista de archivos para transferir y una lista con la ruta de destino de los archivos en el otro servidor
  • Los archivos están distribuidos en muchos directorios, y no todos los archivos en los directorios que quiero copiar

Si es posible, me gustaría descomprimir y descomprimir de forma transparente para ahorrar ancho de banda.

es posible?

Peter Smit
fuente

Respuestas:

31

Uso tar:

tar cvzf - -T list_of_filenames | ssh hostname tar xzf -
akira
fuente
2
Aquí está el formato del archivo: "En modo c, tar leerá los nombres que se archivarán desde el nombre del archivo. El nombre especial -C'' on a line by itself will cause the current directory to be changed to the directory specified on the following line. Names are terminated by newlines unless --null is specified. Note that --null also disables the special handling of lines containing -C ''".
Kousha
14

Me gustaría usar scp para eso, pero scp solo permite transferir un archivo a la vez.

Estoy bastante seguro de que eso no es cierto, al menos no para el scpcomando proporcionado por OpenSSH incluido con la mayoría de las distribuciones de Linux.

Yo uso con scp file1 file2 ... fileN user@host:/destination/directory/bastante frecuencia.

Para una compresión transparente, el protocolo SSH tiene esto incorporado y scppuede usarlo si proporciona la -Copción en la línea de comando. Para muchos archivos pequeños similares, encontrará que la opción tar + gz sugerida por akira obtiene una mejor compresión, ya que puede hacer uso de la similitud entre dichos archivos donde scpcomprime cada archivo como una entidad separada. Sin embargo, generalmente prefiero usar scp, ya que es más fácil reanudar una transferencia parcial (o, aunque sé en esta situación, el interlocutor no tiene la opción), rsyncya que es aún más fácil de reanudar y comparte toda la opción tar + gz -corriente de compresión ventaja.

David Spillett
fuente
Esta es la respuesta correcta, pero en realidad solo transfiere un archivo a la vez. Sin embargo, aprovechará al máximo el ancho de banda disponible y debería ejecutarse lo más rápido posible.
Benjamin Bannier
4

No scp -r yourdir otherhost:/otherdirfunciona

Intenta esto entonces:

tar cfz - . | ssh otherhost "cd /mydir; tar xvzf -"

el z-flag to tar hace compresión. O puede usar -C para ssh:

tar cf - . | ssh -C otherhost "cd /mydir; tar xvf -"
Jimmy Hedman
fuente
¿qué -Chacer?
Nathan Fellman
1
El problema es que tengo una lista de archivos. Los archivos están distribuidos en muchos directorios, y no todos los archivos en los directorios que quiero copiar
Peter Smit el
2
@Nathan: -C es dejar que ssh haga la compresión.
Jimmy Hedman
1

En RHEL5, esta es la única forma posible que conozco para copiar de forma segura una lista de archivos que contienen caracteres especiales (como un espacio). Cree un script de shell e incluya lo siguiente:

FILE="/path/filename"
while read line; do
scp "$line" username@servername:/destination/
done < $FILE
Brian Thomas
fuente
0

Se puede hacer sin muchos problemas.

Simplemente creo una lista de archivos con el nombre de host al lado de cada archivo y scp parece analizarlo bien. es decir.

srchost=`hostname`
myfiles="${srchost}:~/.bashrc ${srchost}:~/.bash_profile ${srchost}:~/.vimrc ${srchost}:~/.viminfo ${srchost}:~/.toprc ${srchost}:~/.dir_colors"
scp -v $myfiles $HOME

Scp parece funcionar bien con esta sintaxis. Cuando lo intenté sin el nombre de host al lado de cada archivo, falló después del primer archivo. Parece recordar otra sintaxis que usé para esto antes y la publicaré una vez que la localice.

Ernie M.
fuente
Esto funciona, pero es bastante lento: parece iniciar una conexión para cada archivo ... (Vine aquí buscando una solución para la copia lenta ...) en ~/su mayoría puede omitirse: SCP opera en relación con el directorio de inicio. .. Si tiene una lista de otro lugar en $list: scp $(echo "$list"|sed "s/^/$srchost:/") local_destination(Sin embargo, esto se romperá para los nombres de archivo con espacios)
Gert van den Berg