Funzionalità di completamento automatico Bash per SSHing in host diversi


8

Ho una grande lista di server che normalmente faccio sshsempre. Esiste un modo per usare basho zshcosì che posso mantenere l'elenco dei nomi host e il completamento automatico bash passa attraverso il file e mi dà suggerimenti per le caselle che iniziano con quelle lettere ogni volta che scrivo le prime lettere del nome host.

Risposte:


8

Zshil completamento funziona con i cosiddetti segnalibri ssh. Queste sono le configurazioni per host in ~/.ssh/config.

Per esempio,

  host baz
    hostname 192.168.1.2
    port 22
    user warrick

  host bar
    hostname example.com
    port 2200
    user kevin
    identityfile /home/warrick/.ssh/ec2.pem

man ssh_config per visualizzare un elenco completo di opzioni.

MODIFICARE

Sto usando lo script di completamento di ohmyzsh :

https://raw.github.com/robbyrussell/oh-my-zsh/master/lib/completion.zsh

In uno stile simile a ohmyzsh, ho inserito lo script sopra ~/.zsh/libs/completion.zshe l' ho aggiunto a ~/.zshrc.

# ~/.zshrc
for f in ~/.zsh/libs/*; do
  source $f
done

Non uso zsh ma bash ...
Gilles Quenot il

Bene, la domanda di OP è per bash o zsh, il mio commento sul tuo post è stato semplicemente quello di favorire ~ / .ssh / config in / etc / hosts se possibile, cosa che secondo la sua domanda è possibile quando si utilizza zsh.
kwarrick,


6

Copiato dalla mia risposta su unix.SE :

Se sei su un host Ubuntu, allora dovresti sapere che in Ubuntu le voci in ~/.ssh/known_hostssono sottoposte a hash , quindi il completamento di SSH non può leggerle. Questa è una funzione, non un bug. Anche aggiungendo HashKnownHosts noa ~/.ssh/confige /etc/ssh/ssh_confignon sono stato in grado di impedire l'hash dell'host.

Tuttavia, è possibile leggere le voci configurate da ~/.ssh/configcui non è stato eseguito l'hashing. Ecco uno script per il completamento di Bash che legge le voci da quel file:

_ssh() 
{
    local cur prev opts
    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"
    prev="${COMP_WORDS[COMP_CWORD-1]}"
    opts=$(grep '^Host' ~/.ssh/config | awk '{print $2}')

    COMPREPLY=( $(compgen -W "$opts" -- ${cur}) )
    return 0
}
complete -F _ssh ssh

Inserisci quello script /etc/bash_completion.d/sshe quindi procedi con il seguente comando:

$ . /etc/bash_completion.d/ssh

Ho trovato questa guida preziosa e non avrei potuto scriverla senza di essa. Grazie Steve Kemp per aver scritto quella fantastica guida!


2
+1 ma vorrei sostituire la riga awk con opts=$(grep '^Host' ~/.ssh/config | sed 's@^Host @@')perché la ~/.ssh/configsintassi consente più nomi su una singola riga
nhed

@nhed: grazie! Non sapevo che fosse permesso.
dotancohen,

0

Affinché funzioni, inserisci tutti gli host che desideri completare nel tuo /etc/hostsfile.

È necessario anche il bash-completionpacchetto (contenente il file / etc / bash_completion e la directory /etc/bash_completion.d)

e sorgente in ~ / .bashrc ( . /etc/bash_completion- a volte è commentato in /etc/bash.bashrc o in ~ / .bashrc).


4
Consiglio di non usare / etc / hosts. Invece aggiungi i cosiddetti segnalibri ssh in ~ / .ssh / config. man ssh_configper maggiori dettagli, ma è molto più versatile e consente di specificare più alias, nome utente, porta e molto altro ancora.
kwarrick,

Con archlinux, quando inserisco qualcosa /etc/ssh/ssh_config, non ho alcun lavoro completo per gli host configurati.
Gilles Quenot,

Vedi la mia risposta estesa, sto usando il completamento da ohmyzsh.
kwarrick,

1
Se guardi la fonte , vedrai che lo script controlla known_hostscosì come gli altri file di configurazione, ad es.,~/.ssh/config
jasonwryan,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.