Backspace, Tab ไม่ทำงานในเทอร์มินัล (ใช้ ssh)


37

เมื่อฉันเข้าสู่เครื่องอื่นด้วย Debian ด้วยบัญชีของฉัน (ด้วยสิทธิ์ sudo) คีย์ backspace ของฉันสร้างสัญลักษณ์บางอย่างที่น่าอึดอัดใจในการกด นอกจากนี้Tabและdelปุ่มไม่ทำงานมากเกินไป

ในทางกลับกันฉันยังมีบัญชีอื่นในเครื่องเดียวกัน & เมื่อฉันผ่านบัญชีนี้เทอร์มินัลของมันทำงานได้อย่างสมบูรณ์แบบ ฉันไม่สามารถเข้าใจได้ว่าทำไมสิ่งนี้จึงเกิดขึ้น

คำตอบ:


37

ฉันเคยเห็นปัญหาดังกล่าวมาก่อน

ใช้ backspace ตัวอย่างเช่นรีโมตโฮสต์ต้องการอักขระบางตัวที่จะใช้เป็น "ลบ / แบ็คสเปซ" ในขณะที่คุณกด backspace ในเทอร์มินัลโปรแกรมเทอร์มินัลจะส่งอักขระบางตัวไปยังรีโมตโฮสต์ อักขระที่ส่งโดยโปรแกรมเทอร์มินัลคุณจะพบปัญหานี้ ดังนั้นการแก้ไขอย่างรวดเร็วมีดังนี้:

  1. รันคำสั่ง#stty -aในรีโมตโฮสต์และค้นหาสิ่งที่คาดว่าจะเป็นรหัสลบในเอาต์พุต erase=^?พูด
  2. ในเทอร์มินัลพิมพ์Ctrlvและกด backspace ของคุณ คุณจะเห็นว่าโค้ดใดถูกส่งเป็น "ลบ" ^Hบอกว่ามันเป็น
  3. #stty erase ^Hในพื้นที่ห่างไกลให้เรียกใช้
    (หมายเหตุ: ใช้Ctrlv+ Backspaceอย่าพิมพ์ ^ ด้วยตนเอง)

คุณสามารถแก้ไขปัญหาแท็บได้เช่นเดียวกับด้านบน


ตัวอักษร Backspace ของฉันคือสัญลักษณ์พิเศษบางอย่างเช่นสามเหลี่ยมคว่ำ ดังนั้นมันจึงไม่ทำงาน
gopi1410

1
ความคิดเห็นง่ายๆนี้เป็นทางออกที่ดีที่สุดที่ฉันเคยเห็น มันให้ความรู้สึกเหมือนกระบอง แต่ใช้งานได้
เปาโล Matos

สิ่งนี้ได้ผลสำหรับฉัน! สิ่งที่ฉันไม่เข้าใจว่าทำไมเปลือกของฉันจัดการ backspace ตามที่คาดไว้ แต่การอ่านจาก stdin ในแอปของฉันไม่ได้ การดำเนินการเปลี่ยนแปลงที่คุณแนะนำจะทำให้ Backspace ทำงานได้ทั้งสองอย่าง ความเข้าใจของฉันคือว่าเชลล์จัดการบัฟเฟอร์ stdin ดังนั้นการจัดการ backspace ไม่ควรเหมือนกันสำหรับทั้งเชลล์และแอป
ซามูเอล

1
จะทำอย่างไรถ้าไม่มีรหัสถูกส่งเลย? Ctrlv + backspace ไม่ได้สร้างอะไรเลย ...
Manfredo

สำหรับฉันโค้ด backspace เหมือนกับstty -aเอาต์พุต แต่ยังไม่สามารถใช้งานได้
Matej J

35

ข้างโซลูชัน "stty" คุณอาจลองใช้โซลูชัน "TERM"

คุณส่งไปยัง Debian ของคุณจากเทอร์มินัลบางตัว (putty, solaris dterm, debain xterm, you-name-it), termninal ประกาศความสามารถนี้ (ซึ่งรวมถึงคีย์เช่น Backspace และ Tab) ผ่านตัวแปรสภาพแวดล้อม TERM

ดังนั้นหลังจาก ssh ถึง unix host (ไม่ขึ้นอยู่กับ debian มันหรือ host อื่น ๆ ) ตั้งค่าตัวแปร TERM ตามเทอร์มินัลของคุณ พิจารณาว่าคุณใช้ bash เป็น shell และ vt100 เป็น terminal:

export TERM=vt100

ps: ระยะเวลาควรประกาศผ่าน ssh โดยอัตโนมัติ แต่ในบางสถานการณ์เวทมนตร์นี้ล้มเหลว


ยังไม่สามารถใช้งานได้ :(
gopi1410

คุณใช้เทอร์มินัลอะไร และคุณลองใช้ TERM ในมูลค่าเท่าใด
พอล

ฉันลอง vt100 ฉันจะรู้มูลค่าของ TERM ได้อย่างไร ฉันพยายาม ssh จาก cygwin (ใน windows) ถึง Debian หากมีปัญหากับ cygwin ฉันก็ลองจาก terminal ubuntu แต่ปัญหาเดียวกัน
gopi1410

ไม่แน่ใจว่า cygwin มีเทอร์มินัลอีมูเลชันดีเท่าที่ฉันรู้ไซโกวินใช้คอนโซล windows ปกติซึ่งไม่มีเทอร์มินัลอีมูเลชัน (อาจผิด) จาก Ubuntu ทุกคนควรใช้งานได้ดี เกิดข้อผิดพลาดกับเชลล์หรือไลบรารี termcap บนเดเบียน เข้าสู่ระบบจาก Ubuntu และส่งคำสั่งให้ฉัน: 1. echo $ TERM 2. stty -a
paul

2
แม้ว่าสิ่งนี้จะไม่ช่วยฉันโดยตรงเนื่องจาก TERM ถูกตั้งค่าอย่างถูกต้อง แต่ก็ช่วยระบุปัญหาได้ ฉันไม่มีรายการ terminfo สำหรับเทอร์มินัลของฉัน ฉันใช้ urxvt และบน arch คุณจำเป็นต้องติดตั้ง rxvt-unicode-terminfo เพื่อแก้ไขปัญหานี้โดยเฉพาะ
Xandaros

15

นี่เป็นเพราะเชลล์เริ่มต้นของคุณคือshการใช้bashเพียงแค่เรียกใช้bashจากเชลล์ของคุณ

bash

ในการตั้งbashเป็นเปลือกเริ่มต้นของคุณ:

chsh -s /bin/bash 

หรือ

sudo chsh -s /bin/bash yourusername

2
อันนี้คงไว้สำหรับฉัน ไม่ว่าจะมองเปลือกล็อกอินของฉัน!
James Pack

2
ฉันเห็นปัญหานี้ แต่เปลือกของฉันก็ทุบตี
fraxture

6

เปลือกของคุณอาจถูกตั้งค่าเป็น/bin/shแทนที่จะ/bin/bash


1
เกี่ยวข้องกับคำตอบนี้: unix.stackexchange.com/questions/50542/…
ซามูเอล


สิ่งนี้จะเป็นประโยชน์มากขึ้นหากอธิบายเพิ่มเติมเล็กน้อยและวิธีการเปลี่ยนแปลง แต่มันเป็นปัญหาที่ฉันมี ขอบคุณ @Tom สำหรับลิงก์ของคุณที่แก้ไขปัญหาให้ฉัน
Jake

นี่คือเหตุผลในกรณีของฉัน .. สำหรับผู้ใช้นั้น ไม่มีการนิยามเชลล์/etc/passwdเมื่อฉันเพิ่มลง:/bin/bashในบรรทัดของเขามันทำงานได้ คุณสามารถค้นหาว่าเชลล์ใช้งานกับอะไรecho $0
MSpreij

6

ฉันมักจะใช้สิ่งนี้เพื่อแก้ไขการส่งออกตัวละครที่ขี้ขลาดใน terminal ของฉัน มันรีเซ็ตอักขระพิเศษทั้งหมดเป็นค่าเริ่มต้น

stty sane

จากหน้าคน stty:

เช่นเดียวกับ cread -ignbrk brkint -inlcr -igncr icrnl -iutf8 -ixoff -iuclc -ianylon-echlc eixl-eccll-eucll-echlon-onlcr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 -xcase -tostop -echoprt echoctl echoke อักขระพิเศษทั้งหมดเป็นค่าดีฟอลต์


2

ด้านบนของคำตอบของพอลหากคุณต้องการรักษาความสามารถในการส่งออกที่มีสีสันคุณสามารถใช้ xterm-88color

echo 'export TERM=xterm-88color' >> ~/.bashrc
source ~/.bashrc

1
toe -aแสดงรายการประเภทเทอร์มินัลที่สนับสนุน ... xterm-88colorไม่ได้เป็นเพียงตัวเลือกเดียวและในความเป็นจริงอาจไม่สามารถใช้ได้ในบางระบบ
0xC0000022L
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.