본문 바로가기
카테고리 없음

bash_completion 을 이용한 ssh 호스트 자동 완성

by DogBull 2018. 6. 5.

현재 30 개 이상의 SSH 원격 호스트가 ~/.ssh/config 파일에 등록되어 있다.(거의 모두가 포트 포워딩. -_-;)
몇 개를 더 추가해야할 상황이 발생했는데, 더 이상은 하나의 파일로 관리하기 힘들것 것 같아서 ~/.ssh/config 파일을 분리하기로 했다. 


~/.ssh/config 파일의 내용은 아래와 같이 수정했다.

IdentityFile ~/.ssh/pjh

Include ./config.d/*.config

기존의 ~/.ssh/config 의 내용들은 모두 ~/.ssh/config.d/*.config 의 각 파일로 분리하였다.


예를 들어 ~/.ssh/config.d/home.config 라는 파일이 아래와 같이 작성되어 있다.

Host home.rpi1
	HostName home.jrr.kr
	Port 30001
	User rpi

Host home.gtx710
	HostName home.jrr.kr
	Port 30002
	User pjh

Host home.gtx1080
	HostName home.jrr.kr
	Port 30003
	User pjh


이렇게 30 개 이상의 SSH 원격 호스트들을 5 개 정도의 파일로 구분하였다. 그런데 CLI 에서 ssh 를 입력하고 SSH 원격 호스트명을 입력해야 하는데, 이름이 생각나지 않는 상황이 발생했다. ssh 만 입력해 놓고 멍하니 있는 상황. SSH 원격 호스트 목록을 가져올 수 있는 기능이 필요하다. 


아래의 명령은 ~/.ssh/config 파일과 ~/.ssh/config/*.config 파일들을 읽고 Host로 시작하는 라인을 선택하고 불필요한 정보를 제거한 후 호스트 이름만 추출한다.

grep '^Host' ~/.ssh/config ~/.ssh/config.d/*.config 2>/dev/null | grep -v '[?*]' | cut -d ' ' -f 2-

이것을 alias로 등록해 놓고 사용하면 되겠다.



하지만 추가적으로 bash_completion 을 이용하여 SSH 원격 호스트를 자동 완성 할 수 있으면 더 편리하므로, bash_completion 스크립트를 작성하기로 했다.

bash_completion 이 설치된 상황에서, 사용자의 $HOME에 .bash_completion 파일이 있으면 로그인시 로드하게 되어있다.


아래는 ~/.bash_completion 의 내용이다.
작성 후 다시 로그인 하거나, source ~/.bash_completion 명령을 통해 수동으로 로그인 해 주면 되겠다.

_ssh()
{
    local cur prev opts
    COMPREPLY=()

    cur="${COMP_WORDS[COMP_CWORD]}"
    prev="${COMP_WORDS[COMP_CWORD-1]}"
    hosts=$(grep '^Host' ~/.ssh/config ~/.ssh/config.d/*.config 2>/dev/null | grep -v '[?*]' | cut -d ' ' -f 2-)

    COMPREPLY=( $(compgen -W "$hosts" -- ${cur}) )
    return 0
}

complete -F _ssh ssh

~/.ssh/config 파일 또는 ~/.ssh/config.d/*.config 파일들에 대해 grep 를 이용하여 Host 부분만 떼어내는 부분이 주요 부분이고, 나머지는 모두 bash_completion을 작성하는 관용적인 구문들이다.


명령 프롬프트에서 ssh 를 입력하고 탭을 두 번 눌렀을 때 아래와 같이 SSH 워격 호스트 들의 이름이 나타나게 되며 머릿글자를 입력하고 더블탭을 하면 자동완성이 수행된다.