SSH 및 SCP에 대한 자동 완성 서버 이름

SSH 및 SCP에 대한 자동 완성 서버 이름

일부 서버를 구성했습니다.~/.ssh/config, 와 alpha같은 beta. 구성된 서버의 이름을 명령하고 자동 완성하도록 Bash를 어떻게 구성합니까?$ ssh alTab$ scp file.tgz alTab

서버를 추가하고 싶지 않습니다.다른서버를 정기적으로 추가 및 제거하고 목록이 상당히 크기 때문에 한 번에 하나의 파일(예: Bash 배열)이 추가됩니다.

이것은 Kubuntu 12.10에 있으며 나는 가지고 있습니다배쉬 완료설치하다.

답변1

그것을 발견! !

우분투 아래에있는 것 같습니다의 항목이 ~/.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

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

답변2

미리 포장된

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

답변3

Ubuntu가 알려진 호스트를 해시하기 때문에 자동 완성이 작동하지 않는 것을 발견했습니다. 당신은 추가할 수 있습니다

Host *
    HashKnownHosts no

파일 에 저장 .ssh/config되지만 기존 호스트는 해시되지 않습니다.

답변4

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

제가 정기적으로 방문하는 서버 중 하나만 자동으로 수행하고 있다는 것을 깨달았을 때 이 사실을 깨달았습니다. 둘 사이의 유일한 차이점은 SSH 구성 파일의 인증 관련 항목입니다. 또한 다른 서버의 구성 파일에 새 항목을 추가하면 자동으로 완료되기 시작했습니다.

질문하신 분들을 위한 항목은 다음과 같습니다.

HOST server-name 
    GSSAPIAuthentication=no

구성에 지정한 내용이 중요하다면(물론 여전히 유효한 한) 매우 놀랄 것입니다.

관련 정보