~ / .ssh / config에 정의 된 호스트에 대한 탭 완성이 더 이상 Yosemite에서 작동하지 않습니다


38

~/.ssh/config서버 연결에서 작업 수명을 단축하기 위해 파일 을 만들려고 합니다.

매버릭스에서 모든 것이 올바르게 작동했으며 다음과 tab같이 파일로 호스트 이름을 자동 완성 할 수있었습니다.

Host test-host-name
    HostName 192.168.1.2
    User root

Yosemite의 동일한 구성은 다른 동작을 갖습니다. 내가 입력하면 ssh t쉘에서 tab호스트 이름을 자동 완성하지 않습니다.

요세미티에서 어떤 것이 바뀌 었는지 아는 사람이 있습니까? 이제 작동하려면 무언가를해야합니까?

답변:


37

brewbash-completion통해 설치하여 bash 쉘 완성을 활성화 할 수 있습니다 .

brew install bash-completion

그런 다음에 다음을 추가하십시오 ~/.bash_profile.

if [ -f $(brew --prefix)/etc/bash_completion ]; then
. $(brew --prefix)/etc/bash_completion
fi

출처

(편집 : brew tap homebrew/completions2018 년부터 사용되지 않습니다 . )


+1 :) bash-completion-1.3.3.high_sierra를 설치할 때 추가해야한다고 알려줍니다 [ -f /usr/local/etc/bash_completion ] && . /usr/local/etc/bash_completion. 어떤 버전 (또는 그 버전)을 선호해야하며 그 이유를 자세히 설명해 주시겠습니까?
Jan Nash

15

나는 당신의 Mac 쉘이 bash라고 가정합니다.

자세한 내용을 보려면 ssh 명령을 완료해야합니다. man complete

_complete_ssh_hosts ()
{
        COMPREPLY=()
        cur="${COMP_WORDS[COMP_CWORD]}"
        comp_ssh_hosts=`cat ~/.ssh/known_hosts | \
                        cut -f 1 -d ' ' | \
                        sed -e s/,.*//g | \
                        grep -v ^# | \
                        uniq | \
                        grep -v "\[" ;
                cat ~/.ssh/config | \
                        grep "^Host " | \
                        awk '{print $2}'
                `
        COMPREPLY=( $(compgen -W "${comp_ssh_hosts}" -- $cur))
        return 0
}
complete -F _complete_ssh_hosts ssh

source터미널에 새 명령을로드하려면 파일 이 필요하다는 것을 잊지 마십시오 . 또는이 코드를 .bash_profile에 넣을 수 있습니다


네, 껍질은 bash입니다. Maveriks에서 왜이 일을 할 필요가 없었습니까?
RikyTres

아니요, 지금 막 테스트했습니다. 매버릭스에서는 기본적으로 그렇게 할 수 없습니다.
nelson

comp_ssh_hosts=$(awk -F , 'FNR== NR && ! /^#|\[/ {field = $1} FNR != NR && /^Host / {field = $2} {hosts[field]} END {for (host in hosts) {print host}' "$HOME/.ssh/known hosts" "$HOME/.ssh/config")
추후 공지가있을 때까지 일시 중지되었습니다.

2

에서 맥 월드에이 문서 .

다음을 복사하여 붙여 넣습니다 ~/.bash_profile.

complete -o default -o nospace -W "$(/usr/bin/env ruby -ne 'puts $_.split(/[,\s]+/)[1..-1].reject{|host| host.match(/\*|\?/)} if $_.match(/^\s*Host\s+/);' < $HOME/.ssh/config)" scp sftp ssh

그런 다음 터미널을 다시 시작하거나 입력 source ~/.bash_profile해야합니다 (후자는 현재 탭에서만 작동 함).


나를 위해 일하지 않았다. 그러나 apple.stackexchange.com/a/168168/136365 는 그랬습니다. 이런 식으로 루비에 의존하지 않는 것이 가장 좋습니다.
벤 Creasy

0

참고로, 넬슨의 답변에 직접 응답하는 방법을 아직 잘 모르겠습니다. 아직 의견을 말할만큼 충분한 평판을 얻지 못했지만 El Capitan을 실행하는 내 컴퓨터 ^M에서 구성 파일의 모든 호스트 이름에 추가되었습니다 . 나도 추가로 가지고 \r내에 $IFS변수 또는 제거 /의 모든 인스턴스를 대체 \r번째의 출력에서 cat. 결국, 나는 tr '\r' '\n'명령 체인을 다음과 같이 만들기 위해 후자를 추가 했습니다.

cat ~/.ssh/config | \
        grep "^Host " | \
        awk '{print $2}' | \
        tr '\r' '\n'

-1

/ etc / hosts에 항목을 추가하고 호스트 이름 자동 완성에 사용할 수 있습니다.

"ssh @" + [TAB]

시스템이이 파일을 다시로드하려면 재부팅이 필요합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.