SSD Nodes Learn 🎉 VPS $5.50/মাস থেকে
নির্দেশিকা Matt Connorদ্বারা Matt Connor

SSH-এ unknown terminal type ত্রুটি সমাধানের উপায়

SSH সংযোগের সময় unknown terminal type ত্রুটিটি কেন হয় এবং রুট পারমিশন ছাড়াই কীভাবে আপনার হোম ডিরেক্টরিতে terminfo এন্ট্রি তৈরি করে এই সমস্যার সমাধান করবেন তা বিস্তারিত জানুন।

"unknown terminal type" এর অর্থ কী

SSH-এর মাধ্যমে "unknown terminal type" ত্রুটিটির অর্থ হলো, TERM-এ থাকা নামটি সার্ভারে থাকা terminfo ডেটাবেসে নেই। আপনার ল্যাপটপের টার্মিনাল এমুলেটর এই নামটি সেট করে, কিন্তু যে ডেটাবেসটিকে এটি চিনতে হবে, সেটি রিমোট মেশিনে অবস্থিত। যখন এই lookup ব্যর্থ হয়, তখন সার্ভারের প্রতিটি curses প্রোগ্রাম কোনো কিছু প্রদর্শন করার আগেই বন্ধ হয়ে যায়, কারণ আপনার টার্মিনাল কী কী করতে সক্ষম তার কোনো বর্ণনা প্রোগ্রামটির কাছে থাকে না।

আপনার এমুলেটরের সব ফিচার ঠিক রেখে এই সমস্যার সমাধানের একটি কমান্ড হলো: সার্ভারে আপনার নিজস্ব terminfo এন্ট্রি ~/.terminfo-এ কম্পাইল করা। ncurses যেকোনো সিস্টেম ডিরেক্টরির আগে আপনার হোম ডিরেক্টরি অনুসন্ধান করে, তাই এর জন্য root অনুমতির প্রয়োজন হয় না এবং অন্য ব্যবহারকারীদের জন্য কোনো পরিবর্তনও ঘটে না।

TERM একটি নাম, terminfo হলো ডেটাবেস

TERM একটি স্ট্রিং ধারণ করে এবং সেই স্ট্রিংটি কেবল একটি কি (key)। terminfo হলো টার্মিনাল ডেসক্রিপশনের একটি কম্পাইল করা ডেটাবেস, এবং এই কি-এর মাধ্যমেই একটি প্রোগ্রাম সঠিক ডেসক্রিপশনটি খুঁজে পায়। একটি ডেসক্রিপশনে রেকর্ড করা থাকে টার্মিনালটিতে কতগুলো রঙ আছে, কোন বাইটগুলো কার্সারকে 12 নম্বর সারি ও 40 নম্বর কলামে নিয়ে যায়, F5 কি চাপলে কোন বাইট পাঠানো হয় এবং এটি স্টাইলড আন্ডারলাইন আঁকতে পারে কি না। ncurses, যা লিনাক্সের প্রায় প্রতিটি টেক্সট ইউজার ইন্টারফেস তৈরির লাইব্রেরি, তা স্টার্টআপের সময় এই ডেসক্রিপশনটি পড়ে নেয়। top, less, nano এবং watch-এর মতো প্রোগ্রামগুলো এটি ছাড়া স্ক্রিনে কিছুই প্রদর্শন করতে পারে না।

আপনার নিজের এন্ট্রিটি দেখুন:

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

tput longname কমান্ডটি TERM দ্বারা নির্দেশিত যেকোনো কিছুর মানুষের পড়ার উপযোগী ডেসক্রিপশন প্রিন্ট করে। xterm-256color-এর জন্য এটি প্রিন্ট করে:

xterm with 256 colors

infocmp -1 পুরো এন্ট্রিটিকে ডিকম্পাইল করে এবং প্রতি লাইনে একটি করে ক্যাপাবিলিটি প্রিন্ট করে। যদি উভয় কমান্ডই কাজ করে, তবে এই মেশিনের ডেটাবেস আপনার টার্মিনালটিকে চেনে। SSH কানেকশনের অপর প্রান্তে আপনার ঠিক এই অবস্থাই প্রয়োজন।

কেন এটি শুধুমাত্র SSH-এর মাধ্যমে কাজ করার সময় ত্রুটিপূর্ণ হয়

SSH শুধুমাত্র নাম পাঠায়, অন্য কিছু নয়। যখন ক্লায়েন্ট একটি pseudo terminal-এর অনুরোধ করে, তখন TERM সেই অনুরোধের সাথে যায়। OpenSSH ম্যানুয়ালটি স্পষ্টভাবে বলে: "pseudo-terminal অনুরোধ করা হলে TERM environment variable সবসময় পাঠানো হয়, কারণ প্রোটোকলের জন্য এটি প্রয়োজনীয়"। তাই আপনার VPS-এ থাকা login shell TERM=xterm-ghostty, অথবা xterm-kitty, অথবা আপনার emulator যে নামই ব্যবহার করুক না কেন, তা গ্রহণ করে। সেই নামের পেছনের বিবরণটি আপনার ল্যাপটপেই থেকে যায়, আপনার ল্যাপটপের ডেটাবেসে। আপনার emulator তৈরি হওয়ার আগে যে সার্ভার তৈরি হয়েছে, সেটি এই নাম সম্পর্কে কিছুই জানে না। SSH সংযোগের কোনো কিছুই terminal-এর বিবরণ কপি করে না, এবং এটি ইচ্ছাকৃতভাবেই করা হয়েছে: প্রোটোকলটি শুধুমাত্র একটি নাম বহন করে, কোনো capability dump নয়।

আপনার নিজের মেশিনে এমন একটি নাম দিয়ে এই ব্যর্থতাটি পুনরায় তৈরি করুন যা নিশ্চিতভাবেই বিদ্যমান নেই:

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

এর exit status হলো 3, যা ncurses-এর ডকুমেন্টেশন অনুযায়ী একটি অজানা terminal type বা অনুপস্থিত ডেটাবেস নির্দেশ করে। প্রতিটি curses প্রোগ্রাম একই lookup চালায়, তাই একটি নামের অনুপস্থিতি প্রতিটি প্রোগ্রামে ভিন্ন ভিন্ন বার্তা তৈরি করলেও সবগুলোর পেছনে একটিই কারণ থাকে। nano, Error opening terminal: xterm-nosuchthing. নিয়ে বন্ধ হয়ে যায়, যা ncurses-এর একটি সাধারণ ব্যর্থতা যখন এটি শুরুতে কোনো বিবরণ লোড করতে পারে না। vim, E558: Terminal entry not found in terminfo প্রিন্ট করে। less, WARNING: terminal is not fully functional প্রিন্ট করে। একটি pager যা অর্ধেক কাজ করে এবং একটি editor যা শুরু হতে অস্বীকার করে, এগুলোকে আলাদা বাগ মনে হতে পারে। কিন্তু এগুলো আসলে একই অনুপস্থিত ফাইলের কারণে ঘটে।

ncurses যেখানে এন্ট্রি খোঁজে

ncurses একটি নির্দিষ্ট ক্রমে অনুসন্ধান করে, যা terminfo(5)-এ নথিভুক্ত আছে:

  1. $TERMINFO, যদি এটি সেট করা থাকে। শুধুমাত্র সেই ডিরেক্টরিটিতেই অনুসন্ধান করা হয়।
  2. $HOME/.terminfo
  3. $TERMINFO_DIRS-এ তালিকাভুক্ত প্রতিটি ডিরেক্টরি।
  4. কম্পাইল-ইন করা লোকেশনগুলো, যা Debian এবং Ubuntu-তে /etc/terminfo, /lib/terminfo এবং /usr/share/terminfo অন্তর্ভুক্ত করে।

সার্ভারে infocmp -D চালান, যাতে উপরের পাথগুলোর ওপর নির্ভর না করে আপনার ncurses বিল্ড যে তালিকাটি ব্যবহার করে তা প্রিন্ট করা যায়। ধাপ 2-ই হলো আসল কৌশল। যেকোনো সিস্টেম ডিরেক্টরির আগে আপনার হোম ডিরেক্টরি অনুসন্ধান করা হয়, তাই ~/.terminfo-এর অধীনে একটি ফাইল কোনো প্যাকেজ ইনস্টল বা root অ্যাক্সেস ছাড়াই আপনার অ্যাকাউন্টের জন্য লুকআপ ঠিক করে দেয়।

সমাধান 1: সার্ভার ইতিমধ্যে চেনে এমন একটি TERM ব্যবহার করুন

সবচেয়ে দ্রুত সমাধান হলো একটি সংযোগের জন্য ভিন্ন একটি টার্মিনাল নাম ব্যবহার করা:

TERM=xterm-256color ssh user@203.0.113.10

আপনার ল্যাপটপের ~/.ssh/config ফাইলে নির্দিষ্ট হোস্টের জন্য এটি স্থায়ী করুন:

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

SetEnv ব্যবহারের জন্য ক্লায়েন্টে OpenSSH 7.8 বা তার পরবর্তী সংস্করণ প্রয়োজন, যা 2018 সালের আগস্ট মাসে রিলিজ হয়েছিল। TERM হলো একমাত্র ভেরিয়েবল যার জন্য সার্ভারের অনুমতির প্রয়োজন হয় না: ম্যানুয়াল অনুযায়ী "SendEnv-এর মতোই, তবে TERM ভেরিয়েবলের ক্ষেত্রে ব্যতিক্রম হলো, সার্ভারকে এনভায়রনমেন্ট ভেরিয়েবল গ্রহণ করার জন্য প্রস্তুত থাকতে হয়"। তাই এটি এমন একটি হার্ডেনড sshd-এর বিরুদ্ধেও কাজ করে যেখানে কোনো AcceptEnv লাইন নেই।

এর সীমাবদ্ধতা: সাধারণ xterm-256color-এর বাইরে আপনার এমুলেটর যা কিছু বর্ণনা করে তা কাজ করবে না। এর মধ্যে রয়েছে RGB ক্যাপাবিলিটির মাধ্যমে বিজ্ঞাপন করা 24-বিট কালার এবং Smulx-এর মাধ্যমে স্টাইল করা আন্ডারলাইন। প্রোগ্রামগুলো আর সেই ক্যাপাবিলিটিগুলো দেখতে পাবে না, তাই সেগুলো 256 কালার এবং সাধারণ আন্ডারলাইনে ফিরে যাবে। স্ক্রিন কাজ করবে, তবে এটি আপনার নির্বাচিত টার্মিনালের তুলনায় কম সক্ষম হবে।

সার্ভারের .bashrc ফাইলে export TERM=xterm-256color যোগ করে এই সমস্যার সমাধান করবেন না। সেই ফাইলটি প্রতিটি সংযোগের জন্য চলে, যার মধ্যে এমন টার্মিনাল থেকে আসা সংযোগও অন্তর্ভুক্ত যার নাম সার্ভার ইতিমধ্যে জানে; ফলে এটি সেই সেশনগুলোর মান কমিয়ে দেয় যেগুলো আগে থেকেই ঠিক ছিল। ওভাররাইডটি ক্লায়েন্টেই রাখুন, কারণ সেখানেই আপনি জানেন যে আপনি কোন এমুলেটরটি চালাচ্ছেন।

সমাধান 2: আপনার terminfo এন্ট্রি একবার সার্ভারে পাঠান

এই সমাধানটি আপনার এমুলেটরকে অক্ষুণ্ণ রাখে। লোকালি এন্ট্রিটি ডিকম্পাইল করুন, SSH-এর মাধ্যমে পাইপ করুন এবং দূরবর্তী সার্ভারে কম্পাইল করুন:

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

infocmp -x আপনার বর্তমান TERM-এর জন্য এন্ট্রিটিকে সোর্স টেক্সট হিসেবে প্রিন্ট করে, যার মধ্যে এক্সটেন্ডেড (ব্যবহারকারী-সংজ্ঞায়িত) ক্যাপাবিলিটিগুলোও অন্তর্ভুক্ত থাকে। tic -x সেই সোর্সটিকে সার্ভারে একটি বাইনারি ডেসক্রিপশনে রূপান্তর করে। উভয় পাশে -x থাকা জরুরি, কারণ এটি ছাড়া Smulx-এর মতো ক্যাপাবিলিটিগুলো স্থানান্তরের সময় বাদ পড়ে যায় এবং আপনি আপনার নিজের টার্মিনালের একটি ডাউনগ্রেড কপি পাঠান।

tic যখন সম্ভব সিস্টেম ডিরেক্টরিতে লেখে এবং ব্যবহারকারীর সেখানে লেখার অনুমতি না থাকলে $HOME/.terminfo-এ ফিরে যায়। একটি VPS-এ সাধারণ অ্যাকাউন্টের ক্ষেত্রে এটি হোম ডিরেক্টরিতে লেখে, যা আপনি চান। আপনি গন্তব্য নির্ধারণ করেও দিতে পারেন:

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

~/.terminfo-এর চারপাশের উদ্ধৃতি চিহ্নগুলো কেবল সাজানোর জন্য নয়। ssh কমান্ডের শব্দগুলোকে একটি স্ট্রিংয়ে যুক্ত করে এবং তা রিমোট শেলের কাছে পাঠায়, তাই উদ্ধৃতি চিহ্ন ছাড়া ~ প্রথমে আপনার লোকাল শেল দ্বারা এক্সপ্যান্ড হয়ে যায়। তখন আপনি একটি লিটারাল /home/yourname/.terminfo এমন একটি মেশিনে পাঠান যেখানে আপনার অ্যাকাউন্টের নাম ভিন্ন হতে পারে। tic তখন পারমিশন এরর দেখাবে অথবা এমন একটি পাথে লিখবে যেখানে ncurses কখনোই অনুসন্ধান করে না। টিল্ডা (tilde) উদ্ধৃতি চিহ্নের ভেতর রাখুন, তাহলে রিমোট শেল সেটি এক্সপ্যান্ড করবে।

লগ ইন করুন এবং পরীক্ষা করুন:

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

tput longname আপনার টার্মিনালের ডেসক্রিপশন প্রিন্ট করার অর্থ হলো লুকআপ সফল হয়েছে এবং ls টার্মিনালের নামের প্রথম অক্ষর অনুযায়ী সাব-ডিরেক্টরিতে কম্পাইল করা ফাইলটি দেখায়। এরপর top চালান, অথবা watch -n1 uptime, যা একই লাইব্রেরির মাধ্যমে স্ক্রিন রিড্র করে, নিশ্চিত করুন যে একটি আসল curses প্রোগ্রাম স্ক্রিন পেইন্ট করতে পারছে।

এর খরচ: প্রতি সার্ভারের জন্য একটি ধাপ এবং এন্ট্রিটি একটি মেশিনে একটি অ্যাকাউন্টের হোম ডিরেক্টরিতে থাকে। VPS রিবিল্ড করলে এটি মুছে যাবে। কমান্ডটিকে আপনার একাধিক সার্ভার একসাথে প্রভিশনিং এবং ম্যানেজ করার টুলে যুক্ত করুন, যাতে নতুন হোস্ট আসার সময়ই এন্ট্রিটি কম্পাইল করা থাকে।

সমাধান 3: extended terminfo database ইনস্টল করা

আপনার যদি root অ্যাক্সেস থাকে এবং আপনি চান যে সার্ভারের প্রতিটি অ্যাকাউন্টের জন্য টার্মিনাল নামটি সঠিকভাবে resolve হোক, তবে নিচের কমান্ডটি ব্যবহার করুন:

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

ncurses-term প্যাকেজটিতে এমন সব টার্মিনাল ডেসক্রিপশন থাকে যা বেস ইনস্টলেশনে বাদ পড়ে যায়। এটি root এবং অন্য সব ব্যবহারকারীর জন্য টার্মিনাল নামটি ঠিক করে দেয়, যা সমাধান 2 করতে পারে না।

এটি কেবল তখনই কাজ করে যখন আপনার টার্মিনালের এন্ট্রিটি আপনার ডিস্ট্রিবিউশনের ncurses রিলিজে অন্তর্ভুক্ত থাকে, তাই অনুমান না করে যাচাই করে নিন। Ubuntu 24.04-এ ncurses-bin 6.4+20240113-1ubuntu2.1 প্যাকেজটি থাকে (আগস্ট 2026 অনুযায়ী)। Ghostty-এর এন্ট্রিটি ncurses 6.5-20241228 ভার্সনে যুক্ত করা হয়েছে, যা নতুন। তাই Ubuntu 24.04-এ apt install ncurses-term কমান্ডটি চালালে তা কখনোই xterm-ghostty এন্ট্রি তৈরি করতে পারবে না। tput -T <name> longname কমান্ডটি দিয়ে যাচাই করুন: এন্ট্রিটি থাকলে এটি ডেসক্রিপশন প্রিন্ট করবে, আর না থাকলে এটি unknown terminal আউটপুট দেবে এবং exit status 3 রিটার্ন করবে।

পুরো প্যাকেজ ইনস্টল না করে শুধুমাত্র একটি এন্ট্রি সিস্টেম-ব্যাপী ইনস্টল করতে চাইলে, সোর্স ফাইলটি কপি করুন এবং root হিসেবে কম্পাইল করুন:

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

দ্বিতীয় কমান্ডে থাকা -t ফ্ল্যাগটি একটি pseudo terminal বরাদ্দ করে, যাতে sudo পাসওয়ার্ডের জন্য প্রম্পট করতে পারে। এটি ছাড়া, sudo কমান্ডটি sudo: no tty present and no askpass program specified এরর দিয়ে বন্ধ হয়ে যেতে পারে।

ইমুলেটরকে ট্রান্সফার সম্পন্ন করতে দিন

কিছু ইমুলেটর এমন হেল্পার টুল সরবরাহ করে যা আপনার হয়ে 2 নম্বর সমাধানটি কার্যকর করে। kitty-তে একটি ssh kitten রয়েছে: kitten ssh myserver কমান্ডটি রিমোট হোস্টের সাথে সংযোগ স্থাপন করে এবং স্বয়ংক্রিয়ভাবে kitty-এর terminfo কপি করে। এর ডকুমেন্টেশনে ম্যানুয়াল পদ্ধতিটিও দেওয়া আছে, infocmp -a xterm-kitty | ssh myserver tic -x -o \~/.terminfo /dev/stdin, যেখানে উপরে বর্ণিত কারণে টিল্ডা (tilde) এস্কেপ করা হয়েছে। Ghostty-এর ডকুমেন্টেশনে infocmp -x xterm-ghostty | ssh YOUR-SERVER -- tic -x - উল্লেখ আছে এবং এটি শেল ইন্টিগ্রেশন (ssh-env এবং ssh-terminfo) এর পাশাপাশি একটি +ssh অ্যাকশন প্রদান করে, যা উভয় সমাধানই স্বয়ংক্রিয়ভাবে সম্পন্ন করে।

এই হেল্পারগুলো ঠিক সেই কমান্ডগুলোই চালায় যা আপনি এতক্ষণ হাতে করেছেন। ম্যানুয়াল পদ্ধতিটি জানা জরুরি, কারণ যখন সংযোগটি অন্য কোথাও থেকে শুরু হয়, যেমন কোনো জাম্প হোস্ট বা স্ক্রিপ্টের ভেতর থেকে, তখন এই হেল্পারগুলো কাজ করতে পারে না।

যখন ত্রুটিটি পুনরায় দেখা দেয়

sudo -i এর অধীনে। root হিসেবে একটি login shell-এর নিজস্ব HOME=/root থাকে এবং sudo আপনার TERM বজায় রাখে। ncurses এখন /root/.terminfo অনুসন্ধান করে, যেখানে আপনার এন্ট্রিটি নেই, তাই শুধুমাত্র root-এর ক্ষেত্রেই ব্যর্থতাটি ফিরে আসে। sudo -i env দিয়ে নিশ্চিত করুন এবং HOMETERM লাইনগুলো পড়ুন। সিস্টেম ডিরেক্টরিতে এন্ট্রিটি ইনস্টল করুন অথবা /root/.terminfo-এ একটি কপি রাখুন।

tmux বা screen-এর ভেতরে। এগুলো তাদের ভেতরে চলমান প্রোগ্রামগুলোর জন্য নিজস্ব TERM সেট করে, যা সাধারণত screen-256color বা tmux-256color হয়। একটি পুরনো সার্ভার screen-256color চেনে কিন্তু হয়তো tmux-256color চেনে না, তাই বাইরের shell ঠিক থাকলেও সেশনের ভেতরের সবকিছু ব্যর্থ হয়। কারণ একই, কিন্তু নাম ভিন্ন। সার্ভারে tput -T tmux-256color longname চালিয়ে দেখুন এর মধ্যে কোনটি সেখানে আছে। একটি tmux-কে কেন্দ্র করে তৈরি টার্মিনাল ওয়ার্কবেঞ্চ এই সমস্যাটি লুকিয়ে রাখে, যতক্ষণ না আপনি এমন কোনো হোস্টে এটি attach করেন যা আপনি এখনো ঠিক করেননি।

নতুন সার্ভারে। ~/.terminfo প্রতিটি অ্যাকাউন্ট এবং প্রতিটি মেশিনের জন্য আলাদা, তাই একটি নতুন তৈরি করা VPS আবার খালি অবস্থায় শুরু হয়।

স্ক্রিন ঠিকমতো কাজ করছে, কিন্তু কী (keys) ভুল আচরণ করছে। যদি ডিসপ্লে ঠিক থাকে কিন্তু Home, End বা ফাংশন কীগুলো অসংলগ্ন অক্ষর ইনপুট দেয়, তবে এর অর্থ হলো টার্মিনালের নামের সাথে অমিল থাকা কোনো এন্ট্রি ব্যবহার করা হচ্ছে। কী সিকোয়েন্সগুলো ড্রয়িং ক্যাপাবিলিটির মতো একই terminfo এন্ট্রি থেকে আসে, তাই একটি কাছাকাছি এন্ট্রি ব্যবহার করলে কীগুলোও কাছাকাছি কাজ করে। এটি সাধারণত এমন কোনো এমুলেটরে fix 1 প্রয়োগ করার ফলাফল, যার কী সিকোয়েন্স xterm থেকে ভিন্ন। fix 2 হলো এর সমাধান, কারণ শুধুমাত্র আপনার এমুলেটরের সঠিক এন্ট্রিটিতেই সঠিক সিকোয়েন্সগুলো থাকে।

FAQ

SSH-এর মাধ্যমে কেন আমি শুধু "unknown terminal type" দেখি?

কারণ আপনার টার্মিনালের এন্ট্রি ধারণকারী ডেটাবেসটি সার্ভারে থাকা প্রয়োজন। আপনার এমুলেটর যে মেশিনে চলে, সেখানেই তার বিবরণ ইনস্টল করে, তাই লোকাল প্রোগ্রামগুলো আপনার কোনো বাড়তি প্রচেষ্টা ছাড়াই তা খুঁজে পায়। SSH শুধুমাত্র TERM-এর মান পাঠায়, কারণ প্রোটোকলটি সিউডো-টার্মিনাল অনুরোধের সাথে সেই নামটি বহন করে। রিমোট ncurses রিমোট ডেটাবেসে সেই নামটি খোঁজে এবং কিছুই পায় না, তাই initscr ব্যর্থ হয় এবং প্রোগ্রামটি বন্ধ হয়ে যায়।

সার্ভারে root অ্যাক্সেস ছাড়াই কি এটি ঠিক করা সম্ভব?

হ্যাঁ। ncurses যেকোনো সিস্টেম ডিরেক্টরির আগে $HOME/.terminfo অনুসন্ধান করে, তাই সেখানে একটি এন্ট্রি থাকাই আপনার অ্যাকাউন্টের জন্য যথেষ্ট। প্রতি সার্ভারে একবার infocmp -x | ssh user@host -- tic -x - চালান। tic আপনার হোম ডিরেক্টরিতে লেখে যখন এটি সিস্টেম পাথে লিখতে পারে না, যা একটি সাধারণ আনপ্রিভিলেজড অ্যাকাউন্টের ক্ষেত্রে ঘটে। লগ ইন করুন এবং লুকআপটি এখন কাজ করছে কি না তা নিশ্চিত করতে tput longname চালান।

একটি হোস্টের জন্য TERM=xterm-256color সেট করলে আমি কী হারাই?

আপনার এমুলেটর xterm-256color এন্ট্রির বাইরে যে সক্ষমতাগুলো বর্ণনা করে, যেমন RGB-এর মাধ্যমে 24-বিট কালার এবং Smulx-এর মাধ্যমে স্টাইলড আন্ডারলাইন, তার সবই আপনি হারাবেন। প্রোগ্রামগুলো সেই সক্ষমতাগুলো দেখতে পায় না, তাই তারা নিকটতম ফলব্যাক ব্যবহার করে। ফাংশন-কি সিকোয়েন্সগুলোও আপনার আসল টার্মিনাল থেকে ভিন্ন হতে পারে। এই সেটিংটি সার্ভারের .bashrc-এ না রেখে ক্লায়েন্টের ~/.ssh/config-এ রাখুন, কারণ সার্ভারে রাখলে তা এমন টার্মিনাল সেশনগুলোকেও ডাউনগ্রেড করবে যা আগে থেকেই সঠিকভাবে কাজ করছিল।

sudo -i করার পর কেন ত্রুটিটি আবার ফিরে আসে?

sudo -i আপনার TERM মান বজায় রেখে HOME=/root সহ root হিসেবে একটি লগইন শেল শুরু করে। ncurses তখন আপনার নিজের হোম ডিরেক্টরির পরিবর্তে /root/.terminfo অনুসন্ধান করে এবং কিছুই পায় না, তাই root সেই একই ব্যর্থতা দেখে যা আপনার অ্যাকাউন্ট থেকে আর দেখা যায় না। sudo -i env চালান এবং HOMETERM লাইনগুলো পরীক্ষা করুন। sudo tic -x -o /usr/share/terminfo ব্যবহার করে এন্ট্রিটি সিস্টেম ডিরেক্টরিতে কম্পাইল করুন, অথবা এটিকে /root/.terminfo-এ কপি করুন।

apt install ncurses-term কি সবসময় এটি সমাধান করে?

না। এটি শুধুমাত্র সেই এন্ট্রিগুলো যোগ করে যা আপনার ডিস্ট্রিবিউশনের প্যাকেজ করা ncurses রিলিজে বিদ্যমান ছিল। Ubuntu 24.04-এ ncurses 6.4 (আগস্ট 2026 অনুযায়ী ncurses-bin 6.4+20240113-1ubuntu2.1) থাকে এবং Ghostty-এর এন্ট্রিটি আপস্ট্রিমে ncurses 6.5-20241228-এ যোগ করা হয়েছিল, তাই সেই প্যাকেজে এটি থাকতে পারে না। প্যাকেজের ওপর নির্ভর করার আগে tput -T <name> longname দিয়ে পরীক্ষা করুন এবং যখন চেকটি এখনও অজানা টার্মিনাল রিপোর্ট করে, তখন এন্ট্রিটি নিজেই সরবরাহ করুন।

#terminfo#ssh#ncurses#tput#terminal