iTerm2 badge SSH 활용
배경
업무 중 터미널을 통해 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에 사용자 정의 변수를 참조하도록 설정합니다.
\(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 서버에 접속해봅시다.
ssh -p 2220 bandit0@bandit.labs.overthewire.org
우측 상단에 ssh 시 입력한 host 가 표출되면 성공입니다!
그리고 ssh 종료시 badge 가 초기화 되어야합니다.
마치며
이 글은 Talis Engineering 의 글과 danydev Github Gist 를 참고하여 작성했습니다.
좋은 아이디어와 코드를 공유해주신 덕분에 저도 업무 중 불편했던 작은 문제를 해결할 수 있었습니다.
유용한 내용을 공유해주신 두 분들께 감사인사를 드립니다.