วิธีแก้ปัญหา unknown terminal type เมื่อใช้งานผ่าน SSH
พบปัญหา unknown terminal type ขณะเชื่อมต่อ SSH ใช่หรือไม่ สาเหตุเกิดจากเซิร์ฟเวอร์ไม่รู้จักค่า TERM ของคุณ แก้ไขได้ง่ายโดยคอมไพล์ terminfo ลงในโฮมไดเรกทอรีโดยไม่ต้องใช้สิทธิ์ root
ความหมายของ "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 -20tput longname จะพิมพ์คำอธิบายที่มนุษย์อ่านเข้าใจของสิ่งที่ TERM ระบุไว้ สำหรับ xterm-256color มันจะพิมพ์ว่า:
xterm with 256 colorsinfocmp -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) ดังนี้:
$TERMINFOหากมีการตั้งค่าไว้ ระบบจะค้นหาเฉพาะในไดเรกทอรีนั้นเท่านั้น$HOME/.terminfo- ไดเรกทอรีทุกแห่งที่ระบุไว้ใน
$TERMINFO_DIRS - ตำแหน่งที่คอมไพล์ไว้ภายใน ซึ่งบน 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-256colorSetEnv จำเป็นต้องใช้ 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 longnamencurses-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