개발

터미널 시작 화면에 ASCII 배너 띄우기: bash·zsh·PowerShell·서버 접속 화면

따옴표로 감싼 heredoc이나 파일로 넣으면 역슬래시가 사라지지 않아요. scp가 깨지지 않게 대화형 셸에서만 출력하세요.

마지막 수정:

터미널을 열 때마다 이름이나 서버 이름이 배너로 나오면 기분도 좋고, 지금 어느 컴퓨터에 접속해 있는지도 한눈에 알 수 있어요. 이 글에서는 lab.ascii에서 만든 배너를 셸 설정 파일에 넣는 방법을 정리했어요.

예시에는 Small 글꼴로 만든 “DEV”를 썼어요. 역슬래시(\)가 들어 있어서 잘못 넣으면 모양이 깨지는 걸 바로 확인할 수 있어요.

 ___  _____   __
|   \| __\ \ / /
| |) | _| \ V /
|___/|___| \_/

먼저 알아 둘 두 가지

역슬래시가 사라지지 않게 넣기

셸에서 echo "..." 로 배너를 출력하면 \ 나 $ 가 특수 문자로 처리돼서 글자가 사라지거나 바뀔 수 있어요. 두 가지 방법 중 하나를 쓰세요.

  • 따옴표로 감싼 heredoc: cat <<'EOF' 처럼 끝 표시를 작은따옴표로 감싸면 그 안의 문자를 하나도 바꾸지 않고 그대로 출력해요.
  • 파일로 저장하기: 결과 상자의 TXT 버튼으로 저장한 파일을 cat 으로 출력하면 문자를 신경 쓸 필요가 없어요.

대화형 셸에서만 출력하기

scp, rsync, sftp 는 원격 서버에서 셸을 실행하면서 설정 파일을 읽기도 해요. 이때 배너가 출력되면 파일 전송이 실패할 수 있어요. 사람이 직접 연 대화형 셸일 때만 배너를 출력하도록 조건을 붙이세요.

bash: ~/.bashrc

~/.bashrc 맨 아래에 다음을 넣으세요.

if [[ $- == *i* ]]; then
cat <<'EOF'
 ___  _____   __
|   \| __\ \ / /
| |) | _| \ V /
|___/|___| \_/
EOF
fi
  • $- 에 i 가 들어 있으면 대화형 셸이에요.
  • 끝 표시 EOF 는 줄 맨 앞에 써야 해요. 앞에 공백이 있으면 끝으로 인식하지 못해요.

TXT로 저장한 파일을 ~/.banner.txt 로 옮겨 두었다면 한 줄이면 돼요.

[[ $- == *i* && -r ~/.banner.txt ]] && cat ~/.banner.txt

macOS의 기본 셸은 zsh예요. 맥이라면 아래 zsh 방법을 쓰세요.

zsh: ~/.zshrc

~/.zshrc 는 대화형 셸에서만 읽어서 따로 조건을 붙이지 않아도 돼요. bash와 같은 heredoc을 그대로 쓸 수 있어요.

cat <<'EOF'
 ___  _____   __
|   \| __\ \ / /
| |) | _| \ V /
|___/|___| \_/
EOF

Powerlevel10k의 instant prompt를 쓰고 있다면 시작할 때 출력이 있다는 경고가 나올 수 있어요. 그럴 때는 배너 코드를 ~/.zshrc 맨 위의 instant prompt 블록보다 위로 옮기세요.

fish: fish_greeting

fish는 시작할 때 fish_greeting 함수를 실행해서 인사말을 보여 줘요. 이 함수를 바꾸면 기본 인사말 대신 배너가 나와요. ~/.config/fish/config.fish 에 넣으세요.

function fish_greeting
    cat ~/.banner.txt
end

fish의 작은따옴표 문자열은 \\ 를 \ 하나로 바꾸기 때문에, 배너를 문자열로 넣는 것보다 파일로 저장해 cat 으로 출력하는 편이 안전해요.

색 넣기

배너 앞뒤에 ANSI 색 코드를 출력하면 색이 들어가요. bash·zsh에서는 이렇게 써요.

printf '\033[36m'   # 청록색
cat ~/.banner.txt
printf '\033[0m'    # 원래 색으로
코드 색
\033[31m 빨강
\033[32m 초록
\033[33m 노랑
\033[35m 자주
\033[36m 청록
\033[1m 굵게

마지막에 \033[0m 을 빠뜨리면 그 뒤에 입력하는 글자까지 색이 바뀌어요.

PowerShell: $PROFILE

PowerShell은 시작할 때 $PROFILE 파일을 실행해요. 파일이 없다면 먼저 만들고 메모장으로 여세요.

if (!(Test-Path $PROFILE)) { New-Item -Path $PROFILE -ItemType File -Force }
notepad $PROFILE

열린 파일에 다음을 넣고 저장하세요.

$banner = @'
 ___  _____   __
|   \| __\ \ / /
| |) | _| \ V /
|___/|___| \_/
'@
Write-Host $banner -ForegroundColor Cyan
  • @' 와 '@ 사이의 글자는 하나도 바뀌지 않아요. 닫는 '@ 는 줄 맨 앞에 있어야 해요.
  • 새 창을 열었을 때 “이 시스템에서 스크립트를 실행할 수 없으므로” 오류가 나면, 현재 사용자의 실행 정책을 바꿔야 해요. Set-ExecutionPolicy -Scope CurrentUser RemoteSigned
  • ANSI Shadow처럼 블록 문자를 쓰는 글꼴은 Windows PowerShell 5.1에서 깨질 수 있어요. 메모장에서 UTF-8 (BOM) 으로 저장하거나 PowerShell 7을 쓰세요.

서버 접속 화면: /etc/motd

리눅스 서버에서는 /etc/motd 에 적은 글이 SSH로 접속할 때마다 나와요. 이 서버에 접속하는 모든 사람에게 보여요.

sudo nano /etc/motd

배너를 붙여넣고 저장하면 다음 접속부터 보여요. 서버 이름을 배너로 넣어 두면 운영 서버와 테스트 서버를 헷갈리지 않아요. 접속하는 사람의 터미널을 알 수 없으니 블록 문자보다는 Standard, Slant, Small 같은 ASCII 글꼴을 고르세요. 우분투는 이 밖에도 /etc/update-motd.d/ 의 스크립트가 만든 안내문을 함께 보여 줘요.

내가 만든 CLI 프로그램에 넣기

파이썬이나 Node.js로 만든 도구의 시작 화면에 넣을 때도 같은 원칙이에요. 출력이 파일이나 다른 프로그램으로 넘어갈 때는 배너를 찍지 마세요.

import sys

BANNER = r"""
 ___  _____   __
|   \| __\ \ / /
| |) | _| \ V /
|___/|___| \_/
"""

if sys.stdout.isatty():
    print(BANNER)
const banner = String.raw`
 ___  _____   __
|   \| __\ \ / /
| |) | _| \ V /
|___/|___| \_/
`;

if (process.stdout.isTTY) console.log(banner);

문자열에 넣을 때 주의할 점은 README에 배너 넣기에 더 자세히 정리했어요.

어떤 글꼴이 좋을까요?

터미널은 보통 가로 80칸이에요. 창을 반으로 나눠 쓰는 사람도 많으니 60칸 이하로 만들면 어디서나 한 줄에 들어가요. 긴 이름은 Small이나 Small Slant처럼 폭이 좁은 글꼴을 고르세요. 글꼴별 폭은 FIGlet 글꼴 고르는 법에서 비교할 수 있어요.

figlet 프로그램을 설치하면 figlet -f slant "$(hostname)" 처럼 시작할 때마다 직접 그릴 수도 있어요. 다만 컴퓨터마다 설치해야 하고, ANSI Shadow 같은 글꼴은 따로 받아야 해요. 완성된 배너를 붙여넣으면 아무것도 설치하지 않아도 돼요.