iTerm2 badge SSH 활용

Engineering

배경

업무 중 터미널을 통해 SSH로 여러 서버에 접속하는 일이 많았습니다. 특히 운영 서버처럼 실수를 조심해야하는 환경에서는 현재 접속 대상을 명확하게 구분할 필요가 있었습니다.

간단하면서도 유용했고 개인적으로 만족도가 높아 그 방법을 소개해보려 합니다.

동작 원리

flowchart LR
    step1["ssh 명령어 입력"]

    subgraph ssh_wrapper["SSH Wrapper"]
        step2["iTerm2 Badge escape sequence 출력"]
        step3["실제 ssh 실행"]
    end

    step4["원격 서버 접속"]

    step1 --> ssh_wrapper
    step2 --> step3
    ssh_wrapper --> step4

원리는 심플합니다.

ssh 명령어를 실행하면 우리가 만들 SSH Wrapper가 먼저 실행됩니다.

Wrapper는 iTerm2가 인식할 수 있는 escape sequence 를 출력하여 Badge에 표시할 값을 설정한 뒤, 실제 ssh 명령어를 실행하여 원격 서버에 접속합니다.

설정 방법

Step 1. iTerm2 Badge 설정

iterm2 badge variables setting

먼저 iTerm2의 Badge에 사용자 정의 변수를 참조하도록 설정합니다.

\(user.current_ssh_host)

여기서 user. 는 iTerm2의 사용자 정의 변수(User-Defined Variables)에 접근하기 위한 namespace입니다.

current_ssh_host 이 변수는 이후에 만들 ssh wrapper 안에서 사용할 변수명입니다.

사용자 변수에 대한 자세한 내용은 iterm2 documentation-variables 를 참고해주세요.

Step 2. SSH Wrapper 만들기

이제 스크립트를 만들겁니다.

저는 📁 ~/.local/bin 경로에 ssh 라는 이름으로 만들었습니다.

#!/bin/bash

iterm2_set_user_var () {
  PARENT_COMMAND=$(ps -o comm= $PPID)
  # Avoid to do send the command when ssh is not run by the shell
  if [ "$PARENT_COMMAND" = "bash" ] || [ "$PARENT_COMMAND" = "-zsh" ]; then
    printf "\033]1337;SetUserVar=%s=%s\007" "$1" $(printf "%s" "$2" | base64 | tr -d '\n')
  fi
}

on_exit () {
  iterm2_set_user_var current_ssh_host ""
}
trap on_exit EXIT

HOSTNAME=`echo $@ | sed s/.*@//`

iterm2_set_user_var current_ssh_host "$HOSTNAME"

/usr/bin/ssh "$@"

작성후 실행권한을 부여합니다.

chmod +x ~/.local/bin/ssh

Step 3. PATH 등록

이제 터미널에서 우리가 만든 Wrapper가 기존 ssh보다 먼저 실행되도록 PATH를 설정해야 합니다.

.zshrc 에 다음 내용을 추가합니다.

export PATH="$HOME/.local/bin:$PATH"

설정 후 현재 셸에 적용합니다.

source ~/.zshrc
which ssh

which ssh 로 우리가 설정한 경로의 ssh 가 호출되는지 확인 하시면 됩니다.

모든 설정이 끝났습니다.

Step 4. 테스트 해보기

SSH Wrapper 테스트

이제 ssh 서버에 접속해봅시다.

ssh -p 2220 bandit0@bandit.labs.overthewire.org

우측 상단에 ssh 시 입력한 host 가 표출되면 성공입니다!

그리고 ssh 종료시 badge 가 초기화 되어야합니다.

마치며

이 글은 Talis Engineering 의 글과 danydev Github Gist 를 참고하여 작성했습니다.

좋은 아이디어와 코드를 공유해주신 덕분에 저도 업무 중 불편했던 작은 문제를 해결할 수 있었습니다.

유용한 내용을 공유해주신 두 분들께 감사인사를 드립니다.