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


61

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

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


2
배포판에 bash-completions 패키지가 설치되어 있습니까? zsh와 혼동을 줄 수 있지만 이것이 표준 완료 루틴의 일부라고 생각합니다.
Caleb

내 설치는 정확히 이것을 수행합니다.
slm

이것은 Kubuntu 12.10에 있으며 bash-completion설치했습니다.
dotancohen

답변:


64

그것을 발견!!

우분투 에서는의 항목 ~/.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 에게 감사합니다 !


1
~ / .ssh / known_hosts의 Centos 6 항목은 ~ / .ssh / config의 항목보다 우선합니다. known_hosts에 foo.bar.baz.com이있는 경우 "ssh foo"<tab>를 수행하면 모든 것이 일치합니다. ssh 구성에서 다른 사용자 또는 다른 설정을 적용하려는 경우에는 바람직하지 않습니다. ssh config에 올바르게 자동 완성되지 않는 항목이 있으면 known_hosts에 있는지 확인하고 삭제하십시오. 이제 설정에서 설정을 가져와 정상적으로 작동합니다.
Imran-UK

@ Imran-UK : 우분투는 보안의 척박하에 그 합리적인 것을하지 않는 것으로 알려져 있습니다. 디렉토리의 chmod 0600에도 불구하고 악의적 인 엔티티가 사용자로서 ~ / .ssh / config를 편집 할 수있을 것으로 생각됩니다. 이봐, 난 결정을 한 사람이 아니야!
dotancohen

1
나는 zsh & oh-my-zsh를 사용하는데, 방금 "ssh"플러그인을 활성화하고 ~ / .ssh / config에 "HashKnownHosts yes"를 넣는 것이 옳은 것으로 보인다는 것을 알게되었습니다. 배포판이 무엇이든간에 쉘을 변경할 수 있으므로 주변 환경이 될 수 있습니다.
Imran-UK

@ Imran-UK : 사실 과거에 zsh를 시도했지만 다시 시도하려고합니다. 내가 살펴볼 게 슈크 란 내 친구!
dotancohen

나는 파티에 조금 늦었다는 것을 알고 있지만 RHEL 7은에있는 항목을 자동 완성 할 것이며 /etc/hosts다른 배포판도 마찬가지입니다.
Centimane

16

사전 포장

어떤 배포판을 사용하고 있지는 않지만 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이미 사전 패키지 된 완료 규칙 파일을 찾을 수없는 경우 파일을 사용하여 유사한 작업을 수행 할 수 있습니다.


감사합니다. 우분투는 함께 제공되지 않는 것 같습니다 /usr/share/bash-completion/completions/ssh. 복사 할 수있는 전체 파일을 게시 할 수 있습니까? 감사!
dotancohen

이 아카이브에서 모든 파일을 얻을 수 있습니다 : pkgs.fedoraproject.org/repo/pkgs/bash-completion/…
slm

아쉽게도 죄송하지만 해당 tar 아카이브에서 ssh 파일을 복사해도 /usr/share/bash-completion/completions/ssh도움이되지 않습니다! complete -W ...Bash 프롬프트에서 명령을 실행하지도 않습니다 . 여기서 문제가 무엇입니까?
dotancohen

감사합니다. 이것은 우분투에서 알려진 디자인 결정 으로 보입니다 . 따라서 내가 일하는 bash는 완료를 얻을 수없는 경우에도 대답에 동의하고 ssh또는 scp.
dotancohen

2
OSX 용 Homebrew에도 다음이 있습니다 : bash-completion and zsh-completions
Adam Nelson

7

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

Host *
    HashKnownHosts no

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


감사합니다. 실제로이 지시문을 이미에 추가하고의 지시문을 ~/.ssh/config변경 /etc/ssh/ssh_config했으며 ~/.ssh/known_hosts파일을 제거했습니다 . 서버에 다시 로그인 한 후에도 호스트 이름은 여전히 ​​해시로 저장됩니다.
dotancohen

내 답변을 편집했습니다. 호스트를 지정하고 해시 지시문을 내부에 중첩시켜야합니다. 나는 .ssh/config이 줄을 이미 가지고있는 많은 파일들을 나열하지 않았다 . 그것이 작동하는지 알려주세요.
M1ke

이것은 확실히 쉬운 방법입니다! 우분투 (최신 버전)에 이제 ssh 완성 기능이 활성화되어 있다면 아마도 이것이 원하는 것일 것입니다.
John Montgomery

아래에 추가 했듯이이 작업을 수행 할 수는 있지만 아마도해서는 안됩니다. 어쨌든 완료 작업을하기 위해 필요하지는 않습니다. 그러나 동의하지 않고 위의 호스트를 추가 한 후 기존 호스트의 해시를 원치 않으면 rm ~ / .ssh / known_hosts 만 있으면 언제든지 다시 생성 (해시되지 않음) 할 수 있습니다 새 서버에 로그인합니다.
Jamieson Becker

3

데비안과 우분투에서 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"

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


2

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

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

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

HOST server-name 
    GSSAPIAuthentication=no

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


노아 감사합니다. 그 항목은 무엇입니까? 14.04 및 14.10 시스템에서 자동 완성 기능이 작동하지 않습니다.
dotancohen

출품작이 중요하지 않다고 생각합니다. 출품작에 포함되어 있다고 확신하지만 출품작을 답변에 추가하겠습니다.
노아
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.