[unix] SSH 및 SCP의 자동 완성 서버 이름

나는 몇 서버에 구성되어 ~/.ssh/config같은 alphabeta. 어떻게 배쉬는 명령하도록 구성 할 수있는 ssh al<tab>과가 scp file.tgz al<tab>구성된 서버의 이름을 자동으로 완성?

서버를 정기적으로 추가 및 제거하고 목록이 매우 커서 서버를 추가 할 때마다 서버를 다른 파일 (예 : Bash 배열) 에 추가하고 싶지 않습니다 .



답변

그것을 발견!!

우분투 에서는의 항목 ~/.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 ~/.ssh/config.d/* 2>/dev/null | grep -v '[?*]' | cut -d ' ' -f 2-)

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

해당 스크립트를 /etc/bash_completion.d/ssh넣고 다음 명령을 사용하여 소스를 만드십시오 .

$ . /etc/bash_completion.d/ssh

나는 이 안내서가 매우 귀중 하다는 것을 알았 습니다. 훌륭한 가이드를 작성해 주신 Steve Kemp 에게 감사합니다 !


답변

사전 포장

어떤 배포판을 사용하고 있지는 않지만 Fedora 19 시스템에는 다음과 같은 패키지가 설치되어 있습니다. bash-completion이 패키지 는이 완성 규칙 파일을 통해이 기능을 제공합니다.

/usr/share/bash-completion/completions/ssh

내가 설치 한 패키지는 다음과 같습니다.

$ rpm -aq |grep completion
bash-completion-2.1-2.fc19.noarch

해당 규칙 파일을 살펴보면 파일을 조사하는 스탠자가 표시 $HOME/.ssh/config됩니다.

$ grep config /usr/share/bash-completion/completions/ssh
    local configfile
    local -a config
        # Search COMP_WORDS for '-F configfile' or '-Fconfigfile' argument
                    configfile="$(dequote "${1:2}")"
                    [[ $1 ]] && configfile="$(dequote "$1")"
        _known_hosts_real -a -F "$configfile" "$cur"
    local configfile
        # Search COMP_WORDS for '-F configfile' argument
                    configfile="$(dequote "${1:2}")"
                    [[ $1 ]] && configfile="$(dequote "$1")"
        _known_hosts_real -a -F "$configfile" "$cur"
    local configfile prefix
        # Search COMP_WORDS for '-F configfile' or '-Fconfigfile' argument
                    configfile="$(dequote "${1:2}")"
                    [[ $1 ]] && configfile="$(dequote "$1")"
                _known_hosts_real -c -a -F "$configfile" "$cur"

자신의 롤링

또한이 요지 인 known_hosts_autocomplete.sh를 발견 하여 $HOME/.ssh/known_hosts파일을 제외하고 비슷한 것을 수행 합니다.

# add to ~/.bash_profile, and close/reopen a shell.  Will autocomplete any
# hosts found in known_hosts.

complete -W "$(echo `cat ~/.ssh/known_hosts | cut -f 1 -d ' ' | \
    sed -e s/,.*//g | uniq | grep -v "\["`;)" ssh

$HOME/.ssh/config어떤 이유로 ssh이미 사전 패키지 된 완료 규칙 파일을 찾을 수없는 경우 파일을 사용하여 유사한 작업을 수행 할 수 있습니다.


답변

우분투가 알려진 호스트를 해시하기 때문에 자동 완성 기능이 작동하지 않는 것으로 나타났습니다. 추가 할 수 있습니다

Host *
    HashKnownHosts no

당신에 .ssh/config파일하지만 기존의 호스트는 않은 해시되지 않습니다.


답변

데비안과 우분투에서 ssh 자동 완성 기능을 활성화하려면 :

sudo apt-get install bash-completion

이것은 위에서 언급 한 것과 원래의 질문과는 달리 known_hosts 해싱과 전혀 관련없습니다 . known_hosts에서 자동 완성을 원한다면 물론 해싱을 비활성화해야하지만 강력하게 권장 하지는 않습니다.

예를 들어, 나는 :

Host *
    HashKnownHosts yes

내 .ssh / config에서 .ssh / config 및 / etc / hosts에 나열된 호스트에 대해 여전히 ssh 자동 완성 기능이 제대로 작동합니다. OP가 명시된대로 호스트를 .ssh / config에 추가해야합니다.

호스트 my-awesome-host 호스트 이름 the.real.host.name

또는 데비안 / 우분투 스크립트의 또 다른 소스 인 / etc / hosts에 호스트 항목을 추가 할 수 있습니다.

그런 다음 입력 만하면 ssh my-awe<tab>자동으로 완료됩니다. 다시 말하지만 HashKnownHosts 인 경우에도 마찬가지입니다. (bash bash에서 bash 완료를 활성화해야하며 배포를 위해 위와 같이 해당 스크립트를 설치해야합니다.)

그런 다음이 줄을 추가 .bashrc하여 활성화합니다 (로그 아웃 한 후 다시 로그인해야하거나 bash새로운 셸을 시작하기 위해 새로 입력 한 것만 필요합니다 (이미 활성화되어 /etc/bash.bashrc있고 /etc/profile소스 인 경우 활성화 할 필요가 없습니다 /etc/bash.bashrc).

if [ -f /etc/bash_completion ]; then
    . /etc/bash_completion
fi

이것은 (무엇보다도!) SSH 자동 완성을 가능하게 할 것이다부터 ~/.ssh/config, /etc/hosts

데비안은 bash 대신 ash로 기본 설정되어 있습니다. bash로 쉽게 전환 할 수 있습니다 :

sudo usermod -s /bin/bash "$USER"

(이 기능을 적용하려면 로그 아웃했다가 다시 로그인해야합니다.)


답변

Ubuntu 14.04에서는 ssh서버에 언급 된 서버를 자동 완성합니다.~/.ssh/config

내가 일반적으로 액세스하는 서버 중 하나만 자동 완성되는 것을 알았을 때 나는 그것을 알았습니다. 이 둘의 유일한 차이점은 인증과 관련된 ssh 구성 파일의 항목이었습니다. 다른 서버의 구성 파일에 새 항목을 추가하면 자동 완성도 시작되었습니다.

요청한 사람들을위한 항목은 다음과 같습니다.

HOST server-name 
    GSSAPIAuthentication=no

설정에서 지정한 내용이 중요하다면 (물론 여전히 유효한 한) 매우 놀랐습니다.


답변