나다음 스크립트를 찾으세요(bash의 경우) 이를 통해 (에서) 연결하는 모든 호스트 이름에 대해 ~/.ssh/known_hosts
탭 완성을 얻을 수 있습니다.
complete -W "$(echo `cat ~/.ssh/known_hosts | cut -f 1 -d ' ' | sed -e s/,.*//g | uniq | grep -v "\["`;)" ssh
그런데 문제는 사용자 이름을 입력한 후 탭 완성이 작동하지 않는다는 것입니다.
이것을 어떻게 개선할 수 있습니까? 입력하면...
ssh myusername@my
그리고 "myhostname.com"이 완료될 것으로 예상합니다. 그렇게 할 수 있습니까?
전체 문자열(user@hostname)에도 태그를 지정할 수 있으면 더 좋겠지만 두 옵션 모두 괜찮습니다. 첫 번째 사용자 이름이 없으면 내 호스트 사용자 이름이 내 로컬 사용자 이름과 일치하지 않는 한 이것은 별로 쓸모가 없습니다.
답변1
기본적으로 알려진_hosts 파일에는 일반적으로 bash_completion이 확인할 수 없는 해시 항목이 포함되어 있습니다.
ssh_config(/etc/ssh/ssh_config)를 편집하여 다음을 설정할 수 있습니다.
HashKnownHosts no
그런 다음 현재 알려진 호스트 파일을 지워야 할 수도 있습니다.
> ~/.ssh/known_hosts
답변2
$COMP_WORDBREAKS
"@"(내 시스템의 기본값)을 포함하면 해결할 수 없는 심각한 문제가 발생합니다( 누르면 "@" Tab하나가 제거됩니다).Enter
그러나 해당 환경 변수에서 제거하면 다음과 같이 작동합니다.
_foo () {
if [[ "$COMP_WORDBREAKS" =~ "@" ]]; then
echo ""
echo '$COMP_WORDBREAKS contains "@"; aborting'
COMPREPLY=()
else
at_in=no
if [[ ${COMP_WORDS[COMP_CWORD]} =~ "@" ]]; then
var="${COMP_WORDS[COMP_CWORD]}"
tail="${var#*@}"
prefix="${var%"$tail"}"
else
prefix=""
fi
COMPREPLY=($(cut -f 1 -d ' ' <~/.ssh/known_hosts |
sed -e 's/,/\n/g' | uniq |
awk -v prefix="${prefix}" '/\[/ {next}; {print prefix $0;}'))
COMPREPLY=($(compgen -W "${COMPREPLY[*]}" "${COMP_WORDS[COMP_CWORD]}"))
fi
}
complete -F _foo ssh