Quelle est la magie qui me permet de tabuler des fichiers distants lorsque je tape une commande scp?

16

Vraisemblablement, c'est une fonctionnalité fournie par un plugin que j'ai activé dans ma configuration oh-my-zsh (j'utilise zsh depuis de nombreuses années maintenant).

J'ai remarqué depuis que j'ai ajouté ma clé publique au serveur (maintenant je peux SSH sur le serveur sans entrer de mot de passe), quand je compose une scpcommande dans mon shell, je suis en fait capable de compléter les chemins de fichiers distants par tabulation!

par exemple

$ diff <(scp Remoteuser@remote.domain.net:/var/www/html/

J'ai frappé tab et ça fonctionne! (quant à ce que j'essaye d'accomplir avec la commande elle-même, je vais utiliser scppour "copier" sur stdout, et le nourrir comme un fichier à diff. De cette façon, je peux voir les changements exacts que je déploie sur le serveur avant en cours d'exécution rsync)

Je suis curieux de savoir quelles sont les pièces qui font si bien ce travail. Est-ce quelque chose de intégré à scp qui a été intégré à z shell? Ou autre chose?

Steven Lu
la source

Réponses:

16

Oooh, j'ai trouvé une explication .

Pour citer la partie pertinente:

Le shell zsh est livré avec (plus d'une) grande fonctionnalité (s), comme la complétion à distance des onglets. Si vous voulez par exemple copier un fichier sur scp, appuyez simplement sur tab à n'importe quelle partie du nom de fichier sur l'hôte distant. zsh est en mesure d'établir une session ssh en arrière-plan et de récupérer les informations associées pour vous, afin que vous puissiez terminer les fichiers distants par tabulation.

La publication continue en montrant quelques zstyledéclarations qui aboutissent, mais je suggérerais fortement d'utiliser un package zsh tel que le oh-my-zsh susmentionné pour que ce matériel soit maintenu par la communauté OSS pour vous.

Quelque chose d'apparemment pertinent, comme vu sur mon système dans mon dir .oh-my-zsh:

$ ack scp 
plugins/common-aliases/common-aliases.plugin.zsh
85:zstyle -e ':completion:*:(ssh|scp|sftp|rsh|rsync):hosts' hosts 'reply=(${=${${(f)"$(cat {/etc/ssh_,~/.ssh/known_}hosts(|2)(N) /dev/null)"}%%
[# ]*}//,/ })'

<...>
Steven Lu
la source
Incroyable!! Cette fonctionnalité est-elle exclusive à zsh. Est-ce possible en bash.
shivams
1
@shivams cela peut être pertinent pour vos besoins bash. Il semble que la configuration de oh-my-zsh soit beaucoup plus facile, et zsh est vraiment très agréable. Je pense que si vous vous souciez vraiment de cela, cependant, il n'y a pas grand-chose que zsh puisse faire que bash ne peut pas (et l'inverse est certainement vrai aussi). Tout simplement une question de travail que vous êtes prêt à y consacrer.
Steven Lu
7
@shivams Pour moi, c'est toujours juste travaillé en bash - je viens de taper instinctivement "tab" un jour dans une commande scp et j'ai été assez surpris de voir qu'il se complétait automatiquement! En parcourant Google, il semble que vous devez installer le paquet bash-complétion si vous ne l'avez pas déjà. Cette question unix.se est pertinente.
Pont