ถ้าฉันทำ:
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 specified
sudo
จะกลับไปใช้stdin
และstderr
แม้ว่าจะไม่ได้ขอเฉพาะ คำตอบของ MadHatter ก็จะใช้ที่นี่เช่นกันsudo cat
ไพพ์เชื่อมต่อstdout ของกับless
stdin ดังนั้นsudo cat
stdin ของจึงไม่ได้รับผลกระทบและสามารถรับรหัสผ่านได้
สำหรับพรอมต์มันจะออกไปบนsudo cat
stderr ของ; ใน bash ให้ลองเปลี่ยนเส้นทางพร้อมกับ stdout โดยใช้
sudo cat /etc/resolv.conf |& less
และดูว่าการตอบสนองแตกต่างกันอย่างไร
sudo
stdin นั้นยังคงเชื่อมต่อกับเทอร์มินัลด้วยคำสั่งตัวอย่างซึ่งไม่เกี่ยวข้องโดยตรงกับวิธีที่ได้รับรหัสผ่าน: โดยค่าเริ่มต้นsudo
จะไม่ขอรหัสผ่านผ่าน stdin และจะแสดงพรอมต์ผ่านทางstderr
คุณ สามารถลอง2>/dev/null
ยืนยันได้ว่า ให้sudo
เข้าถึง tty โดยตรง