ทำไมการป้อนรหัสผ่านจึงใช้งานได้ในคำสั่ง piped


25

ถ้าฉันทำ:

sudo cat /etc/resolv.conf | less

มันจะให้รหัสผ่านแก่ฉันแม้ว่าจะน้อยกว่า (สันนิษฐาน) ใช้ stdin รหัสผ่านที่แสดงพร้อมท์ของ fd คืออะไรและมันรับอินพุตกลับมาได้อย่างไร?

คำตอบ:


48

ที่จริงแล้วการร้องขอทั่วไปของsudoไม่ได้อ่านรหัสผ่านstdinเลย แต่sudoจะเข้าถึงเทอร์มินัลการควบคุมโดยตรง ( ttyหรือptyผ่าน/dev/ttyไฟล์พิเศษ) และส่งเอาต์พุตพร้อมต์และอ่านอักขระโดยตรง สามารถดูได้ในtgetpass.cไฟล์ในsudoซอร์ส

มีอีกสองสามสถานการณ์:

  • หากaskpassระบุโปรแกรมเช่นใน-Aพารามิเตอร์โปรแกรมนั้นจะถูกเรียกใช้
  • มิฉะนั้นถ้าคุณโดยเฉพาะขอsudoอ่านจากstdinเช่นกับ-Sธง - stderrและยังจะเขียนพรอมต์ นี่เป็นกรณีที่คำตอบของ MadHatterใช้
  • มิฉะนั้นหากไม่มีttyสามารถใช้ได้
    • หากรหัสผ่าน echo ถูกปิดใช้งาน (โดยค่าเริ่มต้นถูกควบคุมโดยการvisiblepwตั้งค่าสถานะsudoers) sudoจะรายงานข้อผิดพลาด:no tty present and no askpass program specified
    • มิฉะนั้นsudoจะกลับไปใช้stdinและstderrแม้ว่าจะไม่ได้ขอเฉพาะ คำตอบของ MadHatter ก็จะใช้ที่นี่เช่นกัน

10

sudo catไพพ์เชื่อมต่อstdout ของกับlessstdin ดังนั้นsudo catstdin ของจึงไม่ได้รับผลกระทบและสามารถรับรหัสผ่านได้

สำหรับพรอมต์มันจะออกไปบนsudo catstderr ของ; ใน bash ให้ลองเปลี่ยนเส้นทางพร้อมกับ stdout โดยใช้

sudo cat /etc/resolv.conf |& less

และดูว่าการตอบสนองแตกต่างกันอย่างไร


16
ในขณะที่คำตอบนี้ถูกต้องในsudostdin นั้นยังคงเชื่อมต่อกับเทอร์มินัลด้วยคำสั่งตัวอย่างซึ่งไม่เกี่ยวข้องโดยตรงกับวิธีที่ได้รับรหัสผ่าน: โดยค่าเริ่มต้นsudoจะไม่ขอรหัสผ่านผ่าน stdin และจะแสดงพรอมต์ผ่านทางstderrคุณ สามารถลอง2>/dev/nullยืนยันได้ว่า ให้sudoเข้าถึง tty โดยตรง
บ๊อบ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.