SSH 구성 호스트 자동 완성 명령이 자동 완성되지 않습니다.

SSH 구성 호스트 자동 완성 명령이 자동 완성되지 않습니다.

와일드카드 호스트를 가져오지 않고 SSH 구성에서 호스트를 가져오는 함수를 작성했습니다.

sshConfAutoComplete() { 
   cat ~/.ssh/config | \
   grep 'host '      | \
   sed '
     s#.*\*##g; 
     s#host ##g
   '
}

산출:

pi
lynx
iridium
batchelorantor
rasp

출력이 정확했기 때문에 이 기능을 다음에 추가했습니다. /usr/local/etc/bash_completion.d/ssh

이와 같이:

sshConfAutoComplete() { 
   cat ~/.ssh/config | \
   grep 'host '      | \
   sed '
     s#.*\*##g; 
     s#host ##g
   '
}
complete -F sshConfAutoComplete ssh

그런 다음 다음 소스를 추가했습니다 . /usr/local/etc/bash_completion.d/ssh.~/.bash_profile

~/bash_profile다음 을 입력하면 Sourced ssh <tab>가 나타납니다 .

pi
lynx
iridium
batchelorantor
rasp

입력하면 ssh ly <tab>자동 완성되지 않고 lynx위의 내용만 출력됩니다.

어떻게 해결할 수 있나요?

답변1

man bash제목 에프로그래밍 가능한 완성호출된 함수가 -F배열 변수에 일치하는 결과를 제공해야 하는 방법을 설명했습니다 COMPREPLY. 일반적으로 명령이 제공하는 전체 목록은 sed 명령에 전달되어 해당 단어를 대상 단어(예: 함수의 인수 2())와 일치시키려고 compgen -W시도합니다 . $2약간 단순화하면 다음과 같은 결과를 얻습니다.

sshConfAutoComplete() { 
   COMPREPLY=( $(compgen -W \
    "$(sed -n ' /host /{s#.*\*##g; s#host ##g; p} ' ~/.ssh/config)" -- "$2"))
}
complete -F sshConfAutoComplete ssh

MacOS의 경우 표준 sed명령이 허용되지 않으므로 ;각 명령은 줄바꿈이어야 합니다.

   COMPREPLY=( $(compgen -W \
    "$(sed -n '/^host /{
     s#.*\*##g
     s#host ##g
     p
    }' ~/.ssh/config)" -- "$2"))

답변2

나는 이것을했고 이것을 내 것에 추가했습니다 ~/bash_profile:

IFS=$'\n'

getSshConfHosts() {                                                                                                                                              
  grep    '^host' ~/.ssh/config  | \                                                                                                                                  
  grep -v '[?*]'                 | \                                                                                                                                      
  cut -d ' ' -f 2-                                                                                                                                       
}

sshConfAutoComplete() {                                                                                                                                          
    local cur prev opts                                                                                                                                                                
    cur=${COMP_WORDS[COMP_CWORD]}                                                                                                                                                                  
    prev=${COMP_WORDS[COMP_CWORD-1]}                                                                                                                                  
    opts=$(getSshConfHosts)                                                                                                                                                       
    COMPREPLY=( $(compgen -W "$opts" -- $cur ) )                                                                                                     
}         
complete -F sshConfAutoComplete ssh

이전 sed 명령을 삭제하면 빈 줄이 남았습니다.host *

고쳐 쓰다

이 답변은 효과가 있었지만 그는 내가 Mac에 있다는 것을 몰랐고 먼저 작성하지 않았기 때문에 허용된 답변에 이를 제공했습니다. 그의 버전은 이해하기 더 쉽습니다.

나는 다른 함수에서 정규식 부분을 사용하고 있으므로 내 함수에서는 다음과 같습니다 bash_profile.

IFS=$'\n'

getSshConfHosts() {
   sed -n '/^host /{
     s#.*\*##g
     s#host ##g; p
   }' ~/.ssh/config
}

sshConfAutoComplete() {
    local wordList
    wordList=$(getSshConfHosts)
    COMPREPLY=( $(compgen -W "$wordList" -- $2 ) )
}
complete -F sshConfAutoComplete ssh

관련 정보