[unix] SSH 및 SCP의 자동 완성 서버 이름
나는 몇 서버에 구성되어 ~/.ssh/config
같은 alpha
과 beta
. 어떻게 배쉬는 명령하도록 구성 할 수있는 ssh al<tab>
과가 scp file.tgz al<tab>
구성된 서버의 이름을 자동으로 완성?
서버를 정기적으로 추가 및 제거하고 목록이 매우 커서 서버를 추가 할 때마다 서버를 다른 파일 (예 : Bash 배열) 에 추가하고 싶지 않습니다 .
답변
그것을 발견!!
우분투 에서는의 항목 ~/.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
나는 이 안내서가 매우 귀중 하다는 것을 알았 습니다. 훌륭한 가이드를 작성해 주신 Steve Kemp 에게 감사합니다 !
답변
사전 포장
어떤 배포판을 사용하고 있지는 않지만 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
이미 사전 패키지 된 완료 규칙 파일을 찾을 수없는 경우 파일을 사용하여 유사한 작업을 수행 할 수 있습니다.
답변
우분투가 알려진 호스트를 해시하기 때문에 자동 완성 기능이 작동하지 않는 것으로 나타났습니다. 추가 할 수 있습니다
Host *
HashKnownHosts no
당신에 .ssh/config
파일하지만 기존의 호스트는 않은 해시되지 않습니다.
답변
데비안과 우분투에서 ssh 자동 완성 기능을 활성화하려면 :
sudo apt-get install bash-completion
이것은 위에서 언급 한 것과 원래의 질문과는 달리 known_hosts 해싱과 전혀 관련 이 없습니다 . known_hosts에서 자동 완성을 원한다면 물론 해싱을 비활성화해야하지만 강력하게 권장 하지는 않습니다.
예를 들어, 나는 :
Host *
HashKnownHosts yes
내 .ssh / config에서 .ssh / config 및 / etc / hosts에 나열된 호스트에 대해 여전히 ssh 자동 완성 기능이 제대로 작동합니다. OP가 명시된대로 호스트를 .ssh / config에 추가해야합니다.
호스트 my-awesome-host 호스트 이름 the.real.host.name
또는 데비안 / 우분투 스크립트의 또 다른 소스 인 / etc / hosts에 호스트 항목을 추가 할 수 있습니다.
그런 다음 입력 만하면 ssh my-awe<tab>
자동으로 완료됩니다. 다시 말하지만 HashKnownHosts 인 경우에도 마찬가지입니다. (bash bash에서 bash 완료를 활성화해야하며 배포를 위해 위와 같이 해당 스크립트를 설치해야합니다.)
그런 다음이 줄을 추가 .bashrc
하여 활성화합니다 (로그 아웃 한 후 다시 로그인해야하거나 bash
새로운 셸을 시작하기 위해 새로 입력 한 것만 필요합니다 (이미 활성화되어 /etc/bash.bashrc
있고 /etc/profile
소스 인 경우 활성화 할 필요가 없습니다 /etc/bash.bashrc
).
if [ -f /etc/bash_completion ]; then
. /etc/bash_completion
fi
이것은 (무엇보다도!) SSH 자동 완성을 가능하게 할 것이다부터 ~/.ssh/config
, /etc/hosts
등
데비안은 bash 대신 ash로 기본 설정되어 있습니다. bash로 쉽게 전환 할 수 있습니다 :
sudo usermod -s /bin/bash "$USER"
(이 기능을 적용하려면 로그 아웃했다가 다시 로그인해야합니다.)
답변
Ubuntu 14.04에서는 ssh
서버에 언급 된 서버를 자동 완성합니다.~/.ssh/config
내가 일반적으로 액세스하는 서버 중 하나만 자동 완성되는 것을 알았을 때 나는 그것을 알았습니다. 이 둘의 유일한 차이점은 인증과 관련된 ssh 구성 파일의 항목이었습니다. 다른 서버의 구성 파일에 새 항목을 추가하면 자동 완성도 시작되었습니다.
요청한 사람들을위한 항목은 다음과 같습니다.
HOST server-name
GSSAPIAuthentication=no
설정에서 지정한 내용이 중요하다면 (물론 여전히 유효한 한) 매우 놀랐습니다.