SSH ve SCP için otomatik tamamlama sunucusu adları


61

Birkaç sunucular yapılandırılmış olması ~/.ssh/configgibi, alphave beta. Bash'i , yapılandırılan sunucuların adlarını ssh al<tab>ve komutlarını scp file.tgz al<tab>otomatik olarak tamamlayacak şekilde nasıl yapılandırabilirim?

Sunucuları düzenli olarak ekleyip çıkardığımız ve liste oldukça büyük olduğu için, her seferinde bir başka sunucuya (yani bir Bash dizisi) sunucu eklemek istemiyorum .


2
Dağıtımınız için bash tamamlama paketiniz var mı? Sanırım bu, zsh ile karıştırıyor olmama rağmen, standart tamamlama yordamlarının bir parçası.
Caleb,

Yüklemem tam olarak bunu yapıyor.
slm

Bu Kubuntu 12.10'da ve ben bash-completionkurdum.
dotancohen

Yanıtlar:


64

Buldum !!

Görünüşe göre Ubuntu'da girişler ~/.ssh/known_hostsözetlenmiştir , böylece SSH tamamlama bunları okuyamaz. Bu bir özellik değil, bir hata. Hatta ekleyerek HashKnownHosts noiçin ~/.ssh/configve /etc/ssh/ssh_configben konak karma önleyemedi.

Ancak, ilgilendiğim ana bilgisayarlar da bulunur ~/.ssh/config. İşte bu dosyadan girişleri okuyan Bash Completion için bir betik:

_ssh() 
{
    local cur prev opts
    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"
    prev="${COMP_WORDS[COMP_CWORD-1]}"
    opts=$(grep '^Host' ~/.ssh/config ~/.ssh/config.d/* 2>/dev/null | grep -v '[?*]' | cut -d ' ' -f 2-)

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

Bu betiği içine koyun /etc/bash_completion.d/sshve ardından aşağıdaki komutu verin:

$ . /etc/bash_completion.d/ssh

Bu kılavuzu paha biçilmez buldum ve onsuz bunu kodlayamazdım. Bu müthiş rehberi yazdığın için teşekkürler Steve Kemp !


1
Centos'taki ~ / .ssh / known_hosts içindeki 6 girdi ~ / .ssh / config biçiminde fazla gezintili girdiler gösteriyor. Eğer bilinen_toplarda foo.bar.baz.com varsa, o zaman "ssh foo" <tab> yaparsanız her şey eşleşecektir - bu, ssh kong. Otomatik olarak tamamlanmayan bir ssh config girdisine sahipseniz, bilinen_hostlarda var olup olmadığını kontrol edin ve silin. Şimdi config ayarlarından alarak normal olarak çalışması gerekir.
Imran-UK

@ Imran-UK: Ubuntu'nun bu mantıklı şeyi güvenlik nezaketinde yapmadığı bilinmektedir. Görünüşe göre düşünce, kötü niyetli bir varlığın, dizinde chmod 0600'e rağmen, kullanıcı olarak ~ / .ssh / config'i düzenleyebileceği yönünde. Hey, kararı veren ben değildim!
dotancohen

1
Ben zsh & oh-my-zsh kullandım, sadece "ssh" eklentisini etkinleştirmenin ve "HashKnownHosts yes" ifadesini ~ / .ssh / config dosyama koymanın doğru olanı yaptığını gördüm. Herhangi bir dağıtımı ne olursa olsun kabuğunu değiştirebilirsin, böylece bunun bir yolu olabilir.
Imran-UK

@ Imran-UK: Aslında geçmişte zsh'i denedim ve tekrar denemeyi düşünüyorum. Buna bakacağım. Shukran arkadaşım!
dotancohen

Partiye biraz geç kaldığımı biliyorum, ancak RHEL 7 içinde olan girişleri otomatik olarak /etc/hoststamamlayacak, diğer dağıtımlar da aynı şeyi yapabilir.
Centimane

16

Önceden paketlenmiş

Hangi dağıtımı kullandığınızı söylemiyorsunuz ama Fedora 19 sistemimde bash-completionbu özelliği bu tamamlama kuralı dosyası aracılığıyla sağlayan aşağıdaki pakete sahibim :

/usr/share/bash-completion/completions/ssh

İşte kurduğum paket:

$ rpm -aq |grep completion
bash-completion-2.1-2.fc19.noarch

Bu kural dosyasına bakarsanız, $HOME/.ssh/configdosyayı sorgulayan stanzalar görürsünüz :

$ grep config /usr/share/bash-completion/completions/ssh
    local configfile
    local -a config
        # Search COMP_WORDS for '-F configfile' or '-Fconfigfile' argument
                    configfile="$(dequote "${1:2}")"
                    [[ $1 ]] && configfile="$(dequote "$1")"
        _known_hosts_real -a -F "$configfile" "$cur"
    local configfile
        # Search COMP_WORDS for '-F configfile' argument
                    configfile="$(dequote "${1:2}")"
                    [[ $1 ]] && configfile="$(dequote "$1")"
        _known_hosts_real -a -F "$configfile" "$cur"
    local configfile prefix
        # Search COMP_WORDS for '-F configfile' or '-Fconfigfile' argument
                    configfile="$(dequote "${1:2}")"
                    [[ $1 ]] && configfile="$(dequote "$1")"
                _known_hosts_real -c -a -F "$configfile" "$cur"

Kendi haddeleme

Ayrıca, bu Gist'i de gördüm, bilinen_hosts_autocomplete.sh , bu $HOME/.ssh/known_hostsdosya dışında benzer bir şey yapar .

# add to ~/.bash_profile, and close/reopen a shell.  Will autocomplete any
# hosts found in known_hosts.

complete -W "$(echo `cat ~/.ssh/known_hosts | cut -f 1 -d ' ' | \
    sed -e s/,.*//g | uniq | grep -v "\["`;)" ssh

Herhangi bir $HOME/.ssh/confignedenle sshzaten önceden paketlenmiş için tamamlama kuralı dosyasını bulamıyorsanız, dosyanızı kullanarak benzer bir şey yapabilirsiniz .


Teşekkür ederim. Ubuntu'nun birlikte gönderilmediği anlaşılıyor /usr/share/bash-completion/completions/ssh. Bu dosyanın tamamını kopyalayabileceğim bir yere gönderir misiniz? Teşekkürler!
dotancohen

Tüm dosyaları bu arşivden alabilirsiniz: pkgs.fedoraproject.org/repo/pkgs/bash-completion/…
slm

Acı ettiğim için üzgünüm ama ssh dosyasını o tar arşivinden kopyalamak bile /usr/share/bash-completion/completions/sshyardımcı olmuyor! Hiçbiri complete -W ...Bash komut isteminden çalıştırmıyor. Burada sorun ne olabilir?
dotancohen

Teşekkür ederim. Bu, Ubuntu'da bilinen bir tasarım kararı gibi görünüyor . Bu yüzden sshveya için bash tamamlama işlemi yapamamaya rağmen cevabı kabul ediyorum scp.
dotancohen

2
OSX için Homebrew da şuna sahiptir: bash tamamlama ve zsh tamamlama
Adam Nelson

7

Ubuntu'nun bilinen ana bilgisayarlara hash almasından dolayı otomatik tamamlamanın çalışmadığını öğrendim. Ekleyebilirsin

Host *
    HashKnownHosts no

Sizin için .ssh/configdosyanın ancak mevcut barındıran un karma olmayacaktır.


Teşekkür ederim. Aslında bu yönergeyi zaten ekledim ~/.ssh/configve yönergeyi değiştirdim /etc/ssh/ssh_configve ~/.ssh/known_hostsdosyayı kaldırdım . Sunuculara tekrar giriş yaptıktan sonra, ana bilgisayar adları hala saklanıyor.
dotancohen

Cevabımı değiştirdim; bir ana bilgisayar belirtmeniz ve içindeki karma yönergeyi içine yerleştirmeniz gerekir; .ssh/configZaten bu kadar çok dosyada bu satırın olacağının listesi yoktu . İşe yararsa haberim olsun.
M1ke

Bu kesinlikle yapmanın kolay yolu! Ubuntu'nun (yeni sürümleri) şimdi ssh tamamlamanın etkin olduğu göz önüne alındığında, muhtemelen bu istenir.
John Montgomery,

Aşağıya eklediğim gibi, bunu yapabilirsiniz, ancak muhtemelen yapmamalısınız - yine de çalışmayı tamamlamanıza gerek yok. Bununla birlikte, yukarıda belirtilenleri ekledikten sonra var olan ana bilgisayarları yalnızca onaylamak istemiyorsanız ve sadece hash yapmak istemeniz durumunda, sadece rm ~ / .ssh / known_hosts öğelerini kullanabilirsiniz. yeni bir sunucuya giriş yapın.
Jamieson Becker,

3

Debian ve Ubuntu'da ssh autocompletion özelliğini etkinleştirmek için:

sudo apt-get install bash-completion

Bunun, yukarıda belirtilenlere ve orijinal soruya aykırı olarak, bilinen_hosts karması ile hiçbir ilgisi olmadığını unutmayın . Bilinen_host'lardan otomatik olarak tamamlanmak istiyorsanız, o zaman elbette hashlemeyi devre dışı bırakmanız gerekir, ancak buna karşı şiddetle tavsiye edilir.

Örneğin, var:

Host *
    HashKnownHosts yes

benim .ssh / config ve hala ssh otomatik tamamlama hala .ssh / config ve / etc / hosts dosyasında listelenen ana bilgisayarlara karşı iyi çalışıyor. OP'yi belirtildiği gibi ana bilgisayarı .ssh / config dosyasına eklemeniz gerekir:

Host-host-host Hostname, the.real.host.name

(Veya, Debian / Ubuntu komut dosyaları için başka bir kaynak olan / etc / hosts dosyasına bir ana bilgisayar girişi ekleyebilirsiniz.)

Sonra, sadece yazabilirsiniz ssh my-awe<tab>ve otomatik olarak tamamlanacaktır. Yine, bu şiddetle tavsiye edilir, HashKnownHosts olsa bile. (Bash tamamlamanın bash kabuğunuzda etkinleştirilmiş olması gerektiğini ve dağıtımınız için yukarıdaki gibi bu komut dosyalarının özellikle yüklü olması gerektiğini unutmayın.)

Ardından, .bashrcetkinleştirmek için bu satırları ekleyin (oturumu kapatıp tekrar oturum bashaçmayı veya yeni bir kabuk başlatmak için sadece yeni bir giriş yapmayı gerektirir . (Zaten etkinleştirilmişse /etc/bash.bashrcve /etc/profilekaynakları etkinleştirmeniz gerekmez /etc/bash.bashrc).

if [ -f /etc/bash_completion ]; then
    . /etc/bash_completion
fi

Bu (diğer şeylerin yanı sıra!) Ssh otomatik tamamlama sağlayacak dan ~/.ssh/config, /etc/hostsvb

Debian'ın bash yerine ash olarak varsayılan olduğunu unutmayın. Kolayca bash geçiş yapabilirsiniz:

sudo usermod -s /bin/bash "$USER"

(Bunun etkili olması için oturumu kapatıp tekrar açmanız gerekir.)


2

Ubuntu 14.04’te, telefonunuzda sshbelirtilen sunucuları otomatik olarak tamamlar.~/.ssh/config

Yaygın olarak erişim sağladığım sunuculardan yalnızca birinin otomatik olarak tamamlandığını fark ettiğimde fark ettim. İkisi arasındaki tek fark, kimlik doğrulama ile ilgili olan ssh config dosyasındaki bir girdi. Diğer sunucu için config dosyasına yeni bir giriş eklediğimde, otomatik olarak tamamlamaya başladı.

İşte sormak isteyenler için giriş:

HOST server-name 
    GSSAPIAuthentication=no

Eğer config içinde ne yazdığınızı farketmiş olsaydım çok şaşırdım (tabii ki hala geçerli olduğu sürece).


Teşekkürler Noah, o giriş neydi? Benim 14.04 ve 14.10 sistemlerde otomatik tamamlama çalışmıyor.
dotancohen

Girişin önemli olduğunu sanmıyorum - sadece orada olduklarından eminim - ama girişi cevabımı ekleyeceğim.
Nuh
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.