SSH를 통해 다른 호스트에 연결하기 위한 Bash 자동 완성

SSH를 통해 다른 호스트에 연결하기 위한 Bash 자동 완성

ssh나는 일반적으로 항상 사용하는 서버를 많이 가지고 있습니다 . bash또는를 사용하여 호스트 이름 목록을 유지 zsh하고 bash 자동 완성이 파일 전체를 반복하도록 하고 호스트 이름의 처음 몇 글자를 입력할 때 해당 문자로 시작하는 상자에 대한 제안을 제공할 수 있는 방법이 있습니까?

답변1

이것배쉬 완료패키지에는 ssh다음을 포함한 명령 완성이 포함되어 있습니다.

  • ssh
  • ssh-add
  • ssh-copy-id
  • sshfs

여기에서 소스 코드를 찾아볼 수 있습니다.https://alioth.debian.org/scm/browser.php?group_id=100114

답변2

Zsh완성은 소위 ssh 북마크를 사용하여 작동합니다. 이것들은 ~/.ssh/config.

예를 들어,

  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전체 옵션 목록을 확인하세요.

편집하다

나는 완료 스크립트를 사용하고 있습니다.오메지쉬:

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

비슷한 방법으로 ohmyzsh위의 스크립트 ~/.zsh/libs/completion.zsh를 넣고 ~/.zshrc.

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

답변3

복사한 곳unix.SE에 대한 내 답변:

Ubuntu 호스트를 사용하는 경우 Ubuntu에서 이를 알아야 합니다.의 항목이 ~/.ssh/known_hosts해시되었습니다.이므로 SSH 완료에서는 읽을 수 없습니다. 이는 버그가 아닌 기능입니다. 을 추가해도 호스트 해시를 방지 할 수 HashKnownHosts no없습니다 .~/.ssh/config/etc/ssh/ssh_config

~/.ssh/config그러나 해시되지 않은 구성된 항목을 읽을 수 있습니다 . 다음은 이 파일에서 항목을 읽는 Bash 완료 스크립트입니다.

_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

해당 스크립트를 넣고 /etc/bash_completion.d/ssh다음을 사용하여 가져옵니다.

$ . /etc/bash_completion.d/ssh

내가 찾은이 가이드이것은 매우 귀중하며 이것이 없이는 이 스크립트를 작성할 수 없습니다. 감사해요스티브 켐프훌륭한 가이드를 작성해주셔서 감사합니다!

답변4

이렇게 하려면 완료하려는 호스트를 파일에 넣으세요 /etc/hosts.

또한 bash-completion패키지(/etc/bash_completion 파일과 /etc/bash_completion.d 디렉토리 포함)가 필요합니다.

~/.bashrc에서 가져옵니다( . /etc/bash_completion-때때로 /etc/bash.bashrc 또는 ~/.bashrc에서 주석 처리됨).

관련 정보