Pregunta ¿Cómo diff sobre ssh?


¿Cómo diferencio los archivos / carpetas en las máquinas siempre que la única conectividad disponible sea ssh?


166
2017-08-26 17:17


origen


Hay una pregunta relativamente similar en # 16661: ¿Cómo puedo diferenciar dos servidores RedHat Linux?. La respuesta allí, para guardar los clics, es rsync -ani --delete / root@remotehost:/ pero la respuesta completa da mas detalle - Owen Blacker
Muchas respuestas aquí, pero ¿cuál es el enfoque más rápido? - pl1nk
Nadie usa herramientas de visualización visual? - Dan Dascalescu


Respuestas:


Puedes hacerlo con Bash's. proceso de sustitución:

 diff foo <(ssh myServer 'cat foo')

O, si ambos están en servidores remotos:

diff <(ssh myServer1 'cat foo') <(ssh myServer2 'cat foo')

142
2017-08-26 17:22



Sí, algo como esto, pero para directorios :) - Alexey Timanovsky
¿Qué quiere decir con los directorios, siempre podría reemplazar cat con ls - Kyle Brandt♦
Sospecho que 'para directorios' significa hacer una diferencia recursiva - Ian Clelland
Descubrí que esta técnica no me funcionaba si mi host remoto requería una contraseña. La solicitud de contraseña no pareció funcionar bien con la redirección y no se pudo completar con éxito. Si usas claves ssh esto no debería ser un problema. - Adam Franco
Esta es una gran solución general para muchos problemas. En lugar de 'cat foo' podría usar 'find / foo / bar -type f | mientras lee el archivo; hacer eco "**** $ archivo"; cat "$ file"; done 'y tendrías una lista de los nombres de archivos y los contenidos de los archivos a diferenciar. - Paul Gear


Finalmente he encontrado una gran solución: vimdiff

vimdiff /path/to/file scp://remotehost//path/to/file

gracias a http://linux.spiney.org/remote_diff_with_vim_and_ssh ver también http://www.vim.org/scripts/script.php?script_id=1075 .


98
2018-05-15 08:55



vimdiff es dulce, gracias! - Max Felker
¿Qué pasa con los directorios? :) - Perlnika
Aquí hay un ejemplo: vimdiff .bash_profile scp: //vaibhavc@10.217.212.97//home/vaibhavc/.bash_profile - vaichidrewar
2 barras // después de la remotehost es importante. La barra simple no funcionará - Lee Chee Kiam
Si tiene un nombre de usuario diferente en el host remoto que su host actual, usaría vimdiff /path/to/file scp://username@remotehost//path/to/file - JaredC


Si solo desea ver qué archivos son diferentes, en lugar de una diferencia de los archivos reales, puede usar rsync --dry-run


58
2017-09-04 11:14



rsync -n es la versión corta. - volni
Excelente: si necesita usar otro puerto, use rsync -e "ssh -p 2222" <SRC> <DST> - Samoth


Aquí hay otra receta de línea de comandos rápida y sucia. A diferencia de la respuesta elegida, funciona dentro de makefiles:

ssh [login]@[host] "cat [remote file]" | diff - "[local file]"

15
2017-12-27 18:43



Si mi edición no pasa: este método es superior a la respuesta elegida porque funciona con makefiles. - Chris Redford
@Steve Dickinson: ¿qué quiere decir con "funciona dentro de makefiles"? - Martin Vegter
Esta también es una buena solución si usted sufre de alergia al virus como yo. :) Creé una secuencia de comandos bash que compara el mismo archivo en dos hosts diferentes, útil al migrar servicios entre máquinas y comparar archivos de configuración. Ver gist.github.com/jhqv/dbd59f5838ae8c83f736bfe951bd80ff - Janek


¿Utiliza scp para llevar los archivos a una máquina común y diferenciarlos allí?

O, si solo quieres saber si los archivos son Diferentes o no, hash con md5sum en cada máquina.

También puedes mirar en algo como SSHFS, pero no sé qué tan bien funciona un algoritmo como diff sobre eso.


10
2017-08-26 17:19



Una forma más fácil de ver si los archivos son diferentes o no es rsync --dry-run. - Gerald Combs
Me había olvidado de SSHFS. Esto funciono muy bien para mi... - arod


Una forma, si es posible en su sistema sería simplemente montar el sistema de archivos remoto con sshfs.


7
2017-08-26 17:19



Por lo general, diff es una acción de un disparo, como para verificar la diferencia de configuración. Es posible montar el sistema de archivos cada vez, pero no es conveniente. Será mejor que tar y scp. - Alexey Timanovsky


Puedes usar rsync en modo de ejecución en seco, como se sugiere brevemente en otra respuesta. Enumera todos los archivos que son diferentes.

Para eso, usa el rvnc opciones (r= recursivo, v= verbosa, n= ejecución en seco, c= suma de control). Con rsync en modo pull (rsync [OPTION...] [USER@]HOST:SRC... [DEST]), un ejemplo es:

rsync -rvnc root@182.18.158.207:/var/www/html/dev/ .

Recuerda, esto no proporciona información sobre si el archivo local o remoto es más nuevo. Solo si difieren.


3
2018-04-29 12:21





  • en su máquina local, haga una copia recursiva del directorio que desea diferenciar. Por ejemplo:

    cp -R dir replica
    
  • use rsync para replicar el directorio remoto sobre la copia local:

     rsync remote:/path/to/dir replica
    
  • use diff para encontrar la diferencia entre el directorio local y la réplica local del remoto:

    diff dir replica
    

2
2018-01-30 13:16