ถ้าฉันทำ:
sudo cat /etc/resolv.conf | less
มันจะให้รหัสผ่านแก่ฉันแม้ว่าจะน้อยกว่า (สันนิษฐาน) ใช้ stdin รหัสผ่านที่แสดงพร้อมท์ของ fd คืออะไรและมันรับอินพุตกลับมาได้อย่างไร?
ถ้าฉันทำ:
sudo cat /etc/resolv.conf | less
มันจะให้รหัสผ่านแก่ฉันแม้ว่าจะน้อยกว่า (สันนิษฐาน) ใช้ stdin รหัสผ่านที่แสดงพร้อมท์ของ fd คืออะไรและมันรับอินพุตกลับมาได้อย่างไร?
คำตอบ:
ที่จริงแล้วการร้องขอทั่วไปของsudoไม่ได้อ่านรหัสผ่านstdinเลย แต่sudoจะเข้าถึงเทอร์มินัลการควบคุมโดยตรง ( ttyหรือptyผ่าน/dev/ttyไฟล์พิเศษ) และส่งเอาต์พุตพร้อมต์และอ่านอักขระโดยตรง สามารถดูได้ในtgetpass.cไฟล์ในsudoซอร์ส
มีอีกสองสามสถานการณ์:
askpassระบุโปรแกรมเช่นใน-Aพารามิเตอร์โปรแกรมนั้นจะถูกเรียกใช้sudoอ่านจากstdinเช่นกับ-Sธง - stderrและยังจะเขียนพรอมต์ นี่เป็นกรณีที่คำตอบของ MadHatterใช้ttyสามารถใช้ได้
visiblepwตั้งค่าสถานะsudoers) sudoจะรายงานข้อผิดพลาด:no tty present and no askpass program specifiedsudoจะกลับไปใช้stdinและstderrแม้ว่าจะไม่ได้ขอเฉพาะ คำตอบของ MadHatter ก็จะใช้ที่นี่เช่นกันsudo catไพพ์เชื่อมต่อstdout ของกับlessstdin ดังนั้นsudo catstdin ของจึงไม่ได้รับผลกระทบและสามารถรับรหัสผ่านได้
สำหรับพรอมต์มันจะออกไปบนsudo catstderr ของ; ใน bash ให้ลองเปลี่ยนเส้นทางพร้อมกับ stdout โดยใช้
sudo cat /etc/resolv.conf |& less
และดูว่าการตอบสนองแตกต่างกันอย่างไร
sudostdin นั้นยังคงเชื่อมต่อกับเทอร์มินัลด้วยคำสั่งตัวอย่างซึ่งไม่เกี่ยวข้องโดยตรงกับวิธีที่ได้รับรหัสผ่าน: โดยค่าเริ่มต้นsudoจะไม่ขอรหัสผ่านผ่าน stdin และจะแสดงพรอมต์ผ่านทางstderrคุณ สามารถลอง2>/dev/nullยืนยันได้ว่า ให้sudoเข้าถึง tty โดยตรง