와일드카드 호스트를 가져오지 않고 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