« Error opening terminal » et « unknown terminal type » sous SSH : résoudre l'erreur

SSH envoie la valeur de votre TERM local au serveur, et le serveur n'a aucune entrée terminfo de ce nom : des programmes comme nano, htop et clear ne savent donc pas piloter votre terminal. Copiez l'entrée avec infocmp -x | ssh server -- tic -x -. Ou, en solution rapide, connectez-vous avec ssh -o SetEnv=TERM=xterm-256color server. Les deux marchent sans root.

Mis à jour le . Messages et solutions reproduits avec OpenSSH 10.3 sur macOS et un serveur Debian 13 jetable avec OpenSSH 10.0, avec TERM défini sur des noms absents de ce serveur, et avec xterm-256color retiré.

Les messages

Tous ont la même cause. Chaque programme la signale à sa façon :

ProgrammeSortie
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 autre message, TERM environment variable not set., signifie que la session n'a aucun terminal, par exemple pour une commande lancée avec ssh server clear. Ajoutez alors -t. Voir -t et -T.

Confirmer la cause

Sur le serveur, après connexion :

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

Un échec ressemble à ceci :

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

Les terminaux récents apportent souvent leur propre nom TERM, et beaucoup de serveurs ne l'ont pas. L'absence de xterm-256color est plus rare, et indique une image minimale ou un conteneur dont les fichiers terminfo ont été exclus.

Solution 1 : copier l'entrée sur le serveur

Lancez ceci sur votre propre machine, dans le terminal qui pose problème. Pas besoin de root :

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

infocmp -x affiche l'entrée de votre TERM actuel, et tic la compile sur le serveur dans ~/.terminfo. Vous gardez toutes les fonctions de votre terminal, et la solution survit aux connexions suivantes. Les avertissements de tic sont en général sans gravité : testez après une nouvelle connexion :

clear
tput cols

Cela ne s'applique qu'à cet utilisateur. Pour que cela marche pour tout le monde, y compris root sous sudo, installez-la depuis un fichier en root, ce qui écrit dans un dossier système :

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

Si tic répond sur le serveur par des erreurs Illegal character, l'infocmp de votre Mac est trop ancien. C'est le cas avant macOS Sonoma : utilisez celui du paquet ncurses de Homebrew.

Solution 2 : envoyer un nom courant

Utilisez ceci quand vous ne pouvez rien écrire sur le serveur, comme un compte partagé ou un équipement. Pour une connexion :

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

Ou de façon permanente pour cet hôte, dans ~/.ssh/config :

Host legacy
  HostName 203.0.113.10
  SetEnv TERM=xterm-256color

D'autres options par hôte se trouvent dans ces exemples de fichier ssh config.

Le serveur n'a besoin d'aucune ligne AcceptEnv pour cela, car TERM est l'exception à cette règle. Il faut OpenSSH 8.7 ou plus récent sur votre client. Sur les clients plus anciens, définissez-le pour la commande :

TERM=xterm-256color ssh user@server

Votre session tourne alors comme un xterm ordinaire. Presque tout marche, mais pas les fonctions propres à votre terminal, comme les soulignements stylés.

Si vous êtes déjà connecté, ceci fonctionne pour le shell en cours :

export TERM=xterm-256color

Solution 3 : installer le paquet

Les distributions fournissent des entrées supplémentaires dans un paquet séparé. Sur Debian et Ubuntu :

sudo apt install ncurses-term

Dans Debian 13, cela a ajouté beaucoup d'entrées, mais pas celles de certains terminaux récents, qui ont leur propre paquet. Sur Alpine, cherchez ncurses-terminfo. Pour un terminal que le paquet ne couvre pas, utilisez la solution 1.

Évitez de cacher le problème dans la configuration du shell

Définir TERM sans condition dans ~/.bashrc écrase des valeurs correctes à chaque future connexion, y compris dans tmux. Si vous devez le définir là, faites-le seulement quand la valeur actuelle est inconnue :

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

Questions

Quelle valeur de TERM marche sur la plupart des serveurs ?

xterm-256color existe sur presque tous les serveurs Linux actuels. Sur des systèmes très anciens ou minimaux, xterm ou vt100 sont plus sûrs.

Faut-il être root pour corriger unknown terminal type ?

Non. infocmp -x | ssh user@server -- tic -x - installe l'entrée dans ~/.terminfo pour votre utilisateur. Root n'est nécessaire que pour l'installer pour tous.

Pourquoi tmux affiche missing or unsuitable terminal ?

Le serveur n'a pas d'entrée terminfo pour votre TERM. Les mêmes solutions s'appliquent : copier l'entrée, ou se connecter avec un nom courant comme xterm-256color.

Sources

Autres guides : Messages d'erreur

Tous les guides