Pregunta

Normalmente uso scp para copiar cosas, pero ahora estoy tratando de acostumbrarme al comando rsync más potente. Me ayuda a usar menos ancho de banda copiando solo los archivos que han cambiado. Sin embargo, rsync tiene muchos parámetros complejos, así que pensé, oye, haré un pequeño script de Bash que me lo facilite, y llamaré al comando 'rscp'. Entonces, me fui a construir algo como esto. Observe en el siguiente ejemplo que mi proveedor de alojamiento web usa un número de puerto diferente además del 22, por eso se usa el $ 1 para eso.

#!/bin/bash

rsync -avzp --progress --rsh='ssh -p$1' $2 $3 $4 $5 $6 $7

Entonces, su uso, esperaba, sería algo así como:

rscp 3822 --exclude=tiny_mce /var/www/mysite/* root@webhost.com:~/www/mysite

Eso lo acercaría un poco más a mi uso del comando scp, ya ves.

Sin embargo, cuando ejecuté esto, recibí este error:

building file list ... 
4 files to consider
ERROR: destination must be a directory when copying more than 1 file
rsync error: errors selecting input/output files, dirs (code 3) at main.c(494) [receiver=2.6.9]
rsync: connection unexpectedly closed (8 bytes received so far) [sender]
rsync error: error in rsync protocol data stream (code 12) at io.c(454) [sender=2.6.9]

Pero si vuelvo al comando rsync normal, funciona bien.

¿Alguien puede descubrir qué estoy haciendo mal en mi script Bash?

¿Fue útil?

Solución

/ var / www / mysite / * se expande por el shell, por lo que se pasan muchos más argumentos de los que se manejan en el script.

Además, las variables no se sustituyen entre comillas simples, por lo que debe utilizar comillas dobles. (Consulte bash página de manual )

Prueba esto:

#!/bin/bash
PORT=$1
shift
rsync -avzp --progress --rsh="ssh -p$PORT" "$@"

Primero sacamos el puerto de la lista de argumentos (con shift), luego usamos " $ @ " que es especial, se refiere al argumento (al guión en este caso), y se convierte a todos ellos, pero cada uno por separado entre comillas dobles. (consulte la página del manual para obtener más detalles). .

Otros consejos

¿Técnicamente no podrías convertir esto también en una función ?:

    rscp() {
rsync -avzp --progress --rsh="ssh -p$PORT" "$@"
}

Y luego cuando lo ejecutas: rscp 3822

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top