sudo: ไม่มี tty present และไม่ได้ระบุโปรแกรม askpass


73

เมื่อพยายามรันไบนารีรีโมตโดยใช้sudoบนกล่องรีโมต:

ssh remotehost "sudo ./binary"

ฉันเห็นข้อผิดพลาดนี้:

sudo: ไม่มี tty present และไม่ได้ระบุโปรแกรม askpass

ฉันจะแก้ไขสิ่งนี้ได้อย่างไร

แก้ไขนี้ไม่แน่นอนที่สุดของคำถามที่แนะนำเช่นนี้ คำตอบมีไม่เกี่ยวข้องอย่างสมบูรณ์ ในความเป็นจริงการเปลี่ยนแปลงเหล่านั้นไปยังไฟล์ sudoers ได้ถูกนำไปใช้กับโฮสต์ระยะไกลแล้ว


มีความเป็นไปได้ที่ซ้ำกันของวิธีรันคำสั่ง sudo โดยไม่มีรหัสผ่าน?
kenorb

คำตอบ:


78

วิธีง่ายๆคือการระบุ-t:

ssh -t remotehost "sudo ./binary"

จากหน้าคน:

บังคับการจัดสรรแบบหลอก สิ่งนี้สามารถใช้เพื่อรันโปรแกรมบนหน้าจอโดยพลการบนเครื่องระยะไกลซึ่งมีประโยชน์มากเช่นเมื่อใช้งานบริการเมนู อ็อพชัน -t หลายตัวบังคับให้จัดสรร tty แม้ว่า ssh จะไม่มี tty โลคัล

ฉันไม่สามารถอธิบายได้อย่างชัดเจนว่าทำไมงานนี้และอาจมีวิธีที่ดีกว่า ฉันอยากจะได้ยินเกี่ยวกับมันถ้าเป็นเช่นนั้น :)

@psusi อธิบายว่าเหตุใดจึงทำงานในความคิดเห็นด้านล่าง


14
ใช้งานได้เนื่องจากsudoต้องใช้ tty เพื่อให้ใส่รหัสผ่านและเมื่อระบุคำสั่งให้เรียกใช้จะsshไม่จัดสรรหนึ่งค่าโดยค่าเริ่มต้นเนื่องจากปกติจะใช้เพื่อเรียกใช้คำสั่งแบบโต้ตอบที่อาจถ่ายโอนข้อมูลไบนารีซึ่งสามารถเดินทางไปได้ .
psusi

@psusi คุณรู้คำตอบสำหรับคำถามที่เกี่ยวข้องหรือไม่ unix.stackexchange.com/questions/110841
trusktr

นอกจากนี้ยัง-ttจำเป็นต้องใช้เมื่อส่งคำสั่งโดยใช้ heredoc
Rufus

26

คำถาม:

ฉันจะแก้ไขสิ่งนี้ได้อย่างไร

sudo: no tty present and no askpass program specified

คำตอบอื่น

เป็นทางเลือกลอง:

sudo -S ./binary

สิ่งนี้สั่งให้ sudo อ่านรหัสผ่านจากอินพุตมาตรฐาน stdin

สถานการณ์ที่สิ่งนี้ช่วย

ในสภาพแวดล้อม chroot คำตอบอื่น ๆ เหล่านี้อาจทำงานไม่ถูกต้อง ... อาจเป็นเพราะ:

  1. ข้อขัดแย้ง / etc / shadow vs / etc / passwd ไม่อนุญาตให้ผู้ใช้ป้อนรหัสผ่าน
  2. ในสภาพแวดล้อม chroot-ed การเข้าถึง tty1 อาจเป็นความผิดพลาดเล็กน้อยและ ctrl-alt f2 - เป็น tty2 เป็นไปไม่ได้เนื่องจากเป็น tty ของสภาพแวดล้อมที่ไม่ใช่ chroot-ed

ตัวอย่างเช่น: การติดตั้ง / ซ่อมแซม linux ด้วยตนเองหรือ bootloader โดยใช้สภาพแวดล้อม chroot (เช่น Archlinux และ arch-chroot)


ฉันได้รับ sudo: ./binary: คำสั่งไม่พบข้อผิดพลาดเมื่อฉันเรียกใช้ sudo -S ./binary จะให้อะไร
Ajit Goel

5

คุณต้องกำหนดเทอร์มินัล / แอปพลิเคชันที่จะอ่านรหัสผ่าน มีสองสายพันธุ์:

  1. export SUDO_ASKPASS=/usr/libexec/openssh/ssh-askpass
  2. vim /etc/sudoers (ค่าเริ่มต้นที่มองเห็นได้ pw)

11
จะดีกว่าที่จะใช้visudoแทนที่จะvim /etc/sudoersหลีกเลี่ยงการล็อคตัวเองออกจากเครื่องเนื่องจากมีข้อผิดพลาดในการแก้ไขหรือไม่?
Drew Noakes

2

มันล้มเหลวเนื่องจากsudoกำลังพยายามให้ใส่รหัสผ่านรูทและไม่มีการจัดสรรหลอก

คุณต้องเข้าสู่ระบบในฐานะรูทหรือตั้งค่ากฎต่อไปนี้ใน/etc/sudoers (หรือsudo visudo:):

# Members of the admin group may gain root privileges
%admin  ALL=(ALL) NOPASSWD:ALL

จากนั้นตรวจสอบให้แน่ใจว่าผู้ใช้ของคุณอยู่ในadminกลุ่ม (หรือwheel)


ในขณะที่สิ่งนี้ไม่เป็นความจริง (ไม่มีหลักฐานยืนยันสำหรับสิ่งนี้และผู้ใช้ในกลุ่มผู้ดูแลระบบที่มีรหัสในระบบ centos และ ubuntu ยังได้รับข้อผิดพลาด) มันเป็นคำแนะนำที่ดีสำหรับการสร้างกลุ่มและกฎตามกลุ่ม งานที่เพิ่มขึ้น
MrMesees

2

คุณยังสามารถสร้างไฟล์เช่น "sudo_shutdown" ใน /etc/sudoers.d ด้วยเนื้อหา:

# Allow admins to shutdown without pass
%adm ALL=(ALL) NOPASSWD: /sbin/shutdown

วิธีนี้ช่วยให้ผู้ใช้ที่อยู่ในกลุ่ม adm สามารถปิดเครื่องได้โดยไม่ต้องใช้รหัสผ่าน


3
คุณตั้งใจจะแก้ไขสิ่งนี้เพื่อให้ครอบคลุม "no tty present"
Elder Geek

2

ในกรณีของฉันฉันได้รับข้อผิดพลาดนี้เพราะฉันไม่ได้ระบุคำสั่งที่ฉันต้องการใช้เป็นรูทใน sudoers

สิ่งที่ต้องการ

/etc/sudoers.d/myuser:

myuser ALL=(root) NOPASSWD: \
    /bin/ls -la

ทำงานให้ฉัน

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