ลบรหัสผ่านที่ป้อนในพรอมต์รหัสผ่านที่ซ่อนอยู่ (Linux) ด้วยทางลัด


106

มีวิธีลบอักขระทั้งหมดที่ฉันป้อนในพรอมต์รหัสผ่านที่ซ่อนอยู่ใน Linux หรือไม่ ตัวอย่างเช่นเมื่อฉัน SSH ไปยังเซิร์ฟเวอร์มันจะถามรหัสผ่านของฉันในกรณีที่รหัสที่ป้อนไม่แสดง:

$ ssh root@somehost
root@somehost's password:

มีวิธีลบข้อความที่ฉันป้อนทั้งหมดโดยไม่ต้องกด backspace เป็นระยะเวลาที่ไม่รู้จักหรือไม่? เมื่อฉันคิดว่าฉันป้อนบางอย่างผิดปกติฉันต้องการเริ่มต้นใหม่และการกดแบ็คสเปซสักครู่นั้นน่ารำคาญ ฉันพยายามEsc, เพื่อหวังเลือกข้อความทั้งหมดและCtrlA ยกเลิกคำสั่งทั้งหมดและฉันต้องส่งคำสั่งอีกครั้งเพื่อลองอีกครั้ง นี่เป็นวิธีที่ดีที่สุดและเร็วที่สุด แต่ก็ยังไม่พอใจ ส่วนแทรกไม่ทำงานในเปลือกของฉันเช่นกันHomeCtrlC


7
สำหรับ Ctrl + A ในเทอร์มินัลมักจะหมายถึง "go to start of line" ชุดปุ่มที่ใช้ในเครื่อง (โดยเฉพาะอย่างยิ่งทุบตี) มักจะเข้าใกล้ Emacs มากกว่า Windows
คะแนน _ ต่ำกว่า

18
Sshing เป็น root โดยทั่วไปถือว่าเป็นการปฏิบัติที่แย่มาก
Sam

ในการลบตัวอักษรออกจากหน้าจอคุณจะต้องใช้ลำดับการควบคุมเคอร์เซอร์ (หากเทอร์มินัลของคุณรองรับ) โดยเรียกใช้sshจากสคริปต์คุณสามารถวิเคราะห์สตริงพารามิเตอร์ก่อนที่จะเรียกใช้
AFH

4
โปรดใส่ใจสิ่งที่ @Sam บอก คุณควรปิดการใช้งานการเข้าสู่ระบบรูททุกที่ เข้าสู่ระบบในฐานะผู้ใช้ปกติด้วยรหัสผ่านที่ซับซ้อนจากนั้นsuกลายเป็นรูท ขั้นตอนต่อไปคือการปิดใช้งานรูปแบบการรับรองความถูกต้องด้วยรหัสผ่านใน SSH และใช้คีย์สำหรับเข้าสู่ระบบ
kostix

@kostix ฉันค่อนข้างแน่ใจว่าการปิดใช้งานรหัสผ่านควรเป็นขั้นตอนแรก หากคุณใช้รหัสผ่านดังนั้นด้วย su และ root ที่ถูกปิดใช้งานมันเป็นเพียงเรื่องของการป้อนรหัสผ่านที่ผู้โจมตีคาดเดาครั้งที่สองหลังจากเข้าสู่ระบบดังนั้นคุณจะได้รับบางอย่างหากชื่อผู้ใช้เดายาก (ซึ่งมักจะไม่ใช่ ฉันถือว่าไม่มีสถิติ) และหากไม่มีการเข้าสู่ระบบรหัสผ่านมันจะเพิ่มความลับที่สองรหัสผ่าน แต่มันมีค่าน้อยกว่าคีย์ส่วนตัวซึ่งเป็นความลับอีกต่อไป
ไม่มีใคร

คำตอบ:


163

คุณสามารถลบรหัสผ่านที่พิมพ์ทั้งหมดที่มี+CtrlU


6
นอกจากนี้ยังใช้งานได้ในหน้าจอแจ้งเตือนปกติด้วย
MoonRunestar

35
สำหรับการอ้างอิงนี่คือการเชื่อมโยงคีย์เริ่มต้นใน "โหมด emacs" ของ readline unix-line-discardซึ่งอธิบายว่า "ฆ่าย้อนหลังจากเคอร์เซอร์ไปจนถึงจุดเริ่มต้นของบรรทัดปัจจุบัน" Ref: cnswww.cns.cwru.edu/php/chet/readline/rluserman.html#SEC17 GNU readline คือไลบรารีอินพุตที่ใช้โดยเชลล์ส่วนใหญ่และโปรแกรมเชิงโต้ตอบอื่น ๆ อีกมากมาย (แต่ไม่ได้สร้างไว้ใน tty ดังนั้นสิ่งนี้จะไม่ ทำงานได้ทุกที่ )
IMSoP

22
@IMSoP อย่างไรก็ตาม Ctrl-U เองถูกสร้างขึ้นใน tty (เป็นอักขระเริ่มต้นสำหรับstty killฟังก์ชั่น) ซึ่งเป็นสาเหตุที่มันทำงานกับพร้อมท์รหัสผ่าน ssh
Random832

5
BTW, Ctrl + K เทียบเท่ากับการลบจากเคอร์เซอร์ไปที่ท้ายบรรทัด
wjandrea

2
@DennisJaheruddin: นั่นเป็นไปไม่ได้ ssh ไม่ได้ใช้ readline เพื่อให้การแก้ไขบรรทัด ดูคำตอบของฉัน
Peter Cordes

14

ซึ่งแตกต่างจากbash, ssh's สอบถามรหัสผ่านไม่ได้ใช้ห้องสมุดขั้วอินพุตใด ๆ readlineเป็นพิเศษเช่น คุณลักษณะการแก้ไขบรรทัดเป็นเพียงคุณสมบัติการแก้ไขบรรทัดพื้นฐาน POSIX TTY

ดังนั้นคุณมี POSIX TTY ในโหมด "สุก" (ไม่ใช่แบบดิบ), โหมดมาตรฐานหรือที่รู้จักและการแก้ไขบรรทัดเดียวที่มีให้คือสิ่งที่เคอร์เนลจัดทำ ดูและแจ้งให้ทราบว่าstty(1)
kill = ^Uนี่คือตำแหน่งที่อักขระ backspace ถูกกำหนด ( erase = ^?) การลบคำ ( ^W) สะดวกเมื่อคุณไม่ได้พิมพ์คนตาบอด

lnext = ^V หมายความว่าคุณสามารถพิมพ์ control-v ตามด้วยอะไรก็ได้ (รวมถึง control-c) เพื่อรับตัวอักษร -c

การแก้ปัญหาสิ่งที่คุณกำลังพยายามที่จะทำสุ่มสี่สุ่มห้าทำงานcatหรือcat > /dev/nullในสถานีของคุณ พิมพ์รายการแล้วดูว่าอะไรทำงานได้บ้างและไม่ต้องแก้ไข


readline(ใช้โดยbash) อ่านอักขระดิบและทำการแก้ไขบรรทัดในพื้นที่ผู้ใช้ การเชื่อมโยงเริ่มต้นนั้นเข้ากันได้กับอักขระควบคุม TTY ที่เป็นค่าเริ่มต้นสำหรับชุดย่อยของคุณลักษณะการแก้ไขที่ทั้งสองมีให้

readline ก้าวไปไกลกว่าการแก้ไขบรรทัดอย่างง่าย ๆ ของ TTY ธรรมดา (เช่น TTY สามารถลบตัวอักษรที่ท้ายบรรทัดเพื่อให้ไม่มี^aและdeleteหรือลูกศรซ้าย / ขวา)

เมื่อbashเรียกใช้คำสั่งในเบื้องหน้าจะทำให้ TTY เข้าสู่โหมด canonical ก่อน (เพราะนั่นคือค่าเริ่มต้น) ดังนั้นการเรียกใช้stty -a(โดยไม่มีการเปลี่ยนเส้นทาง) จะเห็นเทอร์มินัลของตัวเองในโหมด canonical เสมอ แต่ถ้าคุณเปลี่ยนเส้นทางการป้อนข้อมูลจาก TTY อื่น ๆ ที่bashทำงานอยู่คุณสามารถดูว่าการตั้งค่าเทอร์มินัล bash + readline ถูกนำไปใช้อย่างไร เช่นstty -a < /dev/pts/12แสดงให้เห็นถึง-icanonโหมด raw เพราะฉันมีการbashทำงานบนสถานีนั้น (ฉันสลับไปที่แท็บอื่นแล้ววิ่งttyจากนั้นใช้เส้นทางของไฟล์อุปกรณ์นั้นจากเทอร์มินัลแรก) ถ้าฉันวิ่งเข้าไปcatในเทอร์มินัลอื่นนั้นฉันจะเห็นicanonโหมด canonical

ที่เกี่ยวข้อง: TTY demystified

https://www.gnu.org/software/libc/manual/html_node/Canonical-or-Not.html

https://en.wikipedia.org/wiki/POSIX_terminal_interface


คุณสามารถพิมพ์ 'stty' เพื่อดูการตั้งค่าปัจจุบันทั้งหมด การใช้ 'stty rows ##' หรือ 'stty cols ##' จะช่วยให้คุณเปลี่ยนได้ทันทีว่ามีกี่แถวหรือคอลัมน์ที่หน้าต่างเทอร์มินัลว่าง ซึ่งมีประโยชน์อย่างยิ่งเมื่อคุณทำงานในหน้าต่างในหน้าต่างผ่าน VNC ซึ่งไม่จำเป็นต้องจับว่าหน้าต่างภายนอกของคุณใหญ่แค่ไหน โดยทั่วไปคุณสามารถกำหนดพื้นที่ใช้งานของคุณให้เล็กกว่าหน้าต่างที่อยู่ในนั้นและไม่ต้องเลื่อนดู การอนุญาตให้ VI และสิ่งอื่น ๆ ยังคงทำงานได้อย่างถูกต้อง นอกจากนี้ยังสามารถทำการแมปย้อนกลับและลบทันที
Rowan Hawkins

@RowanHawkins: ย่อหน้าสุดท้ายของฉันถูกแก้ไขไม่ดี แก้ไขแล้ว ฉันพยายามทำให้จุดที่โดยการเปลี่ยนเส้นทางจาก tty อื่นคุณสามารถดูการsttyตั้งค่า / ioctl ที่ bash + readline ตัวเองได้นำไปใช้ในโหมดดิบ (และความจริงที่ว่ามันอยู่ในโหมดดิบเลยโดยที่ตัวละครพิเศษส่วนใหญ่ไม่ได้ใช้)
Peter Cordes
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.