2012-06-14 25 views
58

Necesito reinstalar uno de nuestros servidores, y como medida de precaución, quiero mover /home, /etc, /opt y /Services al servidor de copia de seguridad.¿Es posible hacer que SCP ignore los enlaces simbólicos durante la copia?

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

¿Es posible hacer scp ignorar los enlaces simbólicos (o en realidad copiar el enlace como un enlace no como un directorio o archivo)? Si no, ¿hay otra forma de hacerlo?

Respuesta

55

Sabía que era posible, acabo de tomar la herramienta equivocada. Lo hice con rsync

rsync --progress -avhe ssh /usr/local/ XXX.XXX.XXX.XXX:/BackUp/usr/local/ 
+0

Entonces, ¿qué tiene este comando? ¿Ignora los enlaces simbólicos o crea otros nuevos? -avhe? –

+1

'a' es archive (preserva cosas),' v' verbose, 'h' salida legible para humanos,' e' especifica el servicio que desea usar (en este caso es 'ssh'). Lea más [aquí] (https://linux.die.net/man/1/rsync) – tenCupMaximum

23

encontré que the rsync method no funcionó para mí, sin embargo he encontrado una alternativa que ha funcionado en este sitio web (www.docstore.mik.ua/orelly).

Específicamente la sección 7.5.3 of "O'Reilly: SSH: The Secure Shell. The Definitive Guide".

7.5.3. Copia recursiva de directorios

...

Aunque SCP puede copiar directorios, no es necesariamente el mejor método. Si su directorio contiene enlaces duros o enlaces suaves, no se duplicarán. Los enlaces se copian como archivos sin formato (los objetivos del enlace) y, lo que es peor, los enlaces de directorios circulares provocan que scp1 se repita indefinidamente. (scp2 detecta enlaces simbólicos y copia sus objetivos en su lugar.) Otros tipos de archivos especiales, como canalizaciones con nombre, tampoco se copian correctamente. Una mejor solución es usar tar, que maneja los archivos especiales correctamente, y enviarlos al control remoto. máquina sea untarred, a través de SSH:

$ tar cf - /usr/local/bin | ssh server.example.com tar xf - 
+1

Esta es una buena sugerencia si rsync no está instalado en el extremo remoto, o (con una ligera modificación) si le sucede ya tiene un archivo tar del directorio fuente. –

+0

Necesita una "p" (tar xpf) para conservar los permisos en el destino. –

12

usando tar sobre ssh como el remitente y el receptor hace el truco, así:

cd $DEST_DIR 
ssh [email protected] 'cd $REMOTE_SRC_DIR; tar cf - ./' | tar xvf - 
+0

Agregué en el lado de la fuente '--one-file-system' y en el lado de destino' p' para conservar los permisos. – ceving

+0

página de manual para tar dice; --one-file-system = no cruzar puntos de montaje – AnneTheAgile

0

una solución es utilizar un tubo de concha. Tengo una situación en la que obtuve algunos archivos * .gz y enlaces simbólicos generados por algún software para vincularlos a los mismos archivos * .gz con un nombre ligeramente más corto. Si simplemente uso scp, los enlaces simbólicos se copiarán como archivos regulares y se generarán duplicados. Sé que rsync puede ignorar los enlaces simbólicos, pero mis archivos gz no están comprimidos con las opciones de sincronización, y la sincronización es muy lenta al copiar estos archivos gz. Por lo tanto, basta con utilizar el siguiente script para copiar los archivos:

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

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

Cuestiones relacionadas