SSD Nodes Learn 🎉 VPS $5.50/aydan başlayan
Rehberler Matt ConnorYazan Matt Connor

SSH Unknown Terminal Type Hatası Nasıl Çözülür?

SSH bağlantılarında karşılaşılan unknown terminal type hatasını root yetkisi olmadan gidermek için kendi terminfo girdinizi ev dizininize nasıl derleyeceğinizi öğrenin.

"Unknown terminal type" hatası ne anlama gelir

SSH üzerinden alınan bir "unknown terminal type" hatası, TERM içindeki ismin sunucudaki terminfo veritabanında eşleşen bir kaydının bulunmadığı anlamına gelir. Terminal emülatörünüz bu ismi dizüstü bilgisayarınızda ayarlar. Ancak bu ismi tanıması gereken veritabanı uzak makinede bulunur. Arama başarısız olduğunda, sunucudaki tüm curses tabanlı programlar, terminalinizin neler yapabileceğine dair bir tanımlama bulamadıkları için herhangi bir çizim yapmadan durur.

Emülatörünüzün tüm özelliklerini koruyan çözüm tek bir komuttur: kendi terminfo girdinizi sunucudaki ~/.terminfo içine derleyin. ncurses, sistem dizinlerinden önce ev dizininizi tarar; bu nedenle işlem root yetkisi gerektirmez ve diğer kullanıcılar için hiçbir şeyi değiştirmez.

TERM bir isimdir, terminfo ise veritabanıdır

TERM tek bir dizge tutar ve bu dizge yalnızca bir anahtardır. terminfo, terminal tanımlarından oluşan derlenmiş bir veritabanıdır; anahtar ise bir programın doğru tanımı nasıl bulacağını belirler. Bir tanım; terminalin kaç renk desteklediğini, imleci 12. satır 40. sütuna taşımak için hangi baytların gönderilmesi gerektiğini, F5 tuşunun hangi baytları ilettiğini ve stilize alt çizgi çizip çizemeyeceğini kaydeder. Linux üzerindeki neredeyse tüm metin tabanlı kullanıcı arayüzlerinin üzerine inşa edildiği ncurses kütüphanesi, başlangıçta bu tanımı okur. top, less, nano ve watch gibi programlar, bu tanım olmadan tek bir ekran görüntüsü dahi oluşturamaz.

Kendi girdinizi inceleyin:

echo "$TERM"
tput longname
infocmp -1 | head -20

tput longname, TERM ile belirtilen girdinin insan tarafından okunabilir tanımını yazdırır. xterm-256color için çıktı şöyledir:

xterm with 256 colors

infocmp -1, tüm girdiyi derlemeden çıkarır ve her bir yeteneği ayrı bir satıra yazdırır. Her iki komut da çalışıyorsa, bu makinedeki veritabanı söz konusu terminali tanıyor demektir. Bir SSH bağlantısının diğer ucunda da sahip olmanız gereken durum budur.

Neden yalnızca SSH üzerinden hata veriyor

SSH yalnızca ismi gönderir, başka hiçbir şey iletmez. İstemci bir sözde uçbirim (pseudo-terminal) talep ettiğinde, TERM bu istekle birlikte iletilir. OpenSSH kılavuzu bu konuda nettir: "protokol gereği, bir sözde uçbirim talep edildiği her durumda TERM ortam değişkeni gönderilir". Bu nedenle VPS üzerindeki oturum kabuğunuz TERM=xterm-ghostty, xterm-kitty veya emülatörünüzün kullandığı başka bir isim değerini alır. Bu ismin arkasındaki açıklama dizüstü bilgisayarınızda, yerel veritabanınızda kalır. Emülatörünüzün varlığından önce oluşturulmuş bir sunucu, bu ismi daha önce hiç duymamıştır. SSH bağlantısının kendisinde uçbirim açıklamalarını kopyalayan hiçbir mekanizma yoktur ve bu kasıtlıdır: protokol bir yetenek dökümü değil, yalnızca bir isim taşır.

Hatayı kendi makinenizde, kesinlikle mevcut olmayan bir isimle yeniden oluşturun:

TERM=xterm-nosuchthing tput colors
echo "$?"
tput: unknown terminal "xterm-nosuchthing"

Çıkış durumu 3'tir; ncurses bunu bilinmeyen bir uçbirim türü veya eksik bir veritabanı olarak tanımlar. Her curses programı aynı arama işlemini çalıştırır, bu nedenle eksik olan tek bir isim, her programda farklı bir mesaj üretse de hepsinin arkasında tek bir neden yatar. nano, başlangıçta bir açıklama yükleyemediğinde oluşan standart ncurses hatası olan Error opening terminal: xterm-nosuchthing. ile durur. vim, E558: Terminal entry not found in terminfo çıktısını verir. less, WARNING: terminal is not fully functional çıktısını verir. Yarı çalışan bir sayfalayıcı (pager) ve başlamayı reddeden bir düzenleyici, birbirinden bağımsız hatalar gibi görünür. Oysa bunlar aynı eksik dosyanın sonucudur.

ncurses girişleri nerede arar

ncurses, terminfo(5) içinde belgelenen sabit bir sırada arama yapar:

  1. Eğer ayarlanmışsa $TERMINFO. Sadece bu dizin aranır.
  2. $HOME/.terminfo.
  3. $TERMINFO_DIRS içinde listelenen her dizin.
  4. Debian ve Ubuntu üzerinde /etc/terminfo, /lib/terminfo ve /usr/share/terminfo dizinlerini içeren, derleme sırasında belirlenmiş konumlar.

Yukarıdaki yollara güvenmek yerine, sunucunuzdaki ncurses derlemesinin kullandığı listeyi yazdırmak için sunucuda infocmp -D komutunu çalıştırın. 2. adım tüm işin püf noktasıdır. Ev dizininiz herhangi bir sistem dizininden önce arandığı için, ~/.terminfo altındaki tek bir dosya, herhangi bir paket kurulumu veya root yetkisi gerektirmeden hesabınız için arama işlemini düzeltir.

Çözüm 1: Sunucunun halihazırda bildiği bir TERM kullanın

En hızlı çözüm, tek bir bağlantı için farklı bir terminal ismi tanımlamaktır:

TERM=xterm-256color ssh user@203.0.113.10

Bunu dizüstü bilgisayarınızdaki ~/.ssh/config dosyasında ilgili sunucu için kalıcı hale getirin:

Host vps1
    HostName 203.0.113.10
    User deploy
    SetEnv TERM=xterm-256color

SetEnv, istemci tarafında Ağustos 2018'de yayınlanan OpenSSH 7.8 veya daha yeni bir sürümü gerektirir. TERM, sunucunun iznine ihtiyaç duymayan tek değişkendir: kılavuzda "SendEnv'e benzer şekilde, TERM değişkeni hariç, sunucunun ortam değişkenini kabul etmeye hazır olması gerekir" ifadesi yer alır. Bu nedenle, AcceptEnv satırı hiç bulunmayan sıkılaştırılmış bir sshd karşısında bile bu yöntem çalışır.

Maliyeti: Emülatörünüzün düz xterm-256color ötesinde tanımladığı her şeydir. Buna RGB yeteneği aracılığıyla duyurulan 24-bit renkler ve Smulx aracılığıyla sağlanan stilli alt çizgiler dahildir. Programlar artık bu yetenekleri göremediği için 256 renge ve düz alt çizgiye geri dönerler. Ekran çalışır. Sadece seçtiğiniz terminalden daha az yetenekli hale gelir.

Bu sorunu sunucudaki .bashrc dosyanıza export TERM=xterm-256color ekleyerek çözmeyin. O dosya, sunucunun ismini bildiği bir terminalden gelen bağlantılar da dahil olmak üzere her bağlantıda çalışır; bu nedenle zaten sorunsuz olan oturumların kalitesini düşürür. Geçersiz kılma işlemini, hangi emülatörü çalıştırdığınızı bildiğiniz istemci tarafında tutun.

Çözüm 2: terminfo girdinizi sunucuya bir kez gönderin

Bu çözüm, emülatörünüzü olduğu gibi korumanızı sağlar. Girdiyi yerel olarak derleyin, SSH üzerinden aktarın ve uzak tarafta tekrar derleyin:

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

infocmp -x, mevcut TERM değeriniz için girdiyi, genişletilmiş (kullanıcı tanımlı) yetenekler dahil olmak üzere kaynak metin olarak yazdırır. tic -x, bu kaynağı sunucuda tekrar ikili bir açıklamaya dönüştürür. Her iki taraftaki -x kullanımı önemlidir; çünkü bu olmadan Smulx gibi yetenekler aktarım sırasında kaybolur ve kendi terminalinizin düşük özellikli bir kopyasını göndermiş olursunuz.

tic, mümkün olduğunda sistem dizinine yazar; yazma erişimi olmadığında ise $HOME/.terminfo konumuna geri döner. Bir VPS üzerindeki standart bir hesap, ev dizinini kullanır; bu da tam olarak istediğiniz durumdur. Hedef dizini de belirtebilirsiniz:

infocmp -x | ssh user@203.0.113.10 -- tic -x -o '~/.terminfo' /dev/stdin

~/.terminfo etrafındaki tırnak işaretleri süs değildir. ssh, komut kelimelerini tek bir dizge halinde birleştirir ve uzak kabuğa iletir; bu nedenle tırnak içine alınmamış bir ~, önce yerel kabuğunuz tarafından genişletilir. Bu durumda, hesabınızın farklı bir isimde olabileceği bir makineye sabit bir /home/yourname/.terminfo göndermiş olursunuz. tic, izin hatası nedeniyle başarısız olur veya ncurses'ın asla aramadığı bir yola yazmaya çalışır. Tilde işaretini tırnak içine alın; böylece uzak kabuk bunu doğru şekilde genişletecektir.

Oturum açın ve kontrol edin:

ssh user@203.0.113.10
tput longname
ls -R ~/.terminfo

tput longname ile terminal açıklamanızın yazdırılması, aramanın başarılı olduğunu gösterir; ls ise derlenmiş dosyayı, terminal isminin ilk harfiyle adlandırılmış bir alt dizin altında gösterir. Ardından top komutunu veya ekranı aynı kütüphane üzerinden yeniden çizen watch -n1 uptime komutunu çalıştırarak gerçek bir curses programının ekranı düzgün çizdiğini doğrulayın.

Maliyeti: sunucu başına bir adım ve girdi, tek bir makinedeki tek bir hesabın ev dizininde yaşar. VPS'i yeniden kurduğunuzda girdi silinir. Yeni bir sunucu girdi hazır bir şekilde gelsin istiyorsanız, bu komutu birden fazla sunucuyu aynı anda hazırlamak ve yönetmek için kullandığınız araca ekleyin.

Çözüm 3: Genişletilmiş terminfo veritabanını yükleyin

root yetkisine sahipseniz ve ismin sunucudaki her hesap için çözümlenmesini istiyorsanız:

sudo apt update
sudo apt install ncurses-term
tput -T xterm-ghostty longname

ncurses-term, temel kurulumun dışarıda bıraktığı terminal tanımlarını içerir. Bu işlem, çözüm 2'nin aksine, root ve diğer tüm kullanıcılar için ismi düzeltir.

Bu yöntem yalnızca terminalinizin girdisi dağıtımınızın paketlediği ncurses sürümünde mevcutsa işe yarar; bu yüzden varsaymak yerine kontrol edin. Ubuntu 24.04, (Ağustos 2026 itibarıyla) ncurses-bin 6.4+20240113-1ubuntu2.1 ile gelir. Ghostty girdisi, daha yeni bir sürüm olan ncurses 6.5-20241228 içerisinde upstream olarak eklenmiştir; bu nedenle apt install ncurses-term komutunu ne kadar çalıştırırsanız çalıştırın Ubuntu 24.04 üzerinde bir xterm-ghostty girdisi oluşturamazsınız. Kontrol için tput -T <name> longname kullanılır: girdi mevcutsa açıklamasını yazdırır, mevcut değilse 3 çıkış kodu ile unknown terminal hatası verir.

Tüm paketi yüklemek yerine tek bir girdiyi sistem genelinde kurmak için kaynak dosyasını kopyalayın ve root olarak derleyin:

infocmp -x | ssh user@203.0.113.10 -- 'cat > /tmp/term.src'
ssh -t user@203.0.113.10 -- sudo tic -x -o /usr/share/terminfo /tmp/term.src

İkinci komuttaki -t, bir pseudo terminal tahsis eder; böylece sudo parola isteminde bulunabilir. Bu parametre olmadan sudo, sudo: no tty present and no askpass program specified hatası ile sonlanabilir.

Aktarımı emülatöre bırakın

Bazı emülatörler, 2 numaralı düzeltmeyi sizin yerinize yapan bir yardımcı araçla birlikte gelir. kitty, bir ssh kitten içerir: kitten ssh myserver, uzak ana bilgisayara bağlanır ve kitty'nin terminfo dosyasını otomatik olarak kopyalar. Belgeleri ayrıca, yukarıda açıklanan nedenlerden dolayı tilde işaretinin kaçış karakteriyle kullanıldığı manuel biçimi olan infocmp -a xterm-kitty | ssh myserver tic -x -o \~/.terminfo /dev/stdin komutunu da sunar. Ghostty, infocmp -x xterm-ghostty | ssh YOUR-SERVER -- tic -x - komutunu belgeler ve her iki düzeltmeyi de otomatikleştiren bir +ssh eyleminin yanı sıra kabuk entegrasyonu (ssh-env ve ssh-terminfo) sunar.

Bu yardımcı araçlar, az önce manuel olarak çalıştırdığınız komutların aynısını yürütür. Manuel biçimi bilmek hala önemlidir; çünkü yardımcı araç, bağlantı başka bir yerde, bir atlama sunucusunda (jump host) veya bir betik içinde başladığında devreye giremez.

Hata geri döndüğünde

sudo -i altında. root kullanıcısı olarak açılan bir login shell HOME=/root değerine sahiptir ve sudo, TERM değerinizi korur. ncurses artık girdinizi barındırmayan /root/.terminfo dizininde arama yapar, bu nedenle hata yalnızca root kullanıcısı için geri döner. sudo -i env ile durumu doğrulayın ve HOME ile TERM satırlarını inceleyin. Girdiyi sistem dizinine kurun veya /root/.terminfo içine bir kopyasını yerleştirin.

tmux veya screen içinde. Bu araçlar, içlerinde çalışan programlar için kendi TERM değerlerini belirler; bu genellikle screen-256color veya tmux-256color olur. Eski bir sunucu screen-256color değerini bilir ancak tmux-256color değerini tanımayabilir; bu durumda dıştaki shell düzgün çalışırken oturum içindeki her şey başarısız olur. Sebep aynı, ancak isim farklıdır. Sunucuda hangisinin mevcut olduğunu görmek için tput -T tmux-256color longname komutunu çalıştırın. tmux tabanlı terminal çalışma alanı, siz henüz düzeltmediğiniz bir ana makineye bağlanana kadar bu durumu gizler.

Yeni bir sunucuda. ~/.terminfo hesap ve makine bazlıdır, bu nedenle yeniden oluşturulan bir VPS tekrar boş başlar.

Ekran çiziliyor, tuşlar hatalı çalışıyor. Eğer görüntü düzgünse ancak Home, End veya fonksiyon tuşları beklenmedik karakterler ekliyorsa, çözümlenen isim terminalinizle eşleşmeyen bir girdiye yönlenmiştir. Tuş dizileri, çizim yetenekleriyle aynı terminfo girdisinden gelir; bu nedenle yaklaşık bir girdi, yaklaşık tuş sonuçları verir. Bu durum, tuş dizileri xterm değerinden farklı olan bir emülatör üzerinde 1. düzeltmenin uygulanmasının tipik bir sonucudur. Çözüm 2. yöntemdir, çünkü yalnızca emülatörünüzün gerçek girdisi doğru dizileri taşır.

FAQ

SSH üzerinden neden sadece "unknown terminal type" hatası alıyorum?

Terminal girişinizi barındırması gereken veritabanı sunucu tarafında olandır. Terminal emülatörünüz, kendi tanımını çalıştığı makineye kurar; bu sayede yerel programlar herhangi bir çaba gerektirmeden bu tanıma ulaşır. SSH protokolü, sözde terminal isteğiyle birlikte yalnızca TERM değerini iletir. Uzak sunucudaki ncurses, bu ismi uzak veritabanında arar ve bulamaz; bu nedenle initscr başarısız olur ve program durur.

Sunucuda root yetkisi olmadan bunu düzeltebilir miyim?

Evet. ncurses, herhangi bir sistem dizininden önce $HOME/.terminfo yolunu arar, bu nedenle buradaki bir giriş hesabınız için yeterlidir. Her sunucu için bir kez infocmp -x | ssh user@host -- tic -x - komutunu çalıştırın. tic, sistem yoluna yazamadığı durumlarda (yetkisiz bir hesap için normal durum budur) ev dizininize yazar. Giriş yapın ve aramanın artık çözümlendiğini doğrulamak için tput longname komutunu çalıştırın.

Bir ana makine için TERM=xterm-256color ayarını yaptığımda ne kaybederim?

Emülatörünüzün xterm-256color girişinin ötesinde tanımladığı tüm yetenekleri kaybedersiniz; örneğin RGB üzerinden 24-bit renk desteği ve Smulx üzerinden biçimlendirilmiş alt çizgiler gibi. Programlar bu yetenekleri göremez, bu yüzden en yakın yedek (fallback) ayarı kullanırlar. Fonksiyon tuşu dizileri de gerçek terminalinizden farklı olabilir. Ayarı sunucudaki bir .bashrc dosyası yerine istemci tarafında ~/.ssh/config içine ekleyin; aksi takdirde zaten çalışan terminallerden gelen oturumların kalitesini düşürmüş olursunuz.

Hata neden sudo -i sonrasında geri geliyor?

sudo -i, TERM değerinizi korurken HOME=/root ile root olarak bir giriş kabuğu başlatır. ncurses bu durumda kendi ev dizininiz yerine /root/.terminfo yolunu arar ve hiçbir şey bulamaz; bu nedenle root kullanıcısı, sizin hesabınızda artık görmediğiniz aynı hatayı alır. sudo -i env komutunu çalıştırın ve HOME ile TERM satırlarını kontrol edin. Girişi sudo tic -x -o /usr/share/terminfo ile sistem dizinine derleyin veya /root/.terminfo içine kopyalayın.

apt install ncurses-term her zaman sorunu çözer mi?

Hayır. Yalnızca dağıtımınızın paketlediği ncurses sürümünde mevcut olan girişleri ekler. Ubuntu 24.04, ncurses 6.4 (Ağustos 2026 itibarıyla ncurses-bin 6.4+20240113-1ubuntu2.1) ile gelir; Ghostty girişi ise upstream ncurses 6.5-20241228 sürümünde eklendiği için bu paket söz konusu girişi içeremez. Pakete güvenmeden önce tput -T <name> longname ile kontrol edin ve kontrol hala bilinmeyen bir terminal bildiriyorsa girişi kendiniz sağlayın.

#terminfo#ssh#ncurses#tput#terminal