Vous ne pouvez pas accéder au diff?

74

Je voulais être intelligent et comparer un fichier distant à un fichier local sans d'abord le télécharger manuellement. Je peux obtenir le contenu du fichier distant en

ssh user@remote-host "cat path/file.name"

Cependant, cela passe à diff

ssh user@remote-host "cat path/file.name" | diff path/file.name

me donne ceci:

diff: missing operand after `path/file.nae'
diff: Try `diff --help' for more information.

J'ai les clés ssh configurées, donc ce n'est pas pour me demander un mot de passe. Qu'est-ce qu'une solution de contournement pour cela?

utilisateur394
la source
5
En passant, vous téléchargez toujours le fichier quand vous le faites (puisque son contenu est envoyé via la connexion SSH), vous ne l'enregistrez pas nulle part. Donc, ce n'est pas comme si vous économisiez de la bande passante ou quoi que ce soit.
David Z
2
Ouais, je ne veux tout simplement pas foutre en l'air dans mon système de fichiers avec des fichiers uniques.
user394
1
car lorsque la commande ne prend pas en charge stdin (par exemple, via -), vous pouvez utiliser /dev/stdin. par exemplediff file1 /dev/stdin
ctrl-alt-delor

Réponses:

92

Essayez d'utiliser -pour représenter l'entrée standard.

ssh user@remote-host "cat path/file.name" | diff path/file.name -

Hemant
la source
lors de la comparaison de fichiers géants (tels que des images de disque Linux), cela les envoie tous vers la console! même avec diff -s (pour "même"), il le fait.
user391339
65

Voici une solution de contournement: diffsemble accepter <( expr ) comme argument:

diff <(ssh \"cat path/file.name/") <(cat path/file.name)
utilisateur394
la source
17
Ce n'est pas diff, c'est le shell (bash, ksh et zsh supportent cette syntaxe, mais ce n'est pas POSIX), avec l'aide du noyau (il doit fournir /dev/fd: diffquelque chose comme /dev/fd/3sur sa ligne de commande).
Gilles, arrête de faire le mal '20
3
Cela ne "doit pas fournir" - les shells peuvent aussi créer des pipes nommés temporaires pour cette fonctionnalité.
éphémère
3
c'est la réponse la plus cool!
Neves
6
Personnellement, je préfère cette réponse. Je devais diff deux fichiers XML différents; mais ils devaient d'abord être correctement formés. Cela a conduit à ceci: diff -y <(xmllint --format "${1}") <(xmllint --format "${2}")je l’utilise maintenant tout le temps.
Paul Nelson Baker
Ceci est également très utile sur OS X, où l’on peut vouloir comparer deux fichiers .plist binaires:diff <(plutil -convert xml1 -o -- "${1}") <(plutil -convert xml1 -o - -- "${2}")
morgant le
4

Piping dans diff est équivalent à courir

diff path/file.name

et ensuite, une fois qu'il est en cours d'exécution, en tapant tout le contenu du fichier.

Comme vous pouvez le constater, ce n'est pas ce à quoi vous vous attendiez.

Macha
la source
Pas de solution de contournement? :(
user394
1
Regardez la réponse de Hemant. Je n'en connaissais pas.
Macha
1
diff /tmp/localtempfile <(ssh -A -o StrictHostKeyChecking=no root@server "cat /tmp/remotetempfile")
Michael Mrozek
la source
Qu'en est-il de l'abaissement de la sécurité StrictHostKeyChecking=no? Sinon une bonne réponse.
ctrl-alt-delor