SSD Nodes Learn Hosting plans →
คู่มือ Matt Connorโดย Matt Connor

วิธีแก้ปัญหา unknown terminal type เมื่อใช้งานผ่าน SSH

พบปัญหา unknown terminal type ขณะเชื่อมต่อ SSH ใช่หรือไม่ สาเหตุเกิดจากเซิร์ฟเวอร์ไม่รู้จักค่า TERM ของคุณ แก้ไขได้ง่ายโดยคอมไพล์ terminfo ลงในโฮมไดเรกทอรีโดยไม่ต้องใช้สิทธิ์ root

Verified Every command ran end-to-end on a fresh Ubuntu 24.04 server, August 13, 2026.

ความหมายของ "unknown terminal type"

ข้อผิดพลาด unknown terminal type เมื่อใช้งานผ่าน SSH หมายความว่าชื่อที่ระบุใน TERM ไม่มีรายการที่ตรงกันในฐานข้อมูล terminfo บนเซิร์ฟเวอร์ โปรแกรมจำลองเทอร์มินัลของคุณเป็นตัวกำหนดชื่อดังกล่าวบนแล็ปท็อปของคุณ แต่ฐานข้อมูลที่ต้องรู้จักชื่อนั้นจะอยู่บนเครื่องปลายทาง เมื่อการค้นหาล้มเหลว โปรแกรมที่ใช้ curses ทุกตัวบนเซิร์ฟเวอร์นั้นจะหยุดทำงานก่อนที่จะแสดงผลใดๆ เนื่องจากไม่มีคำอธิบายว่าเทอร์มินัลของคุณสามารถทำอะไรได้บ้าง

วิธีแก้ไขที่ยังคงคุณสมบัติทั้งหมดของโปรแกรมจำลองเทอร์มินัลของคุณไว้คือการใช้คำสั่งเดียว: คอมไพล์รายการ terminfo ของคุณเองลงใน ~/.terminfo บนเซิร์ฟเวอร์ ncurses จะค้นหาในโฮมไดเรกทอรีของคุณก่อนไดเรกทอรีระบบ ดังนั้นวิธีนี้จึงไม่จำเป็นต้องใช้สิทธิ์ root และไม่มีผลกระทบใดๆ ต่อผู้ใช้รายอื่น

TERM คือชื่อ ส่วน terminfo คือฐานข้อมูล

TERM เก็บสตริงไว้หนึ่งค่า และสตริงนั้นเป็นเพียงคีย์เท่านั้น terminfo คือฐานข้อมูลที่ถูกคอมไพล์ไว้สำหรับเก็บคำอธิบายของเทอร์มินัล โดยคีย์จะทำหน้าที่เป็นตัวระบุให้โปรแกรมค้นหาข้อมูลที่ถูกต้อง คำอธิบายจะบันทึกว่าเทอร์มินัลรองรับกี่สี, ต้องใช้ไบต์ใดในการเลื่อนเคอร์เซอร์ไปที่แถว 12 คอลัมน์ 40, ปุ่ม F5 ส่งค่าไบต์ใด และสามารถวาดเส้นใต้แบบมีสไตล์ได้หรือไม่ ncurses ซึ่งเป็นไลบรารีที่โปรแกรมส่วนติดต่อผู้ใช้แบบข้อความ (TUI) บน Linux เกือบทั้งหมดสร้างขึ้น จะอ่านคำอธิบายดังกล่าวเมื่อเริ่มต้นทำงาน โปรแกรมอย่าง 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 จะส่งเพียงชื่อ terminal เท่านั้นโดยไม่มีข้อมูลอื่น เมื่อไคลเอนต์ร้องขอ pseudo terminal ตัวแปร TERM จะถูกส่งไปพร้อมกับคำขอนั้น คู่มือของ OpenSSH ระบุไว้อย่างชัดเจนว่า "ตัวแปรสภาพแวดล้อม TERM จะถูกส่งเสมอเมื่อมีการร้องขอ pseudo-terminal เนื่องจากโปรโตคอลจำเป็นต้องใช้ข้อมูลนี้" ดังนั้น login shell บน VPS ของคุณจึงได้รับ TERM=xterm-ghostty, xterm-kitty หรือชื่อใดก็ตามที่โปรแกรมจำลอง terminal ของคุณใช้งานอยู่ ส่วนคำอธิบายรายละเอียดของชื่อนั้นจะยังคงอยู่บนแล็ปท็อปของคุณ ภายในฐานข้อมูลของเครื่องนั้น เซิร์ฟเวอร์ที่ถูกสร้างขึ้นก่อนที่โปรแกรมจำลอง terminal ของคุณจะถูกพัฒนาขึ้นมาจึงไม่รู้จักชื่อดังกล่าว ไม่มีสิ่งใดใน การเชื่อมต่อ SSH เอง ที่คัดลอกคำอธิบายความสามารถของ terminal ไปด้วย ซึ่งเป็นความตั้งใจในการออกแบบ: โปรโตคอลจะส่งเพียงชื่อ ไม่ใช่การส่งข้อมูลความสามารถทั้งหมดไปให้

คุณสามารถจำลองความล้มเหลวนี้บนเครื่องของคุณเองด้วยชื่อที่ไม่มีอยู่จริงได้ดังนี้:

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

สถานะการทำงานที่ส่งกลับมาคือ 3 ซึ่ง ncurses ระบุว่าเป็นประเภท terminal ที่ไม่รู้จักหรือฐานข้อมูลสูญหาย โปรแกรมที่ใช้ curses ทุกตัวจะทำการค้นหาในลักษณะเดียวกัน ดังนั้นชื่อที่หายไปเพียงชื่อเดียวจึงทำให้แต่ละโปรแกรมแสดงข้อความผิดพลาดต่างกัน ทั้งที่มีสาเหตุมาจากจุดเดียวกัน nano จะหยุดทำงานพร้อมกับข้อความ Error opening terminal: xterm-nosuchthing. ซึ่งเป็นความล้มเหลวมาตรฐานของ ncurses เมื่อไม่สามารถโหลดคำอธิบาย terminal ได้ในขณะเริ่มต้นโปรแกรม vim จะแสดงข้อความ E558: Terminal entry not found in terminfo ส่วน less จะแสดงข้อความ WARNING: terminal is not fully functional การที่โปรแกรมอ่านข้อความ (pager) ทำงานได้เพียงครึ่งเดียวในขณะที่โปรแกรมแก้ไขข้อความ (editor) ปฏิเสธที่จะเริ่มทำงาน อาจดูเหมือนเป็นบั๊กที่ไม่เกี่ยวข้องกัน แต่แท้จริงแล้วทั้งสองกรณีเกิดจากไฟล์ที่หายไปไฟล์เดียวกัน

ตำแหน่งที่ ncurses ใช้ค้นหา entry

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 คือหัวใจสำคัญ เนื่องจากไดเรกทอรี home ของคุณจะถูกค้นหาก่อนไดเรกทอรีระบบใดๆ ดังนั้นการมีไฟล์หนึ่งไฟล์ภายใต้ ~/.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 แบบพื้นฐาน ซึ่งรวมถึงสีแบบ 24-bit ที่ประกาศผ่านความสามารถ RGB และเส้นใต้แบบมีสไตล์ผ่าน Smulx โปรแกรมต่างๆ จะไม่สามารถมองเห็นความสามารถเหล่านั้นได้อีกต่อไป จึงจะถอยกลับไปใช้สีแบบ 256 สีและเส้นใต้แบบธรรมดา หน้าจอจะทำงานได้ตามปกติ เพียงแต่มีความสามารถน้อยกว่าเทอร์มินัลที่คุณเลือกใช้จริง

อย่าแก้ปัญหานี้ด้วยการเพิ่ม export TERM=xterm-256color ลงใน .bashrc บนเซิร์ฟเวอร์ ไฟล์นั้นจะทำงานทุกครั้งที่มีการเชื่อมต่อ รวมถึงการเชื่อมต่อจากเทอร์มินัลที่เซิร์ฟเวอร์รู้จักชื่ออยู่แล้ว ซึ่งจะทำให้เซสชันที่ใช้งานได้ปกติอยู่แล้วถูกลดประสิทธิภาพลง ให้คงการตั้งค่า override ไว้ที่ฝั่งไคลเอนต์ ซึ่งเป็นที่ที่คุณทราบว่ากำลังใช้โปรแกรมจำลองเทอร์มินัลตัวใดอยู่

วิธีแก้ที่ 2: ส่ง terminfo entry ของคุณไปยังเซิร์ฟเวอร์หนึ่งครั้ง

นี่เป็นวิธีแก้ไขที่ช่วยให้ emulator ของคุณยังคงทำงานได้ตามปกติ ให้ทำการ decompile entry ในเครื่องของคุณ ส่งผ่าน SSH แล้ว compile ที่ฝั่งปลายทาง:

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

infocmp -x จะแสดง entry สำหรับ TERM ปัจจุบันของคุณออกมาเป็น source text รวมถึง extended capabilities (ที่ผู้ใช้กำหนดเอง) tic -x จะทำการ compile source นั้นกลับเป็น binary description บนเซิร์ฟเวอร์ การใช้ -x ทั้งสองฝั่งมีความสำคัญ เพราะหากไม่มีมัน capabilities อย่างเช่น Smulx จะถูกตัดออกระหว่างการส่ง และคุณจะได้สำเนา terminal ของตัวเองในเวอร์ชันที่ถูกลดทอนประสิทธิภาพลง

tic จะเขียนลงในไดเรกทอรีระบบหากทำได้ และจะเปลี่ยนไปใช้ $HOME/.terminfo หากผู้ใช้ไม่มีสิทธิ์เขียนในไดเรกทอรีดังกล่าว บัญชีผู้ใช้ทั่วไปบน VPS จะใช้ไดเรกทอรี home ซึ่งเป็นสิ่งที่คุณต้องการ คุณสามารถระบุปลายทางที่ต้องการได้เช่นกัน:

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

เครื่องหมายคำพูดรอบ ~/.terminfo ไม่ใช่แค่การตกแต่ง ssh จะรวมคำสั่งเข้าเป็นสตริงเดียวแล้วส่งให้ remote shell ดังนั้นหากไม่ใส่เครื่องหมายคำพูด ~ จะถูกขยายโดย shell ในเครื่องของคุณ ก่อน จากนั้นคุณจะส่ง /home/yourname/.terminfo แบบ literal ไปยังเครื่องที่บัญชีของคุณอาจมีชื่อเรียกต่างออกไป tic จะล้มเหลวด้วยข้อผิดพลาดด้านสิทธิ์ หรือเขียนลงใน path ที่ ncurses ไม่เคยค้นหา ให้ใส่เครื่องหมายคำพูดครอบ tilde เพื่อให้ remote shell เป็นผู้ขยายค่าเอง

ล็อกอินและตรวจสอบ:

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

การที่ tput longname แสดงรายละเอียด terminal ของคุณหมายความว่าการค้นหาสำเร็จแล้ว และ ls จะแสดงไฟล์ที่ถูก compile ไว้ภายใต้ไดเรกทอรีย่อยที่ตั้งชื่อตามตัวอักษรตัวแรกของชื่อ terminal จากนั้นให้รัน top หรือ watch -n1 uptime ซึ่งจะวาดหน้าจอใหม่ผ่าน library เดียวกัน เพื่อยืนยันว่าโปรแกรม curses จริงๆ สามารถแสดงผลหน้าจอได้

สิ่งที่ต้องแลก: ต้องทำหนึ่งขั้นตอนต่อหนึ่งเซิร์ฟเวอร์ และ entry จะอยู่ใน home directory ของบัญชีนั้นบนเครื่องนั้นๆ หากคุณสร้าง VPS ใหม่ ข้อมูลนี้จะหายไป ให้ใส่คำสั่งนี้ไว้ในเครื่องมือที่คุณใช้สำหรับ การจัดเตรียมและจัดการเซิร์ฟเวอร์หลายเครื่องพร้อมกัน เพื่อให้ host ใหม่ที่สร้างขึ้นมามี entry ที่ถูก compile ไว้เรียบร้อยแล้ว

วิธีแก้ปัญหาที่ 3: ติดตั้งฐานข้อมูล terminfo แบบขยาย

หากคุณมีสิทธิ์ root และต้องการให้ชื่อเทอร์มินัลใช้งานได้กับทุกบัญชีผู้ใช้บนเครื่อง:

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

ncurses-term เก็บคำอธิบายเทอร์มินัลที่การติดตั้งพื้นฐานไม่ได้รวมไว้ วิธีนี้จะแก้ไขชื่อเทอร์มินัลสำหรับ root และผู้ใช้คนอื่นทุกคน ซึ่งวิธีที่ 2 ทำไม่ได้

วิธีนี้จะช่วยได้ก็ต่อเมื่อ entry ของเทอร์มินัลของคุณมีอยู่ใน ncurses release ที่ distribution ของคุณจัดเตรียมไว้ ดังนั้นควรตรวจสอบก่อนอย่าเพิ่งด่วนสรุป Ubuntu 24.04 มาพร้อมกับ ncurses-bin 6.4+20240113-1ubuntu2.1 (ข้อมูล ณ เดือนสิงหาคม 2026) entry ของ Ghostty ถูกเพิ่มเข้ามาใน ncurses 6.5-20241228 ซึ่งเป็นเวอร์ชันที่ใหม่กว่า ดังนั้น apt install ncurses-term บน Ubuntu 24.04 จึงไม่สามารถสร้าง entry xterm-ghostty ได้ไม่ว่าคุณจะรันคำสั่งกี่ครั้งก็ตาม tput -T <name> longname คือคำสั่งสำหรับตรวจสอบ: มันจะแสดงคำอธิบายออกมาหากมี entry นั้นอยู่ และจะแสดง unknown terminal พร้อม exit status 3 หากไม่มี

หากต้องการติดตั้งเพียง entry เดียวทั้งระบบแทนที่จะติดตั้งทั้งแพ็กเกจ ให้คัดลอกไฟล์ source มาแล้วคอมไพล์ด้วยสิทธิ์ 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 ซึ่งจะเชื่อมต่อและคัดลอก terminfo ของ kitty ไปยังโฮสต์ปลายทางโดยอัตโนมัติ เอกสารประกอบยังระบุรูปแบบการใช้งานด้วยตนเองคือ infocmp -a xterm-kitty | ssh myserver tic -x -o \~/.terminfo /dev/stdin โดยมีการใส่ escape หน้าเครื่องหมาย tilde ด้วยเหตุผลที่อธิบายไว้ข้างต้น Ghostty มีเอกสารประกอบสำหรับ infocmp -x xterm-ghostty | ssh YOUR-SERVER -- tic -x - และมาพร้อมกับ shell integration (ssh-env และ ssh-terminfo) รวมถึงคำสั่ง +ssh ที่ช่วยจัดการการแก้ไขปัญหาทั้งสองวิธีโดยอัตโนมัติ

เครื่องมือช่วยเหล่านี้จะรันคำสั่งเดียวกับที่คุณเพิ่งรันด้วยตนเอง การทราบรูปแบบการใช้งานด้วยตนเองยังคงมีความสำคัญ เนื่องจากเครื่องมือช่วยไม่สามารถทำงานได้เมื่อการเชื่อมต่อเริ่มต้นจากจุดอื่น บน jump host หรือภายในสคริปต์

เมื่อข้อผิดพลาดกลับมาอีกครั้ง

ภายใต้ sudo -i การล็อกอินเชลล์ในฐานะ root จะมี HOME=/root และ sudo จะเก็บ TERM ของคุณไว้ ปัจจุบัน ncurses จะค้นหาใน /root/.terminfo ซึ่งไม่มีรายการของคุณอยู่ จึงทำให้เกิดข้อผิดพลาดเฉพาะกับ root เท่านั้น ให้ยืนยันด้วย sudo -i env และอ่านบรรทัด HOME และ TERM ให้ติดตั้งรายการดังกล่าวลงในไดเรกทอรีของระบบ หรือวางสำเนาไว้ใน /root/.terminfo

ภายใน tmux หรือ screen โปรแกรมเหล่านี้จะกำหนด TERM ของตนเองสำหรับโปรแกรมที่ทำงานอยู่ภายใน ซึ่งโดยทั่วไปคือ screen-256color หรือ tmux-256color เซิร์ฟเวอร์รุ่นเก่าจะรู้จัก screen-256color แต่อาจไม่รู้จัก tmux-256color ส่งผลให้เชลล์ภายนอกทำงานได้ปกติในขณะที่ทุกอย่างภายในเซสชันล้มเหลว สาเหตุมาจากเรื่องเดียวกันแต่ใช้ชื่อเรียกต่างกัน ให้รัน tput -T tmux-256color longname บนเซิร์ฟเวอร์เพื่อดูว่ามีตัวเลือกใดในสองตัวนี้ เวิร์กเบนช์เทอร์มินัลที่สร้างขึ้นรอบ tmux จะซ่อนปัญหานี้ไว้จนกว่าจะถึงวันที่คุณเชื่อมต่อบนโฮสต์ที่ยังไม่ได้แก้ไข

บนเซิร์ฟเวอร์ใหม่ ~/.terminfo จะเป็นค่าเฉพาะสำหรับแต่ละบัญชีและแต่ละเครื่อง ดังนั้น VPS ที่สร้างใหม่จึงเริ่มต้นด้วยค่าว่างเปล่าอีกครั้ง

หน้าจอแสดงผลได้ แต่ปุ่มกดทำงานผิดพลาด หากการแสดงผลปกติแต่ปุ่ม Home, End หรือปุ่มฟังก์ชันกลับแสดงอักขระแปลกปลอม นั่นหมายความว่าชื่อที่ระบุได้ตรงกับรายการที่ไม่ตรงกับเทอร์มินัลของคุณ ลำดับการกดปุ่มมาจากรายการ terminfo เดียวกันกับความสามารถในการวาดหน้าจอ ดังนั้นรายการที่ใกล้เคียงจึงให้ผลลัพธ์การกดปุ่มที่ใกล้เคียงเท่านั้น ซึ่งมักเป็นผลมาจากการใช้การแก้ไขที่ 1 บนอีมูเลเตอร์ที่มีลำดับการกดปุ่มต่างจาก xterm การแก้ไขที่ 2 คือคำตอบ เพราะมีเพียงรายการจริงของอีมูเลเตอร์ของคุณเท่านั้นที่มีลำดับการกดปุ่มที่ถูกต้อง

FAQ

ทำไมฉันถึงเห็นข้อความ "unknown terminal type" ผ่าน SSH?

เพราะฐานข้อมูลที่เก็บข้อมูล terminal ของคุณอยู่บนเซิร์ฟเวอร์ โปรแกรมจำลอง terminal ของคุณจะติดตั้งคำอธิบายไว้บนเครื่องที่มันทำงานอยู่ ทำให้โปรแกรมในเครื่องเรียกใช้งานได้ทันทีโดยไม่ต้องตั้งค่าเพิ่ม แต่ SSH จะส่งเพียงค่าของ TERM เท่านั้น เนื่องจากโปรโตคอลจะส่งชื่อนี้ไปพร้อมกับคำขอ pseudo-terminal เมื่อ ncurses บนฝั่งเซิร์ฟเวอร์ค้นหาชื่อดังกล่าวในฐานข้อมูลแล้วไม่พบ ทำให้ initscr ล้มเหลวและโปรแกรมหยุดทำงาน

ฉันสามารถแก้ไขปัญหานี้โดยไม่ต้องมีสิทธิ์ root บนเซิร์ฟเวอร์ได้หรือไม่?

ได้ ncurses จะค้นหาใน $HOME/.terminfo ก่อนไดเรกทอรีระบบเสมอ ดังนั้นการเพิ่มข้อมูลไว้ที่นั่นจึงเพียงพอสำหรับบัญชีผู้ใช้ของคุณ ให้รัน infocmp -x | ssh user@host -- tic -x - หนึ่งครั้งต่อเซิร์ฟเวอร์ tic จะเขียนข้อมูลลงใน home directory ของคุณเมื่อไม่สามารถเขียนลงใน path ของระบบได้ ซึ่งเป็นกรณีปกติสำหรับบัญชีผู้ใช้ทั่วไป ให้ล็อกอินใหม่แล้วรัน tput longname เพื่อยืนยันว่าการค้นหาทำงานได้ถูกต้องแล้ว

ฉันจะเสียอะไรไปบ้างหากตั้งค่า TERM=xterm-256color สำหรับโฮสต์หนึ่ง?

คุณจะเสียความสามารถทั้งหมดที่โปรแกรมจำลอง terminal ของคุณระบุไว้เกินกว่ารายการ xterm-256color เช่น การแสดงผลสี 24-bit ผ่าน RGB และการขีดเส้นใต้แบบมีสไตล์ผ่าน Smulx โปรแกรมจะไม่สามารถมองเห็นความสามารถเหล่านั้นและจะใช้ค่าสำรองที่ใกล้เคียงที่สุดแทน ลำดับของปุ่มฟังก์ชัน (function-key) อาจแตกต่างจาก terminal จริงของคุณ ควรตั้งค่านี้ที่ฝั่งไคลเอนต์ใน ~/.ssh/config แทนการตั้งค่าใน .bashrc บนเซิร์ฟเวอร์ เพราะจะทำให้เซสชันจาก terminal ที่ใช้งานได้ปกติอยู่แล้วถูกลดระดับความสามารถลง

ทำไมข้อผิดพลาดถึงกลับมาอีกหลังจาก sudo -i?

sudo -i จะเริ่ม login shell ในฐานะ root ด้วย HOME=/root โดยยังคงค่า TERM ของคุณไว้ ncurses จึงไปค้นหาใน /root/.terminfo แทนที่จะเป็น home directory ของคุณและไม่พบข้อมูล ทำให้ root พบข้อผิดพลาดเดิมที่คุณแก้ไขไปแล้ว ให้รัน sudo -i env และตรวจสอบบรรทัด HOME และ TERM จากนั้นคอมไพล์รายการข้อมูลลงในไดเรกทอรีระบบด้วย sudo tic -x -o /usr/share/terminfo หรือคัดลอกลงใน /root/.terminfo

apt install ncurses-term แก้ไขปัญหาได้เสมอไปหรือไม่?

ไม่ เพราะมันจะเพิ่มเฉพาะรายการที่มีอยู่ใน ncurses release ที่แพ็กเกจของดิสทริบิวชันของคุณจัดเตรียมไว้เท่านั้น Ubuntu 24.04 มาพร้อมกับ ncurses 6.4 (ncurses-bin 6.4+20240113-1ubuntu2.1 ณ เดือนสิงหาคม 2026) ในขณะที่รายการของ Ghostty ถูกเพิ่มเข้ามาใน ncurses 6.5-20241228 ดังนั้นแพ็กเกจดังกล่าวจึงไม่มีข้อมูลนี้ ให้ตรวจสอบด้วย tput -T <name> longname ก่อนที่จะพึ่งพาแพ็กเกจ และให้ติดตั้งรายการข้อมูลด้วยตนเองหากการตรวจสอบยังคงรายงานว่าเป็น unknown terminal

#terminfo#ssh#ncurses#tput#terminal