ล้าง / ลบรหัสผ่านที่มองไม่เห็นที่พิมพ์ผิดบนเชลล์ / เทอร์มินัลใน Linux


75

สิ่งหนึ่งที่ทำให้ฉันรำคาญใช้ terminal ลินุกซ์คือเมื่อฉันต้องพิมพ์รหัสผ่านที่ซ่อนตัวเช่นเมื่อคุณเรียกใช้SSH บางครั้งฉันพิมพ์ตัวอักษรอย่างน้อยหนึ่งตัวจากนั้นฉันต้องกดปุ่ม Backspace สองสามครั้งเพื่อให้แน่ใจว่าฉันลบทุกอย่างเพื่อเริ่มต้นใหม่อีกครั้ง

ฉันรู้ว่านี่ไม่ใช่เรื่องใหญ่ แต่เนื่องจากในวันอื่น ๆ ฉันพบว่าการกด CTRL + L "ล้าง" เทอร์มินัลฉันสงสัยว่ามีวิธีล้าง / ลบรหัสผ่านที่มองไม่เห็นโดยไม่ต้องพึ่งพา backspace หรือกดปุ่ม Enter เพื่อ ลองอีกครั้ง.

คำตอบ:


70

คุณเพียงแค่ต้องพิมพ์+ctrlu

สนุก =)


ไม่เคยรู้เรื่องนี้เลย โดยปกติฉันจะแค่ ctrl + C จากคำสั่งกลางที่ไม่ต้องการพิมพ์
Spidey

10
ดูคำอธิบายของฉันในคำตอบอื่น ๆ หากคุณต้องการที่จะรู้ว่าสิ่งที่เกิดขึ้น
จิมปารีส

ฉันใช้ Ctrl + W และก็โอเคกับมัน
shabunc

108

ฉันรู้ว่านี่ได้รับคำตอบแล้ว แต่คำตอบไม่ได้อธิบายว่าเกิดอะไรขึ้น

ตัวอักษรเช่นCtrl+ Lจะถูกจัดการโดยแอพลิเคชัน ในกรณีของการป้อนข้อมูลเข้าสู่เปลือกเช่นbashมันล้างหน้าจอ แอปพลิเคชั่นบางตัวเช่นemacsใช้เพื่อวาดหน้าจอและ / หรือป้อนเคอร์เซอร์อีกครั้ง

ตัวอักษรเช่นCtrl+ Uที่พรอมต์รหัสผ่านจะถูกจัดการโดยสายวินัย TTY พวกมันจะทำงานเมื่อใดก็ตามที่เทอร์มินัลอินพุตอยู่ในโหมดแก้ไขบรรทัด "canonical" ซึ่งเป็นโหมดที่โปรแกรมของคุณอยู่ในขณะที่คุณป้อนรหัสผ่าน ในโหมดนี้เป็นเคอร์เนล Linux ที่ตีความอักขระเหล่านี้ คุณสามารถดูว่าฟังก์ชั่นใดได้รับการกำหนดให้กับคีย์ใดในผลลัพธ์ของstty -a:

speed 38400 baud; rows 45; columns 128; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S;
susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;
-parenb -parodd cs8 -hupcl -cstopb cread -clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany -imaxbel iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke

ที่นี่คุณจะเห็นว่าCtrl+ Uเชื่อมโยงกับkillซึ่ง (ตามหน้า man stty ) จะ "ลบบรรทัดปัจจุบัน" คุณสามารถใช้sttyเพื่อเปลี่ยนการแมปนี้:

stty kill ^E   # make ctrl-e erase the line

หน้านี้มีข้อมูลที่ดีมากมายเกี่ยวกับเลเยอร์ TTY หากคุณสนใจ


หากสิ่งต่าง ๆ ไม่สับสนพอ: เมื่อพร้อมที่จะโต้ตอบbashคุณจะไม่ได้อยู่ในโหมดการแก้ไขบรรทัด "canonical" แต่bashจะรับตัวละครแต่ละตัวโดยตรงในขณะที่คุณพิมพ์และตีความลำดับการควบคุมเองผ่านไลบรารีreadline ไลบรารีนี้จะให้เกียรติการแมปที่คุณตั้งค่าไว้ในอุปกรณ์เทอร์มินัลของคุณดังนั้นคุณยังสามารถใช้sttyเพื่อเปลี่ยนพวกเขาได้ หรือคุณสามารถปรับแต่งได้อย่างอิสระทั้งในbashและโปรแกรมที่ใช้ readline อื่น ๆ โดยการตั้งค่าunix-line-discardคุณสมบัติภายใน~/.inputrcไฟล์ของคุณ ดูหน้าbash manสำหรับข้อมูลเพิ่มเติม

เมื่อคุณเรียกใช้โปรแกรมbashให้stty icanonเปิดใช้งานโหมดแก้ไขบรรทัด canonical ( ) อีกครั้งหากเปิดใช้งานมาก่อนแล้วจึงปิดใช้งานอีกครั้งเมื่อโปรแกรมเสร็จสิ้น ( stty -icanon)


ขอบคุณที่ช่วยฉันติดตามและแก้ไขปัญหา tilda / yay 'ลบ'!
โทมัสเฮสส์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.