วิธีการแก้ไขข้อผิดพลาด 'sudo: ไม่มี tty present และไม่มีโปรแกรม askpass ที่ระบุไว้'


438

ฉันพยายามรวบรวมบางแหล่งโดยใช้ makefile ใน Makefile sudoมีพวงของคำสั่งที่จะต้องวิ่งตาม

เมื่อฉันคอมไพล์แหล่งที่มาจากเทอร์มินัลทุกอย่างไปได้ดีและทำให้หยุดชั่วคราวในครั้งแรกที่sudoคำสั่งถูกรันเพื่อรอรหัสผ่าน เมื่อฉันพิมพ์รหัสผ่านให้ดำเนินการต่อและดำเนินการให้เสร็จสมบูรณ์

แต่ฉันต้องการรวบรวมแหล่งข้อมูลใน NetBeans ดังนั้นฉันเริ่มโครงการและแสดง netbeans ว่าจะหาแหล่งที่มาได้อย่างไร แต่เมื่อฉันรวบรวมโครงการมันทำให้เกิดข้อผิดพลาด:

sudo: no tty present and no askpass program specified

ครั้งแรกที่พบsudoคำสั่ง

ฉันค้นหาปัญหาบนอินเทอร์เน็ตและวิธีแก้ไขทั้งหมดที่ฉันพบชี้ไปที่สิ่งหนึ่ง: การปิดใช้งานรหัสผ่านสำหรับผู้ใช้รายนี้ เนื่องจากผู้ใช้ที่สงสัยนี่คือรูต ฉันไม่ต้องการทำเช่นนั้น

มีวิธีแก้ปัญหาอื่น ๆ อีกไหม?


3
ฉันกำลังรวบรวมระบบปฏิบัติการของเล่น ฉันต้องทำบางสิ่งเพื่อติดตั้ง VM รวมถึงการสร้างฮาร์ดดิสก์เสมือนพร้อมบูตเซกเตอร์
hebbo


ในฐานะที่ชี้ไปในserverfault.com/a/597268 , sudo -n my-commandทำงานให้ฉัน หวัง!
andreyevbr

1
กรุณาเลือกคำตอบ
ichimaru

1
@ andreyevbr ฉันไม่คิดอย่างนั้น sudo: a password is required
ichimaru

คำตอบ:


260

การให้ผู้ใช้สามารถใช้คำสั่งนั้นได้โดยไม่ต้องใส่รหัสผ่านควรแก้ไขปัญหา ก่อนเปิดเปลือกคอนโซลและประเภท:

sudo visudo

จากนั้นแก้ไขไฟล์นั้นเพื่อเพิ่มไปยังจุดสิ้นสุด:

username ALL = NOPASSWD: /fullpath/to/command, /fullpath/to/othercommand

เช่น

john ALL = NOPASSWD: /sbin/poweroff, /sbin/start, /sbin/stop

จะช่วยให้ผู้johnที่จะ sudo poweroff, startและstopโดยไม่ต้องถูกถามรหัสผ่าน

ดูที่ด้านล่างของหน้าจอสำหรับการกดแป้นที่คุณต้องใช้ใน visudo - นี่ไม่ใช่วิธีที่ vi - และออกโดยไม่บันทึกสัญลักษณ์แรกของปัญหาใด ๆ คำเตือนเรื่องสุขภาพ: การทำลายไฟล์นี้จะมีผลกระทบร้ายแรงแก้ไขด้วยความระมัดระวัง!


4
ใช่หน้า man ของ sudoersทำให้ฉันลืมตาได้ว่าควรใช้ sudo อย่างไร
Spencer Williams

6
visudo ควรเปิดขึ้นในสิ่งที่ EDITOR ตั้งค่าให้ใช้ซึ่งสภาพแวดล้อมของคุณอาจดี (และควรเป็น ^ _ ^) vi
สไตล์ของ Matt

8
ตรวจสอบให้แน่ใจว่าบรรทัดการคำนวณ NOPASSWD อยู่หลังบรรทัด sudo อื่น ๆ ที่อาจตรงกัน (เช่น% wheel) ที่ไม่มีแฟล็ก NOPASSWD
anthony

27
ฉันไม่สามารถ "sudo visudo" เพราะฉันไม่สามารถ sudo ในตอนแรก!
Gubatron

8
พิจารณาเพิ่มไฟล์ใน /etc/sudoers.d และปล่อยให้ไฟล์ visudo ไม่ถูกแตะต้อง
xlttj

183

ลอง:

  1. ใช้NOPASSWDline สำหรับคำสั่งทั้งหมดฉันหมายถึง:

    jenkins ALL=(ALL) NOPASSWD: ALL
    
  2. วางบรรทัดหลังบรรทัดอื่นทั้งหมดในsudoersไฟล์

ที่ใช้งานได้สำหรับฉัน (Ubuntu 14.04)


13
ฉันเพิ่มบรรทัดแรกหลังจากการกำหนดค่าของผู้ใช้คนอื่น ๆ แต่มันทำงานเฉพาะเมื่อวางเป็นบรรทัดสุดท้ายในไฟล์บน lubuntu 14.04.1 เท่านั้น
user77115

ส่วนที่สองคือทางออกของฉันคือสิ่งที่ฉันต้องการ บรรทัดการกำหนดค่าที่มีอยู่ (สำหรับกลุ่มล้อ) ยังตรงกับคำสั่ง sudo ของฉัน แต่ไม่มีรายการ NOPASSWD: วางบรรทัดใหม่ของฉันหลังจากที่ให้ความสำคัญกับการอนุญาตให้ไม่มีการใช้รหัสผ่านสำหรับคำสั่งเฉพาะที่ฉันต้องการ
anthony

5
ตามที่ @ user77115 ได้กล่าวถึงสิ่งนี้จะทำงานได้ก็ต่อเมื่อคุณวางไว้เป็นบรรทัดสุดท้ายในไฟล์ sudoers แม้แต่กับ Ubuntu 16.04 ในฐานะที่เป็นข้อความด้านการให้สิทธิ์ sudo กับเจนกินส์สำหรับคำสั่งทั้งหมดเป็นเรื่องที่น่ากังวลมากเกี่ยวกับความปลอดภัย พิจารณาห่อสคริปต์เจนกินส์ของคุณและให้สิทธิ์การเข้าถึงคำสั่งเฉพาะเช่น: jenkins ALL=(ALL) NOPASSWD: /var/lib/jenkins/wrapper_script
ivandov

jenkinsเป็นแค่ชื่อผู้ใช้? มันจะต้องเป็นชื่อผู้ใช้ของผู้ใช้จากเครื่องโฮสต์? ถ้าชื่อผู้ใช้บนเครื่องโฮสต์ตรงกับชื่อผู้ใช้จากเซิร์ฟเวอร์ระยะไกล
mrgloom

นี่เป็นเจนกินส์โดยเฉพาะดูเหมือนว่าstackoverflow.com/a/22651598/1041319เป็นวิธีแก้ปัญหาทั่วไปเพิ่มเติม
arntg

167

ลอง:

ssh -t remotehost "sudo <cmd>"

สิ่งนี้จะลบข้อผิดพลาดด้านบน


7
-t Force pseudo-tty allocation. This can be used to execute arbitrary screen-based programs on a remote machineดูเพิ่มเติมที่: sudo-no-tty-present-and-no-askpass- โปรแกรมที่ระบุ ยังsudo -Aอนุญาตการตั้งค่าsudoโปรแกรม askpass แต่ฉันเห็น GUIs เท่านั้น ใครบ้างรู้ว่าทางผ่านอนุญาตให้ใช้ssh remotehost sudo -A askpass?
ที่นี่

1
การแก้ไข, the -Afor sudoไม่รับอาร์กิวเมนต์และต้องการสภาพแวดล้อมแทนSUDO_ASKPASSหรือsudo.conf ดังนั้นจึงssh remotehost sudo -A commandยังคงใช้งานได้ ยังสงสัยเกี่ยวกับโปรแกรม Askpass ที่ใช้เทอร์มินัล
ที่นี่

7
สิ่งนี้ไม่ได้ผลสำหรับฉัน (น่าจะเป็นเพราะฉันโทรหา ssh จากสคริปต์) ทำให้ฉันมีข้อผิดพลาดPseudo-terminal will not be allocated because stdin is not a terminal.:(
knocte

ใช้งานได้ดีสำหรับฉัน ขอบคุณ!
xfra35

1
นี่ไม่ได้ตอบคำถาม
bschlueter

126

หลังจากทางเลือกทั้งหมดฉันพบ:

sudo -S <cmd>

ตัวเลือก -S (stdin) ทำให้ sudo อ่านรหัสผ่านจากอินพุตมาตรฐานแทนอุปกรณ์ปลายทาง

แหล่ง

คำสั่งด้านบนยังคงต้องป้อนรหัสผ่าน หากต้องการลบรหัสผ่านด้วยตนเองในกรณีเช่นเจนกินส์คำสั่งนี้จะทำงาน:

echo <password> | sudo -S <cmd> 

ดูเหมือนว่าการแก้ไขปัญหาของฉัน แต่มีผลข้างเคียงใด ๆ จากการใช้คำสั่งนี้หรือไม่?
Xiaodong Qi

3
sudo -S <command>- trueเพิ่งเกิดขึ้นเป็นคำสั่ง dummy ที่ส่งกลับรหัสทางออก 0 ( falseเป็นคำสั่งที่ส่งกลับ 1) ขอบคุณนี่เป็นคำตอบที่แท้จริงเนื่องจากคนอื่น ๆ คาดหวังว่า "sudo" จะทำงาน!
Adam Plocher

1
-S: เขียนพรอมต์ไปที่ข้อผิดพลาดมาตรฐานและอ่านรหัสผ่านจากอินพุตมาตรฐานแทนการใช้อุปกรณ์ปลายทาง รหัสผ่านจะต้องตามด้วยอักขระขึ้นบรรทัดใหม่
fileinster

วิธีนี้ใช้งานได้ทันทีและอาจใช้งาน sudo ได้จนกว่าจะหมดเวลา แต่ไม่สามารถแก้ไขปัญหาพื้นฐานที่อาจเกิดขึ้นได้และปัญหาจะกลับมา
nealmcb

ฉันไม่รู้ว่ามันใช้งานได้ดี แต่มันแสดงให้เห็นPassword:แล้วมันไม่มีอะไรเกิดขึ้น ฉันพิมพ์รหัสผ่านไม่ได้
ichimaru

43

sudoโดยค่าเริ่มต้นจะอ่านรหัสผ่านจากเทอร์มินัลที่แนบมา ปัญหาของคุณคือไม่มีเทอร์มินัลต่ออยู่เมื่อรันจากคอนโซล netbeans ดังนั้นคุณต้องใช้วิธีอื่นในการป้อนรหัสผ่าน: ซึ่งเรียกว่าโปรแกรมaskpass

askpassโปรแกรมไม่ได้เป็นโปรแกรมเฉพาะ แต่โปรแกรมใด ๆ ที่สามารถขอรหัสผ่าน ตัวอย่างเช่นในระบบของฉันx11-ssh-askpassทำงานได้ดี

เพื่อที่จะทำเช่นนั้นคุณต้องระบุโปรแกรมที่จะใช้ไม่ว่าจะด้วยตัวแปรสภาพแวดล้อมSUDO_ASKPASSหรือในsudo.confไฟล์ (ดูman sudoรายละเอียด)

คุณสามารถบังคับsudoที่จะใช้โปรแกรม askpass -Aโดยใช้ตัวเลือก โดยค่าเริ่มต้นมันจะใช้เฉพาะในกรณีที่ไม่มีขั้วต่อที่แนบมา


การแก้ปัญหาในปัจจุบันต้องใช้กุย โปรแกรม askpass ใช้งานได้กับอะไรบ้าง
ที่นี่

@ ที่นี่: ดี ... ถ้าคุณเรียกใช้ ssh จากเทอร์มินัลมันจะขอรหัสผ่านโดยตรงคุณไม่ต้องการอะไรเป็นพิเศษ ... หรือคุณจะถามเกี่ยวกับการขอรหัสผ่านจากเทอร์มินัลอื่นที่ไม่ใช่ รันเซสชัน ssh หรือไม่
rodrigo

1
ตอนนี้ฉันเห็นแล้วว่า-Aไม่มีข้อโต้แย้ง -Aต้องการสภาพแวดล้อมSUDO_ASKPASSหรือsudo.confไฟล์ ในกรณีดังกล่าวssh host "export SUDO_ASKPASS=askpass;sudo -A cat /etc/passwd"จะยังคงทำงานร่วมกับ askpass ที่ใช้เทอร์มินัลอย่างไรก็ตาม @chandru มีความกระชับมากกว่าด้านล่างssh -t ...
ที่นี่

มี cavats บางส่วนที่ใช้ -A ก่อนอื่นถ้าใช้ -A และไม่ได้ตั้งค่า SUDO_ASKPASS คุณจะได้รับข้อผิดพลาด ข้อสองเมื่อ - ใช้แล้ว ssh จะไม่ใช้ข้อมูลประจำตัวที่แคชไว้มันจะร้องขอรหัสผ่านเสมอ
แอนโธนี

ในฐานะที่เป็นภาคผนวกคุณอาจต้องการดูบันทึกย่อของฉันเกี่ยวกับโปรแกรมป้อนรหัสผ่าน ... ict.griffith.edu.au/anthony/info/crypto/passwd_input.txt
anthony

26

สำหรับผู้ใช้ Ubuntu 16.04

มีไฟล์ที่คุณต้องอ่านด้วย:

cat /etc/sudoers.d/README

การวางไฟล์ด้วยโหมด 0440 ใน /etc/sudoers.d/myuser ด้วยเนื้อหาต่อไปนี้:

myuser  ALL=(ALL) NOPASSWD: ALL

ควรแก้ไขปัญหา

ไม่ลืม:

chmod 0440 /etc/sudoers.d/myuser

ดี น้ำยาทำความสะอาดที่ได้รับความนิยมมากกว่าใคร
พอลแพเร็

2
อย่าทำตามนี้อย่างเด็ดขาด ฉันสร้างไฟล์ใหม่ใน /etc/sudoers.d ดังที่อธิบายไว้ที่นี่และท้ายที่สุดไม่สามารถใช้ sudo ได้อีกต่อไป .. ต้องลบไฟล์ผ่านโหมดการกู้คืน
Stian

25

ลองอันนี้:

echo '' | sudo -S my_command

มันใช้งานได้สำหรับฉัน แต่ทุกคนสามารถอธิบายได้ว่าทำไมมันถึงช่วยได้?
ololobus

@ololobus คุณส่งรหัสผ่านที่ว่างเปล่าไปที่พรอมต์แรกเพื่อป้อนรหัสผ่าน
Nikita Koksharov

ทำงาน! ไม่มีคำตอบที่ได้คะแนนสูงกว่าแก้สำหรับฉัน
drerD

1
มันส่งกลับข้อผิดพลาดต่อไปนี้: [sudo] password for alper: Sorry, try again. [sudo] password for alper: sudo: 1 incorrect password attempt @sNICkerssss
alper

16

ถ้าคุณบังเอิญมาที่นี่เพราะคุณไม่สามารถ sudo ภายใน Ubuntu ที่มาพร้อมกับ Windows10

  1. แก้ไขไฟล์ / etc / hosts จาก Windows (พร้อมแผ่นจดบันทึก) มันจะอยู่ที่: %localappdata\lxss\rootfs\etc, เพิ่ม127.0.0.1 WINDOWS8, นี่จะกำจัดข้อผิดพลาดแรกที่ไม่สามารถหาโฮสต์ได้

  2. เพื่อกำจัดno tty presentข้อผิดพลาดทำเสมอsudo -S <command>


2
ขอขอบคุณที่ให้คำตอบสำหรับผู้ที่มาที่นี่ด้วยเหตุผลที่ไม่เกี่ยวข้องกับคำอธิบายคำถาม แต่จับคู่ชื่อคำถาม +1
Jayant Bhawal


15

เข้าสู่ระบบ linux ของคุณ ดับคำสั่งต่อไปนี้ ระวังเนื่องจากการแก้ไข sudoer เป็นข้อเสนอที่มีความเสี่ยง

$ sudo visudo

เมื่อตัวแก้ไข vi เปิดขึ้นทำการเปลี่ยนแปลงต่อไปนี้:

  1. แสดงความคิดเห็นออกมา Defaults requiretty

    # Defaults    requiretty
    
  2. ไปที่จุดสิ้นสุดของไฟล์และเพิ่ม

    jenkins ALL=(ALL) NOPASSWD: ALL
    


11

สิ่งนี้ใช้ได้กับฉัน:

echo "myuser ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers

ที่ซึ่งผู้ใช้ของคุณคือ "myuser"

สำหรับภาพนักเทียบท่านั่นจะเป็น:

RUN echo "myuser ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers

9

ตรวจสอบให้แน่ใจว่าคำสั่งที่คุณกำลังsudoเป็นส่วนหนึ่งของคุณPATHไอเอ็นจีเป็นส่วนหนึ่งของคุณ

หากคุณมีsudoersรายการคำสั่งเดียว (หรือหลายรายการ แต่ไม่ใช่ทั้งหมด) คุณจะได้รับsudo: no tty present and no askpass program specifiedเมื่อคำสั่งไม่ได้เป็นส่วนหนึ่งของเส้นทางของคุณ (และไม่ได้ระบุเส้นทางแบบเต็ม)

คุณสามารถแก้ไขได้โดยเพิ่มคำสั่งลงในPATHหรือเรียกใช้งานด้วยพา ธ สัมบูรณ์เช่น

sudo /usr/sbin/ipset

แทน

sudo ipset


1
นี่คือง่ามจริงสำหรับฉัน ในsudoers %sitd ALL=(lamparna) NOPASSWD: /usr/bin/git_push_to_lamparna.sh, /usr/bin/gitและใช้ sudo -u lamparna git push --mirror ssh://lamparna@REDMINE/home/lamparna/repos/git/jine/lamparna.gitในกลับมา update git ตะขอคอมไพล์no ttyแต่ใช้sudo -u lamparna /usr/bin/git push --mirror ssh://lamparna@REDMINE/home/lamparna/repos/git/jine/lamparna.gitงานโดยไม่ต้องใช้รหัสผ่าน
Foton

7

คำสั่ง sudoล้มเหลวเนื่องจากพยายามให้รหัสผ่านรูทและไม่มีการจัดสรรหลอก (เนื่องจากเป็นส่วนหนึ่งของสคริปต์)

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

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

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

เป็นการดี (ปลอดภัย) มันจะเป็นการ จำกัด สิทธิ์ของรูตเฉพาะกับคำสั่งเฉพาะที่สามารถระบุได้ %admin ALL=(ALL) NOPASSWD:/path/to/program


ฉันรู้ว่าเป็นวิธีที่ปลอดภัยกว่ามากที่จะทำ แม้ว่าฉันเขียนคำสั่งต่อไปนี้ในsudoersไฟล์apache ALL = (ALL) NOPASSWD:/usr/share/apache-tomcat-7.0.61/bin/startup.shแต่มันไม่ทำงานสำหรับฉัน มันให้ข้อผิดพลาดดังต่อไปนี้sudo: >>> /etc/sudoers: syntax error near line 120 <<< sudo: parse error in /etc/sudoers near line 120 sudo: no valid sudoers sources found, quitting sudo: unable to initialize policy plugin
muaaz

1
BTW มันใช้งานได้ดีapache ALL=(ALL) NOPASSWD: ALLแต่มีความเสี่ยงด้านความปลอดภัย :)
muaaz

6

ฉันคิดว่าฉันสามารถช่วยคนที่มีกรณีของฉัน

ก่อนอื่นฉันเปลี่ยนการตั้งค่าผู้ใช้ตาม/etc/sudoersคำตอบข้างต้น แต่มันก็ยังไม่ทำงาน

myuser   ALL=(ALL) NOPASSWD: ALL
%mygroup  ALL=(ALL:ALL) ALL

ในกรณีของฉันmyuserอยู่ในmygroupอยู่ใน

และฉันไม่ต้องการกลุ่ม ดังนั้นลบบรรทัดนั้น

(ไม่ควรลบบรรทัดนั้นเหมือนฉันเพียงทำเครื่องหมายความคิดเห็น)

myuser   ALL=(ALL) NOPASSWD: ALL

มันได้ผล!


3

การเรียกใช้งานเชลล์สคริปต์ที่มีคำสั่ง sudo ในนั้นจากเจนกินส์อาจไม่ทำงานอย่างที่คาดไว้ ในการแก้ไขปัญหานี้ให้ทำตาม

ขั้นตอนง่าย ๆ :

  1. บนระบบที่ใช้ Ubuntu ให้เรียกใช้ "$ sudo visudo"

  2. นี่จะเป็นการเปิดไฟล์ / etc / sudoers

  3. หากผู้ใช้ jenkins ของคุณอยู่ในไฟล์ดังกล่าวแล้วให้แก้ไขดังนี้:

เจนกิ้นส์ ALL = (ALL) NOPASSWD: ALL

  1. บันทึกไฟล์

  2. เปิดใช้งาน jenkins ของคุณใหม่

  3. คุณไม่ควรเห็นข้อความแสดงข้อผิดพลาดนั้นอีก :)


3

ฉันสามารถทำสิ่งนี้ได้ แต่โปรดทำตามขั้นตอนอย่างถูกต้อง นี่คือสำหรับทุกคนที่ได้รับข้อผิดพลาดในการนำเข้า

ขั้นที่ 1 : ตรวจสอบว่าไฟล์และโฟลเดอร์ได้รับการดำเนินการตามที่ได้รับอนุญาตหรือไม่ ผู้ใช้ Linux ใช้:

chmod 777 filename

ขั้นที่ 2 : ตรวจสอบว่าผู้ใช้รายใดที่มีสิทธิ์ดำเนินการ

ขั้นตอนที่ 3 : เปิด terminal พิมพ์คำสั่งนี้

sudo visudo

เพิ่มบรรทัดนี้ในรหัสด้านล่าง

www-data ALL=(ALL) NOPASSWD:ALL
nobody ALL=(ALL) NOPASSWD:/ALL

นี่คือการให้สิทธิ์ในการเรียกใช้สคริปต์และอนุญาตให้ใช้ไลบรารีทั้งหมด ผู้ใช้โดยทั่วไปคือ 'ไม่มีใคร' หรือ 'www-data'

ตอนนี้แก้ไขรหัสของคุณเป็น

echo shell_exec('sudo -u the_user_of_the_file python your_file_name.py 2>&1');

ไปที่เทอร์มินัลเพื่อตรวจสอบว่ากระบวนการทำงานอยู่หรือไม่

ps aux | grep python

สิ่งนี้จะเอาท์พุตกระบวนการทั้งหมดที่ทำงานในหลาม

Add Ons : ใช้รหัสด้านล่างเพื่อตรวจสอบผู้ใช้ในระบบของคุณ

cut -d: -f1 /etc/passwd

ขอบคุณ!


2

ข้อผิดพลาดนี้อาจเกิดขึ้นเมื่อคุณพยายามเรียกใช้คำสั่งเทอร์มินัล (ที่ต้องใช้รหัสผ่านรูท) จากสคริปต์ที่ไม่ใช่เชลล์เช่นsudo ls(ใน backticks) จากโปรแกรม Ruby ในกรณีนี้คุณสามารถใช้ยูทิลิตีExpect ( http://en.wikipedia.org/wiki/Expect ) หรือทางเลือกอื่น
ตัวอย่างเช่นใน Ruby ที่จะดำเนินการsudo lsโดยไม่ได้รับsudo: no tty present and no askpass program specifiedคุณสามารถเรียกใช้สิ่งนี้:

require 'ruby_expect'

exp = RubyExpect::Expect.spawn('sudo ls', :debug => true)
exp.procedure do
    each do
        expect "[sudo] password for _your_username_:" do
            send _your_password_
        end
    end
end

[ใช้ตัวเลือกอย่างใดอย่างหนึ่งเพื่อคาดหวังการขยาย TCL: ruby_expect gem]


2

สำหรับการอ้างอิงในกรณีที่คนอื่นพบปัญหาเดียวกันฉันติดขัดในช่วงชั่วโมงที่ดีกับข้อผิดพลาดนี้ซึ่งไม่ควรเกิดขึ้นตั้งแต่ฉันใช้พารามิเตอร์ NOPASSWD

สิ่งที่ฉันไม่ทราบคือ sudo อาจเพิ่มข้อความแสดงข้อผิดพลาดเดียวกันเมื่อไม่มี tty และคำสั่งที่ผู้ใช้พยายามเปิดใช้ไม่ใช่ส่วนหนึ่งของคำสั่งที่อนุญาตในไฟล์ / etc / sudoers

นี่คือตัวอย่างเนื้อหาไฟล์ของฉันที่เรียบง่ายพร้อมปัญหาของฉัน:

bguser ALL = NOPASSWD: \
    command_a arg_a, \
    command_b arg_b \
    command_c arg_c

เมื่อ bguser จะพยายามเปิด "sudo command_b arg_b" โดยไม่มี tty ใด ๆ (bguser ถูกใช้สำหรับ daemon บางตัว) จากนั้นเขาจะพบข้อผิดพลาด "no tty present และไม่ระบุโปรแกรม askpass"

ทำไม?

เนื่องจากเครื่องหมายจุลภาคหายไปท้ายบรรทัดในไฟล์ / etc / sudoers ...

(ฉันยังสงสัยว่านี่เป็นพฤติกรรมที่คาดหวังและไม่ใช่ข้อผิดพลาดใน sudo เนื่องจากข้อความแสดงข้อผิดพลาดที่ถูกต้องสำหรับกรณีดังกล่าวเป็น "ขออภัยผู้ใช้ bguser ไม่ได้รับอนุญาตให้ดำเนินการ ฯลฯ ")


2

ฉันได้รับข้อผิดพลาดนี้เนื่องจากฉัน จำกัด ผู้ใช้ของฉันให้เป็น 'systemctl' ที่ปฏิบัติการได้เพียงไฟล์เดียวและกำหนดค่าไฟล์ visudo ผิดพลาด

นี่คือสิ่งที่ฉันมี:

jenkins ALL=NOPASSWD: systemctl

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

jenkins ALL=NOPASSWD: /bin/systemctl

สิ่งนี้ทำให้ผู้ใช้ jenkins ของฉันเริ่มบริการใหม่ แต่ไม่สามารถเข้าถึงรูททั้งหมด


1

ไม่มีใครบอกสิ่งที่อาจทำให้เกิดข้อผิดพลาดนี้ในกรณีของการโยกย้ายจากโฮสต์หนึ่งไปยังอีกที่หนึ่งจำเกี่ยวกับการตรวจสอบชื่อโฮสต์ในไฟล์ sudoers:

ดังนั้นนี่คือ config ของฉัน / etc / sudoers

User_Alias      POWERUSER = user_name
Cmnd_Alias SKILL = /root/bin/sudo_auth_wrapper.sh
POWERUSER hostname=(root:root) NOPASSWD: SKILL

ถ้ามันไม่ตรงกัน

uname -a
Linux other_hostname 3.10.17 #1 SMP Wed Oct 23 16:28:33 CDT 2013 x86_64 Intel(R) Core(TM) i3-4130T CPU @ 2.90GHz GenuineIntel GNU/Linux

มันจะปรากฏขึ้นข้อผิดพลาดนี้:

ไม่มี tty ปัจจุบันและไม่ได้ระบุโปรแกรม askpass


1

ตัวเลือกอื่น ๆ ไม่ขึ้นอยู่กับ NOPASSWD:

  • เริ่ม Netbeans ด้วยสิทธิ์พิเศษรูท ((sudo netbeans) หรือคล้ายกัน) ซึ่งน่าจะแยกกระบวนการสร้างด้วยรูทดังนั้น sudo จะสำเร็จโดยอัตโนมัติ
  • ทำการดำเนินการที่คุณต้องทำ suexec - ทำให้พวกเขาเป็นเจ้าของโดย root และตั้งค่าโหมดเป็น 4755 (ซึ่งแน่นอนว่าจะทำให้ผู้ใช้ทุกคนบนเครื่องทำงานได้) ด้วยวิธีนี้พวกเขาไม่ต้องการ sudo เลย
  • การสร้างไฟล์ฮาร์ดดิสก์เสมือนด้วย bootsectors ไม่ควรต้องมี sudo เลย ไฟล์เป็นเพียงไฟล์และบูทเตอร์เป็นเพียงข้อมูล แม้แต่เครื่องเสมือนก็ไม่จำเป็นต้องมีรูทเว้นแต่คุณจะส่งต่ออุปกรณ์ขั้นสูง

1

อาจเป็นคำถามที่ไม่ชัดเจนว่าทำไมไม่มีคำตอบที่ตรงกัน แต่ฉันมีข้อผิดพลาดเดียวกันเมื่อฉันพยายามที่จะติดตั้ง sshfs ซึ่งต้องใช้ sudo: คำสั่งเป็นดังนี้:

sshfs -o sftp_server="/usr/bin/sudo /usr/lib/openssh/sftp-server" user@my.server.tld:/var/www /mnt/sshfs/www

โดยการเพิ่มตัวเลือก -o debug

sshfs -o debug -o sftp_server="/usr/bin/sudo /usr/lib/openssh/sftp-server" user@my.server.tld:/var/www /mnt/sshfs/www

ฉันมีข้อความเดียวกันของคำถามนี้:

sudo: no tty present and no askpass program specified

ดังนั้นโดยการอ่านคำตอบของผู้อื่นฉันกลายเป็นไฟล์ใน/etc/sudoer.d/usermy.server.tld ด้วย:

user ALL=NOPASSWD: /usr/lib/openssh/sftp-server

และตอนนี้ฉันสามารถติดตั้งไดรฟ์โดยไม่ให้สิทธิพิเศษแก่ผู้ใช้มากเกินไป


0

แม้ว่าคำถามนี้จะเก่า แต่ก็ยังคงเกี่ยวข้องกับระบบที่เป็นปัจจุบันมากขึ้นหรือน้อยลง หลังจากเปิดใช้งานโหมดแก้ไขข้อบกพร่องของ sudo ( Debug sudo /var/log/sudo_debug all@infoใน/etc/sudo.conf ) ฉันถูกชี้ไปที่ / dev: " /dev is world writable" ดังนั้นคุณอาจต้องตรวจสอบสิทธิ์ของไฟล์ ttyโดยเฉพาะอย่างยิ่งของไดเร็กทอรีที่มีโหนด tty / pts อยู่


0

1 open / etc / sudoers

ชนิด sudo vi /etc/sudoersชนิดนี่จะเป็นการเปิดไฟล์ของคุณในโหมดแก้ไข

2 เพิ่ม / แก้ไขผู้ใช้ linux

ค้นหารายการสำหรับผู้ใช้ Linux แก้ไขดังต่อไปนี้หากพบหรือเพิ่มบรรทัดใหม่

<USERNAME> ALL=(ALL) NOPASSWD: ALL

3 บันทึกและออกจากโหมดแก้ไข


0

หากคุณเพิ่มบรรทัดนี้ใน/etc/sudoers(ผ่านทางvisudo) มันจะแก้ไขปัญหานี้โดยไม่ต้องปิดการป้อนรหัสผ่านของคุณและเมื่อชื่อแทนsudo -Sไม่ทำงาน (สคริปต์ที่โทรsudo):

Defaults visiblepw

แน่นอนอ่านคู่มือตัวเองเพื่อทำความเข้าใจ แต่ฉันคิดว่าสำหรับกรณีการใช้งานของฉันทำงานในภาชนะ LXD ผ่านlxc exec instance -- /bin/bashมันค่อนข้างปลอดภัยเพราะมันไม่ได้พิมพ์รหัสผ่านบนเครือข่าย


0

ใช้ไปป์ไลน์:

echo your_pswd | sudo -S your_cmd

ใช้ที่นี่เอกสาร:

sudo -S cmd <<eof
pwd
eof
#remember to put the above two lines without "any" indentations.

เปิดเทอร์มินัลเพื่อถามรหัสผ่าน (แล้วแต่จำนวนใดจะใช้งาน):

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