¿Cómo diferenciar sobre ssh?


175

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


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

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')

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 .


77
¿Qué pasa con los directorios? :)
Perlnika

1
Aquí hay un ejemplo: vimdiff .bash_profile scp: //vaibhavc@10.217.212.97//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


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]"

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.


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 .


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 root@182.18.158.207:/var/www/html/dev/ .

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


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
    

2

Si tiene sshfs y necesita diferenciar directorios:

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

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


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 root@111.111.111.1 '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


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).


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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.