Exécuter un diff entre les fichiers locaux et distants


39

Je suis connecté à un hôte via sshet j'aimerais comparer (disons avec diff) un certain fichier de configuration à son homologue sur un autre hôte, également accessible via ssh, sans avoir à télécharger manuellement le fichier distant avant d'exécuter le diff.


Vous pouvez monter le répertoire distant à l'aide de SSHFS, puis y accéder comme s'il était local.
Barmar

Réponses:


57
ssh user@remote_host "cat remote_file.txt" | diff - local_file.txt

La source


1
Le tuyau ne va-t-il pas simplement télécharger les résultats cat, qui ne sont en fait que le fichier d'origine?
Stijn de Witt

1
le tube poussera le résultat de la sshcommande distante vers le fichier en diffattente de comparaison stdinavec le fichier local.
fduff

1
Peut-être que j'interprète mal l'exigence «sans avoir à télécharger le fichier distant». Je suppose que OP signifie «sans avoir à télécharger manuellement le fichier distant». :) EDIT: Ah, vous êtes l'OP. :)
Stijn de Witt

@StijndeWitt, oui, je voulais éviter de devoir d'abord scp le fichier distant puis faire le diff.
fduff

18

Essayer:

diff local_file <(ssh user@server 'cat remote_file')

ou en utilisant vimdiff:

vimdiff local_file scp://server//path/to/remote_file

Ne diff local_file <(ssh user@server 'cat remote_file')fonctionne- t-il que pour SSH sans mot de passe? Je ne semble pas être en mesure d'obtenir une invite de mot de passe avec elle ...
sdbbs

1
@sdbbs: la substitution de processus s'est exécutée en arrière-plan et la sortie standard est écrite dans le canal nommé (ou dans le canal nommé anonyme), de sorte que l'invite de mot de passe ne s'affiche pas. Essayez cat <(ssh user@server 'cat remote_file')et cat < <(ssh user@server 'cat remote_file')de voir les différences.
jeudi

9

Peut-être que cela n’est pas utile dans votre cas exact, mais j’utilise souvent simplement

sum -r

sur chaque machine, et comparez manuellement les sommes de contrôle. Cela permet de comparer des fichiers même s’ils ne sont pas accessibles via une connexion ssh. Bien sûr, tout ce qu’elle répond est "sont-ils identiques", mais cela suffit souvent à mes besoins. Il est également facile de vérifier qu’un seul fichier est identique sur 3, 4 ou plus de machines.


2
J'imagine que pour les gros fichiers ou les connexions lentes, cela pourrait être très utile. Il enregistre le téléchargement de l'intégralité du fichier lorsque les fichiers sont réellement différents. Un meilleur scripteur Bash que moi peut probablement combiner cette réponse avec les réponses ci-dessus impliquant une télécommande catpour exécuter réellement la catcommande uniquement lorsqu'il a été déterminé que les fichiers diffèrent.
Stijn de Witt

1
Commandant info coreutils 'sum invocation'dit, entre autres: "La" somme "est fournie pour la compatibilité; le programme" cksum "(voir section suivante) est préférable dans les nouvelles applications."
Teemu Leisti

1

Si vous préférez une approche plus visuelle dans votre session de terminal. Midnight Commander dispose d'une option de système de fichiers à distance (lien SFTP ... dans le menu) et d'une option de comparaison visuelle de fichiers. Il n'est pas installé par défaut sur la plupart des systèmes Linux, mais il est disponible dans la plupart des référentiels de base. Pas:

  1. Démarrer midnight commander (commande:) mcdans le dossier contenant le fichier à comparer
  2. De l’autre côté (par exemple, le menu de droite ), créez un lien sftp vers l’autre serveur du même dossier ( sftp://<user>@<servername>/<path>).
  3. À l'aide de la instouche, sélectionnez / mettez en surbrillance les fichiers à comparer. ( tabchange entre les panneaux gauche et droit).
  4. Dans le menu Commande , sélectionnez Comparer les fichiers.

Remarque: le menu commandant de minuit peut généralement être accessible à l'aide de la souris dans votre session de terminal. F9Si cela ne fonctionne pas, vous êtes également dans le menu.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.