Il completamento della scheda per gli host definiti in ~ / .ssh / config non funziona più su Yosemite


38

Sto cercando di creare il mio ~/.ssh/configfile per semplificare la mia vita lavorativa sulla connessione al server.

In Mavericks tutto ha funzionato correttamente e con tabme sono stato in grado di completare automaticamente il nome host con il file in questo modo:

Host test-host-name
    HostName 192.168.1.2
    User root

La stessa configurazione su Yosemite ha un comportamento diverso. Quando scrivo ssh tsulla shell tab, il nome host non viene completato automaticamente.

Qualcuno sa se qualcosa è cambiato in Yosemite e ora devo fare qualcosa per farlo funzionare?

Risposte:


37

È possibile abilitare il completamento della shell bash installando bash-completiontramite brew :

brew install bash-completion

Quindi aggiungi quanto segue al tuo ~/.bash_profile:

if [ -f $(brew --prefix)/etc/bash_completion ]; then
. $(brew --prefix)/etc/bash_completion
fi

fonte

(Modifica: brew tap homebrew/completionsè obsoleto a partire dal 2018.)


+1 :) Quando installo bash-completamento-1.3.3.high_sierra, mi dice che dovrei aggiungere [ -f /usr/local/etc/bash_completion ] && . /usr/local/etc/bash_completion. Potresti approfondire quale versione (quella o la tua) dovrebbe essere preferita e perché?
Jan Nash,

15

Presumo che la shell del tuo Mac sia bash.

Devi completare il comando ssh, per maggiori dettagli puoi leggere man complete

_complete_ssh_hosts ()
{
        COMPREPLY=()
        cur="${COMP_WORDS[COMP_CWORD]}"
        comp_ssh_hosts=`cat ~/.ssh/known_hosts | \
                        cut -f 1 -d ' ' | \
                        sed -e s/,.*//g | \
                        grep -v ^# | \
                        uniq | \
                        grep -v "\[" ;
                cat ~/.ssh/config | \
                        grep "^Host " | \
                        awk '{print $2}'
                `
        COMPREPLY=( $(compgen -W "${comp_ssh_hosts}" -- $cur))
        return 0
}
complete -F _complete_ssh_hosts ssh

Non dimenticare che è necessario sourceil file per ottenere il nuovo comando da caricare nel tuo terminale. oppure Puoi inserire questo codice in .bash_profile


Sì, il guscio è bash. Perché in Maveriks non avevo bisogno di fare queste cose?
RikyTres,

No, ho testato proprio ora. Non posso farlo in Mavericks per impostazione predefinita.
Nelson

comp_ssh_hosts=$(awk -F , 'FNR== NR && ! /^#|\[/ {field = $1} FNR != NR && /^Host / {field = $2} {hosts[field]} END {for (host in hosts) {print host}' "$HOME/.ssh/known hosts" "$HOME/.ssh/config")
In pausa fino a nuovo avviso.

2

Da questo articolo su MacWorld .

Copia / incolla quanto segue in ~/.bash_profile:

complete -o default -o nospace -W "$(/usr/bin/env ruby -ne 'puts $_.split(/[,\s]+/)[1..-1].reject{|host| host.match(/\*|\?/)} if $_.match(/^\s*Host\s+/);' < $HOME/.ssh/config)" scp sftp ssh

Sarà quindi necessario riavviare il terminale o digitare source ~/.bash_profile(si noti che quest'ultimo funzionerà solo nella scheda corrente).


Non ha funzionato per me. Ma lo ha fatto apple.stackexchange.com/a/168168/136365 . Penso che sia meglio evitare di fare affidamento sul rubino per qualcosa del genere.
Ben Creasy,

0

Cordiali saluti, non sono sicuro di come rispondere direttamente alla risposta di Nelson dal momento che non ho ancora guadagnato abbastanza reputazione per commentarlo, ma sulla mia macchina che esegue El Capitan, ^Mè stato aggiunto a tutti i nomi host dal mio file di configurazione . Ho dovuto aggiungere \ralla mia $IFSvariabile o rimuovere / sostituire tutte le istanze di \rdall'output del secondo cat. Alla fine, ho fatto quest'ultimo aggiungendo tr '\r' '\n'per far apparire la catena di comando in questo modo:

cat ~/.ssh/config | \
        grep "^Host " | \
        awk '{print $2}' | \
        tr '\r' '\n'

-1

È possibile aggiungere voci in / etc / hosts e usarle nel completamento automatico del nome host:

"ssh @" + [TAB]

Il riavvio è necessario affinché il sistema ricarichi questo file.

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.