~ / .Ssh / config içinde tanımlanan ana bilgisayarlar için sekme tamamlama işlemi artık Yosemite'de çalışmıyor


38

~/.ssh/configSunucu bağlantısında çalışma hayatımı kolaylaştırmak için dosyamı oluşturmaya çalışıyorum .

Mavericks'te hepsi düzgün bir şekilde çalıştı ve tabben de ana bilgisayar adını aşağıdaki gibi bir dosyayla otomatik olarak tamamlayabildim:

Host test-host-name
    HostName 192.168.1.2
    User root

Yosemite'de de aynı konfigürasyonun farklı bir davranışı var. Ben yazdığınızda ssh tkabuk üzerinde tabhostname otomatik olarak tamamlanmaz.

Birisi Yosemite'de bir şeylerin değişip değişmediğini biliyor mu ve şimdi çalışmasını sağlamak için bir şey yapmam gerekiyor mu?

Yanıtlar:


37

Bash kabuk tamamlanmasını brewbash-completion vasıtasıyla kurarak etkinleştirebilirsiniz :

brew install bash-completion

Ardından aşağıdakileri bilgisayarınıza ekleyin ~/.bash_profile:

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

Kaynak

(Düzenleme: brew tap homebrew/completions2018'den itibaren kaldırılmıştır.)


+1 :) bash-completeion-1.3.3.high_sierra yüklerken eklemem gerektiğini söylüyor [ -f /usr/local/etc/bash_completion ] && . /usr/local/etc/bash_completion. Hangi versiyonun (sizin veya hangisinin) tercih edileceğini ve neden tercih edileceğini açıklayabilir misiniz?
Jan Nash,

15

Mac'inizin kabuğunun bash olduğunu varsayıyorum.

Ssh komutunu tamamlamanız gerekir, daha fazla ayrıntı için okuyabilirsiniz 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

Unutmayın source, terminalinize yüklenecek yeni komutu almak için dosyaya ihtiyacınız olduğunu unutmayın . veya Bu kodu .bash_profile dosyasına koyabilirsiniz.


Evet, kabuk bash. Maveriks'te neden böyle şeyler yapmam gerekmedi?
RikyTres

Hayır, şimdi test ettim. Bunu Mavericks'te varsayılan olarak yapamam.
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")
sonraki duyuruya kadar duraklatıldı.

2

Gönderen MacWorld bu makaleye .

Aşağıdakileri kopyalayın / yapıştırın ~/.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

Ardından terminalinizi veya türünüzü yeniden başlatmanız gerekecek source ~/.bash_profile(ikincisinin yalnızca geçerli sekmenizde çalışacağını unutmayın).


Benim için işe yaramadı. Ancak apple.stackexchange.com/a/168168/136365 yaptı. Bunun gibi bir şey için yakut güvenmekten kaçınmanın en iyi yol olduğunu düşünüyorum.
Ben Creasy

0

Bilginize, henüz yorum yapacak kadar itibar kazanmadığımdan doğrudan nelson yanıtına nasıl cevap vereceğimden emin değilim, ancak El Capitan çalıştıran ^Mmakinemde, config dosyamdaki tüm ana bilgisayar adlarına ekleniyordu. . Ya eklenti vardı \rbenim için $IFSdeğişken veya kaldır / tüm örneklerini yerine \rsaniyenin çıkışından cat. Sonunda, tr '\r' '\n'bu komut zincirinin şöyle görünmesini sağlamak için ekleyerek ikincisini yaptım :

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

-1

/ Etc / hosts dizinine girişler ekleyebilir ve bunları autocomplete ana bilgisayar adında kullanabilirsiniz:

"ssh @" + [TAB]

Bu dosyayı yeniden yüklemek için sistemin yeniden başlatılması gerekiyor.

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.