¿Es posible hacer que SCP ignore los enlaces simbólicos durante la copia?

80

Necesito reinstalar uno de los servidores de la nuestra, y como medida de precaución, quiero mover /home, /etc, /opt, y /Servicesal servidor de copia de seguridad.

Sin embargo, tengo un problema: debido a la gran cantidad de enlaces simbólicos, muchos archivos se copian varias veces.

¿Es posible scpignorar los enlaces simbólicos (o copiar el enlace como un enlace y no como un directorio o archivo)? Si no es así, ¿hay otra forma de hacerlo?

Kris_R
fuente

Respuestas:

82

Sabía que era posible, simplemente tomé la herramienta equivocada. Lo hice con rsync

rsync --progress -avhe ssh /usr/local/  XXX.XXX.XXX.XXX:/BackUp/usr/local/
Kris_R
fuente
1
Entonces, ¿qué manda esto? ¿Ignora los enlaces simbólicos o crea otros nuevos? -avhe?
Ernestas Stankevičius
3
aes archivo (conserva las cosas), vdetallado, hsalida legible por humanos, eespecifique el servicio que desea usar (en este caso es ssh). Leer más aquí
quietContest
Gracias. Servidor antiguo suspendido. Nuevo servidor necesitaba contenido. Se perdieron todos los enlaces blandos, pero muchos se rompieron, por lo que ahora será una tarea de mantenimiento lenta en el nuevo servidor. Gracias de nuevo.
jlettvin
1
--safe-links permite conservar los enlaces que están dentro del directorio y no copiar los que apuntan fuera de él.
Colin Pitrat
29

Descubrí que el rsyncmétodo no me funcionó, sin embargo encontré una alternativa que sí funcionó en este sitio web ( www.docstore.mik.ua/orelly ).

Específicamente la sección 7.5.3 de "O'Reilly: SSH: El Secure Shell. La guía definitiva" .

7.5.3. Copia recursiva de directorios

...

Aunque scp puede copiar directorios, no es necesariamente el mejor método. Si su directorio contiene enlaces físicos o enlaces blandos, no se duplicarán. Los enlaces se copian como archivos sin formato (los destinos del enlace) y, lo que es peor, los enlaces de directorio circulares hacen que scp1 se repita indefinidamente. (scp2 detecta enlaces simbólicos y copia sus destinos). Otros tipos de archivos especiales, como tuberías con nombre, tampoco se copian correctamente. Una mejor solución es usar tar, que maneja archivos especiales correctamente, y enviarlo al control remoto máquina que se desmarcará, vía SSH:

$ tar cf - /usr/local/bin | ssh server.example.com tar xf -
Luke
fuente
1
Esta es una buena sugerencia si rsync no está instalado en el extremo remoto o (con una ligera modificación) si ya tiene un archivo tar del directorio de origen.
Trebor Rude
1
Necesita una "p" (tar xpf) para conservar los permisos en el destino.
Paul Lynch
Una nota, este comando debe ejecutarse desde la computadora de origen , insertando los archivos en la computadora de destino . Para mi caso (muchos archivos pequeños, sin comprimir), funcionó mejor y más rápido el scpo rsync.
Gerardo Lima
Una pregunta de seguimiento: en el lado de la fuente, ¿el comando tar almacena los datos tarball localmente primero, antes de transferirlos al control remoto? [Esto sería un problema cuando el disco de origen está casi lleno - digamos 98% lleno]
Jungle Editor hace
18

Usar tarover sshcomo remitente y receptor también funciona:

cd $DEST_DIR
ssh user@remote-host 'cd $REMOTE_SRC_DIR; tar cf - ./' | tar xvf -
Vojtech Vitek
fuente
Agregué en el lado de origen --one-file-systemy en el lado de destino ppara preservar los permisos.
partir del
la página man para tar dice; --one-file-system = no cruzar puntos de montaje
AnneTheAgile
2

Una solución es utilizar una tubería de carcasa. Tengo una situación en la que tengo algunos archivos * .gz y enlaces simbólicos generados por algún software para vincularlos a los mismos archivos * .gz con un nombre un poco más corto. Si simplemente uso scp, los enlaces simbólicos se copiarán como archivos normales y se duplicarán. Sé que rsync puede ignorar los enlaces simbólicos, pero mis archivos gz no están comprimidos con opciones sincronizables, y la sincronización es muy lenta para copiar estos archivos gz. Así que simplemente uso el siguiente script para copiar los archivos:

find . -type f -exec scp {} target_host:/directory/name/data \;

La opción -f solo encontrará archivos normales e ignorará los enlaces simbólicos. Debe dar este comando en el host de origen. Espero que esto pueda ayudar a algún usuario en mi situación. Avísame si me perdí algo.

Kemin Zhou
fuente
0

Una solución de una sola línea que se puede ejecutar en el cliente para copiar la carpeta desde el servidor usando el comando tar + ssh.

ssh user@<Server IP/link> 'mkdir -p <Remote destination directory;cd <Remote destination directory>; tar cf - ./' | tar xf - C <Source destination directory>

Nota: mkdir es obligatorio, si el directorio de destino remoto no está presente, el comando simplemente comprimirá toda la casa del servidor remoto y lo extraerá al cliente.

Vinay Tiwary
fuente