ขออภัยคุณต้องมี tty ในการเรียกใช้ sudo


13

ฉันได้ถามคำถามนี้ในStack Overflowแล้ว แต่ฉันถูกขอให้โพสต์ไว้ที่นี่ ดังนั้นการทำเช่นเดียวกัน

ฉันรันคำสั่งนี้โดยใช้โปรแกรม java ของฉัน -

sudo -u <username> -S pwd

ฉันได้ผลลัพธ์นี้ -

command=sudo -u <username> -S pwd
exitCode=1
sudo: sorry, you must have a tty to run sudo

ฉันพยายามแก้ไข / etc / sudoers แต่มีอยู่แล้ว

<username>       ALL=(ALL)       NOPASSWD: ALL

จากนั้นฉันได้เรียนรู้ว่าสิ่งนี้สามารถทำได้โดยการแสดงความคิดเห็นรหัสต่อไปนี้ใน / etc / sudoers

# Defaults requiretty

นอกจากนี้ตามค่าเริ่มต้นเมื่อพยายามเรียกใช้คำสั่งในฐานะผู้ใช้รายอื่นที่ใช้sudoเราจะต้องให้รหัสผ่านของเราเอง แต่สิ่งนี้สามารถเปลี่ยนแปลงได้โดยทำการเปลี่ยนแปลงต่อไปนี้ใน / etc / sudoers-

Defaults targetpw

คำถามของฉันคือมันเป็นไปได้ที่จะรันคำสั่งข้างต้นของฉันใน java โดยไม่ต้องทำการเปลี่ยนแปลงใด ๆ เช่นโดยมีการตั้งค่าเริ่มต้น ?


1
นี่คือเหตุผลที่คุณถูกถาม contrived ค่อนข้างทางเลือกสำหรับ sudo ?
slhck

6
ดูเหมือนว่า distro เฉพาะถ้าrequirettyเปิดใช้งานโดยค่าเริ่มต้น ตามเอกสารsudoของตัวเองมันเป็น "ปิดโดยปริยาย"
mpy

คำตอบ:


3

ฉันไม่รู้วิธีเรียกใช้คำสั่งเชลล์ใน Java แต่มีตัวเลือกดูที่ -t สำหรับคำสั่ง ssh

-t force pseudo-tty allocation.

นั่นคือสิ่งที่ฉันทำเมื่อฉันต้องการเรียกใช้คำสั่งในฐานะ root ผ่าน ssh (ปิดใช้งานการเข้าสู่ระบบโดยตรงโดยตรงและจำเป็นต้องใช้ tty โดย sudo)


1
ในขณะที่วิธีการนี้สามารถแก้ปัญหาตั้งแต่แรกเห็นมันไม่ชัดเจนเลยว่ามันเกี่ยวข้องกับคำถามอย่างไร คุณช่วยอธิบายรายละเอียดเพิ่มเติมได้มั้ย
pabouk

1
+1 สำหรับการแก้ปัญหาโดยไม่จำเป็นต้องเปลี่ยนการตั้งค่าเริ่มต้นใด ๆ
ลุค

1

คำถามของฉันคือมันเป็นไปได้ที่จะรันคำสั่งข้างต้นของฉันใน java โดยไม่ต้องทำการเปลี่ยนแปลงใด ๆ เช่นโดยมีการตั้งค่าเริ่มต้น?

sudo -u -S pwd

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

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

หากคุณพิจารณาสิ่งที่ sudo ทำเพื่อคุณ:

  1. แจ้งให้ใส่รหัสผ่านเพื่อยืนยันตัวตน
  2. ยกระดับสิทธิ์
  3. จากนั้นเลือกที่จะรับสิทธิพิเศษในฐานะผู้ใช้รายอื่น
  4. บันทึก sudo ใช้เพื่อเข้าถึงหรือเรียกใช้คำสั่ง

หากคุณต้องการให้จาวาของคุณรันคำสั่งตามอำเภอใจในฐานะผู้ใช้เองโดยไม่ต้องระบุรหัสผ่านสำหรับผู้ใช้เหล่านั้นหรือของคุณเอง ในกรณีนี้คุณควรสร้างกฎของคุณเองเพื่อป้องกันการละเมิด

โดยทั่วไปมีสองวิธีในการทำสิ่งนี้:

  1. เรียกใช้จาวาของคุณด้วยสิทธิ์ยกระดับและรับและคืนสิทธิพิเศษอย่างที่คุณต้องการ (ดู setuid () seteuid () การเรียกใช้ฟังก์ชัน C)
  2. เรียกใช้โปรแกรมภายนอกเพื่อรับสิทธิ์ยกระดับเมื่อคุณต้องการ

ในกรณีของ # 1 โปรแกรม java ของคุณกำลังทำงานด้วยตัวเองสิ่งที่ sudo ทำและคุณควรใช้กฎชุดของคุณเองเพื่อป้องกันการละเมิด

มีโปรแกรมอื่นที่ไม่ใช่ sudo ให้ทำ # 2 ตัวอย่างหนึ่งสามารถพบได้ในhttps://code.google.com/archive/p/exec-wrapper/downloads

เชลล์สคริปต์ที่มีประโยชน์นี้สร้างโปรแกรม C เพื่อเรียกใช้คำสั่งอื่น (โดยปกติจะเป็นสคริปต์) จากนั้นคุณคอมไพล์โปรแกรม C ไปยังไบนารี่และทำเครื่องหมายที่รูทอิด setuid หรือจริง ๆ แล้วมันสามารถ setuid ให้กับผู้ใช้ใด ๆ (โหมด: 4555 และเจ้าของ: root)

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

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