การทำให้แท็บเสร็จสมบูรณ์สำหรับโฮสต์ที่กำหนดใน ~ / .ssh / config ไม่ทำงานอีกต่อไปบน Yosemite


38

ฉันกำลังพยายามสร้าง~/.ssh/configไฟล์เพื่อทำให้ชีวิตการทำงานของฉันง่ายขึ้นในการเชื่อมต่อเซิร์ฟเวอร์

ใน Mavericks ทั้งหมดทำงานได้อย่างถูกต้องและtabฉันสามารถเติมชื่อโฮสต์โดยอัตโนมัติด้วยไฟล์ดังนี้:

Host test-host-name
    HostName 192.168.1.2
    User root

การกำหนดค่าเดียวกันบน Yosemite มีพฤติกรรมที่แตกต่างกัน เมื่อฉันพิมพ์ssh tบนเชลล์tabไม่ได้เติมชื่อโฮสต์ให้โดยอัตโนมัติ

มีใครรู้บ้างไหมว่าสิ่งที่เปลี่ยนแปลงในโยเซมิตีและตอนนี้ฉันต้องทำอะไรบางอย่างเพื่อให้มันทำงานได้หรือไม่?

คำตอบ:


37

คุณสามารถเปิดใช้งาน bash shell ที่สมบูรณ์โดยการติดตั้งbash-completionผ่านทางBrew :

brew install bash-completion

จากนั้นเพิ่มสิ่งต่อไปนี้ใน~/.bash_profile:

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

แหล่ง

(แก้ไข: brew tap homebrew/completionsเลิกใช้แล้วตั้งแต่ปี 2018)


+1 :) เมื่อติดตั้งทุบตีเสร็จ-1.3.3.high_sierra [ -f /usr/local/etc/bash_completion ] && . /usr/local/etc/bash_completionมันบอกฉันฉันควรเพิ่ม คุณช่วยอธิบายได้อย่างละเอียดว่าเวอร์ชั่นไหน (หรือของคุณ) ที่ต้องการและทำไม?
ม.ค. แนช

15

ฉันถือว่าเชลล์ของ Mac ของคุณเป็นทุบตี

คุณต้องกรอกคำสั่ง ssh เพื่ออ่านรายละเอียดเพิ่มเติม 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

อย่าลืมว่าคุณต้อง sourceใช้ไฟล์เพื่อรับคำสั่งใหม่เพื่อโหลดในเทอร์มินัลของคุณ หรือคุณสามารถใส่รหัสนี้ใน. bash_profile


ใช่เปลือกเป็นทุบตี ทำไมใน Maveriks ฉันไม่จำเป็นต้องทำสิ่งนี้?
RikyTres

ไม่ฉันเพิ่งทดสอบตอนนี้ ฉันไม่สามารถทำสิ่งนี้ได้ในค่าเริ่มต้น
เนลสัน

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")
หยุดชั่วคราวจนกว่าจะมีการแจ้งให้ทราบต่อไป

2

จากบทความนี้ในนิตยสาร

คัดลอก / วางต่อไปนี้ลงใน ~/.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

จากนั้นคุณจะต้องเริ่มต้นเทอร์มินัลหรือประเภทใหม่source ~/.bash_profile(โปรดทราบว่าอันหลังจะทำงานในแท็บปัจจุบันของคุณเท่านั้น)


ไม่ได้ผลสำหรับฉัน แต่apple.stackexchange.com/a/168168/136365ทำ ฉันคิดว่ามันเป็นการดีที่สุดที่จะหลีกเลี่ยงการพึ่งพาทับทิมสำหรับสิ่งนี้
Ben Creasy

0

FYI ฉันไม่แน่ใจว่าจะตอบสนองโดยตรงกับคำตอบของเนลสันได้อย่างไรเนื่องจากฉันยังไม่ได้สร้างชื่อเสียงมากพอที่จะแสดงความคิดเห็น แต่ในเครื่องของฉันที่รัน El Capitan ^Mได้ถูกผนวกเข้ากับชื่อโฮสต์ทั้งหมดจากไฟล์ปรับแต่งของฉัน . ผมต้องเพิ่มอย่างใดอย่างหนึ่ง\rของฉัน$IFSตัวแปรหรือลบ / ทดแทนทุกกรณีจากการส่งออกของสอง\r catในท้ายที่สุดฉันทำอย่างหลังโดยเพิ่มtr '\r' '\n'เพื่อทำให้เชนคำสั่งนั้นเป็นแบบนี้:

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

-1

คุณสามารถเพิ่มรายการใน / etc / hosts และใช้ในการเติมข้อความอัตโนมัติในชื่อโฮสต์:

"ssh @" + [TAB]

จำเป็นต้องรีบูตระบบเพื่อโหลดไฟล์นี้ใหม่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.