I messaggi
Hanno tutti la stessa causa. Ogni programma la segnala a modo suo:
| Programma | Output |
|---|---|
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 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.