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


61

나는 몇 서버에 구성되어 ~/.ssh/config같은 alpha과 beta. 어떻게 배쉬는 명령하도록 구성 할 수있는 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.