Tính năng tự động hoàn thành Bash để SSH vào các máy chủ khác nhau


8

Tôi có một danh sách lớn các máy chủ mà tôi thường sshlàm mọi lúc. Có cách nào sử dụng bashhay không zshđể tôi có thể giữ danh sách tên máy chủ và tự động hoàn thành bash đi qua tệp và cho tôi đề xuất cho các hộp bắt đầu bằng các chữ cái đó bất cứ khi nào tôi nhập một vài chữ cái đầu tiên của tên máy chủ.

Câu trả lời:


8

Zshhoàn thành công việc với cái gọi là ssh bookmark. Đây là mỗi cấu hình máy chủ lưu trữ trong ~/.ssh/config.

Ví dụ,

  host baz
    hostname 192.168.1.2
    port 22
    user warrick

  host bar
    hostname example.com
    port 2200
    user kevin
    identityfile /home/warrick/.ssh/ec2.pem

man ssh_config để xem danh sách đầy đủ các tùy chọn.

BIÊN TẬP

Tôi đang sử dụng tập lệnh hoàn thành từ ohmyzsh :

https://raw.github.com/robbyrussell/oh-my-zsh/master/lib/completion.zsh

Trong phong cách tương tự ohmyzsh, tôi đặt đoạn script trên vào ~/.zsh/libs/completion.zshvà thêm nó vào ~/.zshrc.

# ~/.zshrc
for f in ~/.zsh/libs/*; do
  source $f
done

Tôi không sử dụng zsh nhưng bash ...
Gilles Quenot

Đúng, câu hỏi OP dành cho bash hoặc zsh, nhận xét của tôi về bài đăng của bạn chỉ đơn giản là ủng hộ ~ / .ssh / config cho / etc / hosts nếu có thể, theo câu hỏi của anh ấy là có thể khi sử dụng zsh.
kwarrick


6

Sao chép từ câu trả lời của riêng tôi trên unix.SE :

Nếu bạn đang sử dụng máy chủ Ubuntu, thì bạn nên biết rằng trong Ubuntu, các mục trong ~/.ssh/known_hostsđược băm , vì vậy hoàn thành SSH không thể đọc chúng. Đây là một tính năng, không phải là một lỗi. Ngay cả bằng cách thêm HashKnownHosts novào ~/.ssh/config/etc/ssh/ssh_configtôi không thể ngăn chặn việc băm máy chủ.

Tuy nhiên, bạn có thể đọc các mục được cấu hình từ ~/.ssh/configđó, không được băm. Đây là một kịch bản cho Bash Hoàn thành đọc các mục từ tệp đó:

_ssh() 
{
    local cur prev opts
    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"
    prev="${COMP_WORDS[COMP_CWORD-1]}"
    opts=$(grep '^Host' ~/.ssh/config | awk '{print $2}')

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

Đặt tập lệnh đó vào /etc/bash_completion.d/sshvà sau đó lấy nó bằng lệnh sau:

$ . /etc/bash_completion.d/ssh

Tôi thấy hướng dẫn này là vô giá và tôi sẽ không thể viết kịch bản này nếu không có nó. Cảm ơn Steve Kemp đã viết hướng dẫn tuyệt vời đó!


2
+1 nhưng tôi sẽ thay thế dòng awk bằng opts=$(grep '^Host' ~/.ssh/config | sed 's@^Host @@')~/.ssh/configcú pháp cho phép nhiều tên trên một dòng
nhed

@nhed: Cảm ơn bạn! Tôi không biết điều đó đã được cho phép.
dotancohen

0

Để làm việc này, hãy đặt bất kỳ máy chủ nào bạn muốn hoàn thành trong /etc/hoststệp của mình .

Bạn cũng cần bash-completiongói (chứa tệp / etc / bash_completion và thư mục /etc/bash_completion.d)

và nguồn nó trong ~ / .bashrc ( . /etc/bash_completion- đôi khi nó được nhận xét trong /etc/bash.bashrc hoặc trong ~ / .bashrc).


4
Tôi khuyên bạn không nên sử dụng / etc / hosts. Thay vào đó hãy thêm cái gọi là ssh bookmark trong ~ / .ssh / config. man ssh_configđể biết thêm chi tiết, nhưng nó linh hoạt hơn nhiều cho phép bạn chỉ định nhiều bí danh, tên người dùng, cổng và nhiều hơn nữa.
kwarrick

Với archlinux, khi tôi đặt một cái gì đó vào /etc/ssh/ssh_config, tôi không hoàn thành công việc cho các máy chủ được cấu hình.
Gilles Quenot

Xem câu trả lời mở rộng của tôi, tôi đang sử dụng hoàn thành từ ohmyzsh.
kwarrick

1
Nếu bạn nhìn vào nguồn , bạn sẽ thấy tập lệnh kiểm tra known_hostscũng như các tệp cấu hình khác, ví dụ:~/.ssh/config
jasonwryan
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.