Ubuntu 환경에서 입력이 비정상인 경우

Ubuntu에서 vi 입력, 화살표, Backspace가 이상할 때 vim 패키지, nocompatible, TERM, terminfo, stty/reset, SSH TTY 문제를 순서대로 점검하는 가이드입니다.

Ubuntu에서 vi를 열었을 때 화살표가 A, B, C, D처럼 입력되거나 Backspace가 지워지지 않는 문제는 한 가지 원인으로만 보지 않는 편이 좋습니다. 실제 원인은 vi 호환 모드, 최소 설치 이미지의 vim-tiny, 잘못된 TERM, 깨진 터미널 상태, SSH 환경 변수 전달 문제로 나뉩니다.

현재 상태 확인

먼저 내가 어떤 셸과 터미널 타입에서 작업 중인지 확인합니다.

echo "$SHELL"
echo "$TERM"
command -v vi vim
vi --version 2>/dev/null | head -n 5 || true
stty -a

TERM이 비어 있거나 dumb로 잡혀 있으면 전체 화면 편집기와 색상 출력이 비정상일 수 있습니다. SSH 접속, 콘솔, tmux/screen, 웹 터미널마다 적절한 값이 다를 수 있으므로 무조건 xterm으로 고정하는 것도 답은 아닙니다.

vim 패키지부터 정리

최소 설치 Ubuntu에는 기능이 제한된 vi 계열만 들어 있는 경우가 있습니다. 서버에서 편집 작업을 자주 한다면 정식 vim 패키지를 설치하는 편이 낫습니다.

sudo apt update
sudo apt install -y vim
update-alternatives --display vi
update-alternatives --display editor

필요하다면 기본 편집기를 vim으로 선택합니다.

sudo update-alternatives --config editor

vim 호환 모드 해제

화살표 키가 입력 모드에서 문자처럼 들어가는 문제는 vi 호환 모드에서 자주 보입니다. 사용자 홈의 ~/.vimrc에 최소 설정을 넣습니다.

cat >> ~/.vimrc <<'EOF'
set nocompatible
set backspace=indent,eol,start
set encoding=utf-8
set ruler
syntax on
EOF

set term=xterm을 vim 설정에 고정하는 방식은 권장하지 않습니다. 실제 터미널이 xterm-256color, screen-256color, tmux-256color일 수 있기 때문입니다. 터미널 종류는 셸 환경 변수에서 맞추는 쪽이 더 정확합니다.

TERM 값 점검

일반 SSH 터미널에서는 다음 값 중 하나가 많이 쓰입니다. 현재 터미널에서 색상과 키 입력이 정상인 값을 선택하세요.

export TERM=xterm-256color
# tmux 안이라면 보통 tmux-256color 또는 screen-256color를 사용합니다.
echo 'export TERM=xterm-256color' >> ~/.bashrc

터미널 데이터베이스에 해당 타입이 없으면 infocmp로 바로 확인할 수 있습니다.

infocmp "$TERM" >/dev/null && echo "TERM ok" || echo "TERM entry missing"

특정 장비나 오래된 서버에서 terminfo가 없으면 ncurses-term 패키지를 설치합니다.

sudo apt install -y ncurses-term

터미널이 깨졌을 때 즉시 복구

바이너리 파일을 cat으로 출력했거나 터미널 제어 문자가 꼬이면 입력이 이상해질 수 있습니다. 이 경우 편집기 설정 문제가 아니라 터미널 세션 상태 문제입니다.

stty sane
reset
clear

SSH 세션이 완전히 꼬였다면 새 터미널로 다시 접속하는 것이 더 빠를 때도 있습니다.

SSH 접속 환경에서 확인할 점

SSH 클라이언트가 TERM을 서버에 전달하지 못하거나, 강제로 TTY 없이 명령을 실행하면 vi가 정상 동작하지 않습니다. 원격 명령에서 편집기를 열어야 한다면 -t로 TTY를 강제합니다.

ssh -t user@server.example.com 'vim /etc/hosts'

클라이언트 설정에 SendEnv TERM을 넣는 방법도 있지만, 서버의 sshd_config에서 AcceptEnv를 허용하지 않으면 전달되지 않습니다. 보통 SSH는 터미널 할당 시 TERM을 별도로 전달하므로, 무조건 SSH 환경 변수 전달부터 수정하기보다 현재 접속 방식과 echo "$TERM" 결과를 먼저 보는 것이 낫습니다.

# 클라이언트: ~/.ssh/config
Host *
  RequestTTY auto

# 서버에서 확인
echo "$TERM"

문제가 계속될 때의 판단 순서

정리하면 먼저 vim 설치 여부를 확인하고, ~/.vimrc에서 호환 모드를 끄고, TERM 값과 terminfo를 확인한 뒤, 터미널 상태를 stty sane/reset으로 복구합니다. 그래도 안 되면 tmux/screen, 웹 콘솔, SSH 클라이언트별로 같은 문제가 재현되는지 나눠 보면 원인을 좁히기 쉽습니다.

BGM EVER