"Error opening terminal" e "unknown terminal type" via SSH: come risolvere

SSH invia al server il valore locale di TERM, e il server non ha una voce terminfo con quel nome, quindi programmi come nano, htop e clear non sanno come pilotare il tuo terminale. Copia la voce con infocmp -x | ssh server -- tic -x -. Oppure, come rimedio veloce, collegati con ssh -o SetEnv=TERM=xterm-256color server. Entrambi funzionano senza root.

Aggiornata il . Messaggi e soluzioni riprodotti con OpenSSH 10.3 su macOS e un server Debian 13 usa e getta con OpenSSH 10.0, usando valori di TERM con nomi assenti da quel server, e con xterm-256color rimosso.

I messaggi

Hanno tutti la stessa causa. Ogni programma la segnala a modo suo:

ProgrammaOutput
nano, htopError opening terminal: xterm-256color.
clear'xterm-256color': unknown terminal type.
tputtput: unknown terminal "xterm-256color"
tmuxmissing or unsuitable terminal: xterm-256color
lessWARNING: terminal is not fully functional

Un messaggio diverso, TERM environment variable not set., significa che la sessione non ha nessun terminale, per esempio con un comando eseguito come ssh server clear. In quel caso aggiungi -t. Vedi -t e -T.

Conferma la causa

Sul server, dopo il login:

echo "$TERM"
infocmp "$TERM" > /dev/null; echo $?

Un fallimento si presenta così:

infocmp: error: no match in terminfo database for terminal type "xterm-256color"

I terminali più recenti spesso portano un nome TERM proprio, e molti server non lo hanno. Un xterm-256color mancante è più raro e indica un'immagine minimale o un container da cui sono stati esclusi i file terminfo.

Soluzione 1: copia la voce sul server

Eseguilo sulla tua macchina, nel terminale che ha il problema. Non serve root:

infocmp -x | ssh user@server -- tic -x -

infocmp -x stampa la voce per il tuo TERM attuale e tic la compila sul server in ~/.terminfo. Conservi tutte le funzioni del tuo terminale e la soluzione resiste ai login futuri. Gli avvisi di tic di solito sono innocui, quindi prova dopo un nuovo login:

clear
tput cols

Vale solo per quell'utente. Per farla funzionare per tutti, compreso root sotto sudo, installala da un file come root, il che scrive in una cartella di sistema:

infocmp -x > term.ti
scp term.ti user@server:
ssh -t user@server 'sudo tic -x term.ti'

Se tic sul server risponde con errori Illegal character, l'infocmp del tuo Mac è troppo vecchio. Succede prima di macOS Sonoma: usa quello del pacchetto ncurses di Homebrew.

Soluzione 2: invia un nome comune

Usala quando non puoi scrivere nulla sul server, come con un account condiviso o un dispositivo. Per una sola connessione:

ssh -o SetEnv=TERM=xterm-256color user@server

Oppure in modo permanente per quell'host, in ~/.ssh/config:

Host legacy
  HostName 203.0.113.10
  SetEnv TERM=xterm-256color

Altre opzioni per host sono in questi esempi di file ssh config.

Il server non ha bisogno di nessuna riga AcceptEnv per questo, dato che TERM è l'eccezione a quella regola. Serve OpenSSH 8.7 o successivo sul tuo client. Sui client più vecchi, impostalo per il comando:

TERM=xterm-256color ssh user@server

La tua sessione gira allora come un semplice xterm. Quasi tutto funziona, ma le funzioni specifiche del tuo terminale, come le sottolineature con stile, no.

Se hai già fatto il login, questo funziona per la shell corrente:

export TERM=xterm-256color

Soluzione 3: installa il pacchetto

Le distribuzioni forniscono voci aggiuntive in un pacchetto separato. Su Debian e Ubuntu:

sudo apt install ncurses-term

In Debian 13 questo ha aggiunto molte voci, ma non quelle di alcuni terminali recenti, che arrivano in pacchetti a parte. Su Alpine, cerca ncurses-terminfo. Per un terminale che il pacchetto non copre, usa la soluzione 1.

Evita di nascondere il problema nella configurazione della shell

Impostare TERM senza condizioni in ~/.bashrc rovina i valori corretti a ogni login futuro, anche dentro tmux. Se devi proprio impostarlo lì, fallo solo quando il valore attuale è sconosciuto:

infocmp "$TERM" >/dev/null 2>&1 || export TERM=xterm-256color

Domande

Quale valore di TERM funziona sulla maggior parte dei server?

xterm-256color c'è su quasi tutti i server Linux attuali. Su sistemi molto vecchi o minimali, xterm o vt100 sono più sicuri.

Serve root per risolvere unknown terminal type?

No. infocmp -x | ssh user@server -- tic -x - installa la voce in ~/.terminfo per il tuo utente. Root serve solo per installarla per tutti gli utenti.

Perché tmux dice missing or unsuitable terminal?

Il server non ha una voce terminfo per il tuo TERM. Valgono le stesse soluzioni: copia la voce, oppure collegati con un nome comune come xterm-256color.

Fonti

Altro in Messaggi di errore

Tutte le guide