Los mensajes
Todos tienen la misma causa. Cada programa la comunica a su manera:
| Programa | Salida |
|---|---|
nano, htop | Error opening terminal: xterm-256color. |
clear | 'xterm-256color': unknown terminal type. |
tput | tput: unknown terminal "xterm-256color" |
tmux | missing or unsuitable terminal: xterm-256color |
less | WARNING: terminal is not fully functional |
Un mensaje distinto, TERM environment variable not set., significa que la sesión no tiene ningún terminal, por ejemplo un comando ejecutado con ssh server clear. En ese caso añade -t. Mira -t y -T.
Confirma la causa
En el servidor, después de entrar:
echo "$TERM"
infocmp "$TERM" > /dev/null; echo $?
Un fallo se ve así:
infocmp: error: no match in terminfo database for terminal type "xterm-256color"
Los terminales más nuevos suelen traer un nombre de TERM propio, y muchos servidores no lo tienen. Que falte xterm-256color es menos frecuente y apunta a una imagen mínima o a un contenedor donde se dejaron fuera los archivos de terminfo.
Solución 1: copiar la entrada al servidor
Ejecuta esto en tu propia máquina, en el terminal que tiene el problema. No hace falta root:
infocmp -x | ssh user@server -- tic -x -
infocmp -x imprime la entrada de tu TERM actual, y tic la compila en el servidor dentro de ~/.terminfo. Conservas todas las funciones de tu terminal y la solución sobrevive a los accesos futuros. Los avisos de tic suelen ser inofensivos, así que pruébalo después de un acceso nuevo:
clear
tput cols
Solo se aplica a ese usuario. Para que funcione para todos, incluido root bajo sudo, instálala desde un archivo como root, lo que escribe en una carpeta del sistema:
infocmp -x > term.ti
scp term.ti user@server:
ssh -t user@server 'sudo tic -x term.ti'
Si tic responde en el servidor con errores Illegal character, el infocmp de tu Mac es demasiado antiguo. Pasa antes de macOS Sonoma: usa el del paquete ncurses de Homebrew.
Solución 2: enviar un nombre común
Úsala cuando no puedas escribir nada en el servidor, como en una cuenta compartida o un dispositivo. Para una conexión:
ssh -o SetEnv=TERM=xterm-256color user@server
O de forma permanente para ese host, en ~/.ssh/config:
Host legacy
HostName 203.0.113.10
SetEnv TERM=xterm-256color
Hay más opciones por host en estos ejemplos de archivo ssh config.
El servidor no necesita ninguna línea AcceptEnv para esto, ya que TERM es la excepción a esa regla. Necesita OpenSSH 8.7 o posterior en tu cliente. En clientes más antiguos, defínelo para el comando:
TERM=xterm-256color ssh user@server
Tu sesión se ejecuta entonces como un xterm normal. Casi todo funciona, pero las funciones propias de tu terminal, como los subrayados con estilo, no.
Si ya has entrado, esto funciona para el shell actual:
export TERM=xterm-256color
Solución 3: instalar el paquete
Las distribuciones incluyen entradas adicionales en un paquete aparte. En Debian y Ubuntu:
sudo apt install ncurses-term
En Debian 13 esto añadió muchas entradas, pero no las de algunos terminales nuevos, que vienen en paquetes propios. En Alpine, busca ncurses-terminfo. Para un terminal que el paquete no cubre, usa la solución 1.
Evita esconder el problema en la configuración de tu shell
Definir TERM sin condiciones en ~/.bashrc estropea los valores correctos en todos los accesos futuros, incluso dentro de tmux. Si tienes que definirlo ahí, hazlo solo cuando el valor actual sea desconocido:
infocmp "$TERM" >/dev/null 2>&1 || export TERM=xterm-256color
Preguntas
¿Qué valor de TERM funciona en la mayoría de servidores?
xterm-256color está en casi todos los servidores Linux actuales. En sistemas muy antiguos o mínimos, xterm o vt100 son más seguros.
¿Hace falta root para arreglar unknown terminal type?
No. infocmp -x | ssh user@server -- tic -x - instala la entrada en ~/.terminfo para tu usuario. Root solo hace falta para instalarla para todos los usuarios.
¿Por qué tmux dice missing or unsuitable terminal?
El servidor no tiene una entrada terminfo para tu TERM. Valen las mismas soluciones: copiar la entrada o conectarte con un nombre común como xterm-256color.