Hoàn thành tab cho máy chủ được xác định trong ~ / .ssh / config không hoạt động nữa trên Yosemite


38

Tôi đang cố gắng tạo ~/.ssh/configtập tin của mình để đơn giản hóa cuộc sống công việc của mình trên kết nối máy chủ.

Trong Mavericks, tất cả đều hoạt động bình thường và với tabtôi đã có thể tự động điền tên máy chủ với tệp như thế này:

Host test-host-name
    HostName 192.168.1.2
    User root

Cấu hình tương tự trên Yosemite có hành vi khác nhau. Khi tôi gõ ssh ttrên shell, tabnó không tự động điền tên máy chủ.

Có ai biết nếu một cái gì đó thay đổi trong Yosemite và bây giờ tôi cần phải làm gì đó để làm cho nó hoạt động?

Câu trả lời:


37

Bạn có thể kích hoạt hoàn thành bash shell bằng cách cài đặt bash-completionqua brew :

brew install bash-completion

Sau đó thêm các mục sau vào ~/.bash_profile:

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

Nguồn

(Chỉnh sửa: brew tap homebrew/completionskhông dùng nữa vào năm 2018.)


+1 :) Khi cài đặt bash-xong-1.3.3.high_sierra, nó cho tôi biết tôi nên thêm [ -f /usr/local/etc/bash_completion ] && . /usr/local/etc/bash_completion. Bạn có thể giải thích về phiên bản nào (phiên bản đó hoặc của bạn) nên được ưu tiên và tại sao?
Jan Nash

15

Tôi giả sử vỏ Mac của bạn là bash.

Bạn cần hoàn thành lệnh ssh, để biết thêm chi tiết bạn có thể đọc 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

Đừng quên bạn cần vào sourcetệp để nhận lệnh mới để tải trong thiết bị đầu cuối của bạn. hoặc Bạn có thể đặt mã này vào .bash_profile


Đúng, vỏ là bash. Tại sao ở Maverik tôi không cần phải làm điều này?
RikyTres

Không, tôi vừa mới thử nghiệm. Tôi không thể làm điều đó trong Mavericks theo mặc định.
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")
Tạm dừng cho đến khi có thông báo mới.

2

Từ bài viết này trên MacWorld .

Sao chép / dán các mục sau vào ~/.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

Sau đó, bạn sẽ cần phải khởi động lại thiết bị đầu cuối hoặc loại của bạn source ~/.bash_profile(lưu ý rằng cái sau sẽ chỉ hoạt động trong tab hiện tại của bạn).


Không làm việc cho tôi. Nhưng apple.stackexchange.com/a/168168/136365 đã làm. Tôi nghĩ tốt nhất là tránh dựa vào ruby ​​cho những thứ như thế này.
Ben Creasy

0

FYI, tôi không chắc làm thế nào để trả lời trực tiếp câu trả lời của nelson vì tôi chưa đủ uy tín để bình luận về nó, nhưng trên máy của tôi chạy El Capitan, ^Mđã được thêm vào tất cả các tên máy chủ từ tệp cấu hình của tôi . Tôi đã phải thêm \rvào $IFSbiến của mình hoặc xóa / thay thế tất cả các phiên bản \rtừ đầu ra của giây cat. Cuối cùng, tôi đã làm cái sau bằng cách thêm vào tr '\r' '\n'để làm cho chuỗi lệnh đó trông như thế này:

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

-1

Bạn có thể thêm các mục trong / etc / hosts và sử dụng chúng trong tự động điền tên máy chủ:

"ssh @" + [TAB]

Yêu cầu khởi động lại để hệ thống tải lại tập tin này.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.