¿Cómo diferenciar sobre ssh?

175

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

Alexey Timanovsky
fuente
8
Hay una pregunta relativamente similar en el # 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 más detalles.
Owen Blacker
Muchas respuestas aquí, pero ¿qué enfoque es el más rápido?
pl1nk
1
¿Nadie usa herramientas de diferencia visual ?
Dan Dascalescu

Respuestas:

150

Puedes hacerlo con la sustitución del proceso de Bash :

 diff foo <(ssh myServer 'cat foo')

O, si ambos están en servidores remotos:

diff <(ssh myServer1 'cat foo') <(ssh myServer2 'cat foo')
Kyle Brandt
fuente
12
sí, algo así, pero para directorios :)
Alexey Timanovsky
¿Cómo se refiere a los directorios? Siempre podría reemplazar cat con ls
Kyle Brandt
27
Sospecho que 'para directorios' significa hacer un recursivo diff
Ian Clelland
99
Descubrí que esta técnica no funcionaba para mí si mi host remoto requería una contraseña. La solicitud de contraseña no parecía funcionar bien con la redirección y no se pudo completar con éxito. Si usa las teclas ssh, esto no debería ser un problema.
Adam Franco
2
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"; gato "$ archivo"; hecho 'y tendrías una lista de los nombres de archivo y el contenido del archivo para diferenciar.
Paul Gear
106

Finalmente encontré 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 .

Alexey Timanovsky
fuente
77
¿Qué pasa con los directorios? :)
Perlnika
1
Aquí hay un ejemplo: vimdiff .bash_profile scp: //[email protected]//home/vaibhavc/.bash_profile
vaichidrewar
44
2 barras //después de la remotehostes importante. La barra simple no funcionará
Lee Chee Kiam
2
Si tiene un nombre de usuario diferente en el host remoto que su host actual, usaríavimdiff /path/to/file scp://username@remotehost//path/to/file
JaredC
¿Cómo puede hacer esto con dos hosts remotos con archivos de clave id_rsa @JaredC?
Manatax
61

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

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

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

ssh [login]@[host] "cat [remote file]" | diff - "[local file]"
Steve Dickinson
fuente
Si mi edición no se realiza: este método es superior a la respuesta elegida porque funciona con archivos MAKE.
Chris Redford
@Steve Dickinson: ¿qué quieres decir con "funciona dentro de los makefiles"?
Martin Vegter
1
Esta también es una buena solución si sufres de alergia vim como yo. :) Creé un script 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 el
10

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

O, si solo quiere saber si los archivos son diferentes o no, hágalos con md5sum en cada máquina.

También podría buscar algo como SSHFS , pero no sé qué tan bien funciona un algoritmo como diff sobre eso.

Ian Clelland
fuente
2
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 funcionó muy bien para mí ...
arod
7

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

Zoredache
fuente
diff es generalmente una acción de una sola vez, como verificar la diferencia de configuración. El sistema de archivos de montaje cada vez es posible, pero no es conveniente. Será mejor que alquitrán y scp.
Alexey Timanovsky
3

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

Para eso, use las rvncopciones ( r= recursivo, v= detallado, n= ejecución en seco, c= suma de verificación). Con rsyncen modo pull ( rsync [OPTION...] [USER@]HOST:SRC... [DEST]), un ejemplo es:

rsync -rvnc [email protected]:/var/www/html/dev/ .

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

zzapper
fuente
2
  • 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
    
salva
fuente
2

Si tiene sshfs y necesita diferenciar directorios:

mkdir remote_path
sshfs user@host:/path/ remote_path
diff -r path remote_path
metrix
fuente
1

Así es como lo hice.

Utilicé SFTP en el servidor remoto e ingresé mi nombre de usuario / pwd cuando se me solicitó. Luego usé el directorio que se creó en el directorio .gvfs en mi directorio de inicio en el comando diff.

diff -r - resumen / inicio / usuario dir / .gvfs / SFTP \ on \ freenas.local / ruta al directorio / dir1 / ruta al directorio local / directorio2

Peter
fuente
1

Este es un script que puede ayudar a diferenciar la carpeta local y la carpeta remota .:

 #!/bin/bash

 LOCALFOLDER=/var/www/tee
 REMOTEFOLDER=$(ssh [email protected] 'ls -lA /hfs/tee'| grep -E '^total' | cut -d " " -f 2 > remotessh.txt)
 COMMAND=$(ls -lA $LOCALFOLDER | grep -E '^total' | cut -d " " -f 2 > localssh.txt)
 REM=$(cat remotessh.txt)
 LOCAL=$(cat localssh.txt)

 echo $LOCAL
 echo $REM

 if [ $REM -eq $LOCAL ]
 then
      echo Directories are the same
 else
      echo Directories are differnt
 fi

 #diff localssh.txt remotessh.txt | grep -E '^total' | cut -d " " -f 2
inoxidable
fuente
1

Utilice sshfs montados en ssh. No será tan rápido, pero puede usar su conjunto completo de herramientas que esperan que todo esté en un sistema de archivos local. Una alternativa es NFS sobre un túnel hecho con "ssh -w" (u otras comunicaciones donde ssh no es la limitación).

Skaperen
fuente
1

También puede intentar generalizar el enfoque creando una función bash, posiblemente en su ~ / .bashrc:

myrdiff() { ssh root@"$1" cat "$2" | diff -s - "$2" ; }

luego invocándolo con una construcción como:

myrdiff vm20-x86-64 /etc/gdm/Init/Default

Al invocar diff con -s, esto también informará si los archivos son idénticos.

¡Salud! Jim

Jim Swain
fuente