ทำไม cron จึงไม่สามารถเรียกใช้เนื้อหา sudo ในสคริปต์ของฉันได้อย่างเงียบ ๆ


29

ฉันมีเรียกใช้สคริปต์จาก crontab sudoผู้ใช้ที่ไม่ได้รับสิทธิพิเศษที่จะเรียกใช้คำสั่งบางอย่าง ยกเว้นว่ามันจะไม่ สคริปต์ทำงานได้ดี แต่คำสั่ง sudo'ed ล้มเหลวอย่างเงียบ ๆ

  • สคริปต์ทำงานอย่างสมบูรณ์แบบจากเชลล์ในฐานะผู้ใช้ที่เป็นปัญหา

  • Sudo ไม่ต้องการรหัสผ่าน ผู้ใช้ในคำถามได้เข้าถึงที่ได้รับใน(root) NOPASSWD: ALL/etc/sudoers

  • Cron กำลังทำงานและเรียกใช้งานสคริปต์ การเพิ่มdate > /tmp/logผลผลิตอย่างง่ายในเวลาที่เหมาะสม

  • ไม่ใช่ปัญหาสิทธิ์ สคริปต์จะถูกเรียกใช้งานอีกครั้งไม่ใช่คำสั่ง sudo'ed

  • มันไม่ใช่ปัญหาของเส้นทาง การรันenvจากภายในสคริปต์ที่กำลังรันแสดง$PATHตัวแปรที่ถูกต้องซึ่งรวมถึงพา ธ ไปยัง sudo การเรียกใช้โดยใช้เส้นทางแบบเต็มไม่ได้ช่วยอะไร คำสั่งที่กำลังดำเนินการจะได้รับชื่อพา ธ เต็ม

  • การพยายามดักจับเอาต์พุตของคำสั่ง sudo รวมถึง STDERR จะไม่แสดงสิ่งใดที่มีประโยชน์ การเพิ่มsudo echo test 2>&1 > /tmp/logสคริปต์สร้างบันทึกเปล่า

  • sudo binary เองนั้นทำงานได้ดีและรับรู้ว่ามันมีสิทธิ์แม้เมื่อเรียกใช้จาก cron ภายในสคริปต์ การเพิ่มsudo -l > /tmp/logสคริปต์สร้างเอาต์พุต:

    ผู้ใช้ ec2 ผู้ใช้อาจเรียกใช้คำสั่งต่อไปนี้บนโฮสต์นี้:
    (root) NOPASSWD: ALL

การตรวจสอบโค้ดทางออกของคำสั่งโดยใช้$?แสดงว่ามันกำลังส่งคืนข้อผิดพลาด (รหัสทางออก:) 1แต่ดูเหมือนว่าจะไม่มีข้อผิดพลาดเกิดขึ้น คำสั่งง่าย ๆ เหมือน/usr/bin/sudo /bin/echo testคืนรหัสข้อผิดพลาดเดียวกัน

จะเกิดอะไรขึ้นอีก?

นี่เป็นเครื่องเสมือนที่เพิ่งสร้างขึ้นซึ่งใช้งาน Amazon Linux AMI ล่าสุด crontab เป็นของผู้ใช้ec2-userและไฟล์ sudoers เป็นค่าเริ่มต้นการกระจาย


1
ฉันกำลังจะพูดถึงวิธีแก้ปัญหา แต่หลังจากนั้นฉันก็อ่านThe user in question has (root) NOPASSWD: ALL access granted in /etc/sudoersและสมองของฉันก็เริ่มกรีดร้องดังเกินไปที่จะอ่านต่อไป
Shadur

@Shadur: คุยกับมือ นั่นไม่ใช่วิธีของฉันในการตั้งค่าเครื่อง แต่อย่างใด แต่เครื่องเหล่านี้ออกมานอกกรอบ แม้จะเป็นเครื่องของคุณ แต่คุณไม่ได้รับรหัสผ่านรูทกุญแจของคุณในฐานะเจ้าของกล่องจะเข้าสู่บัญชีผู้ใช้ ec2 ซึ่งมีสิทธิ์เข้าถึง sudo แบบเต็ม (ดังที่ระบุไว้) คุณไม่ได้รับรหัสผ่านสำหรับผู้ใช้ ec2 ยกเว้นว่าคุณตั้งไว้มันเป็นเพียงการเข้าสู่ระบบเท่านั้น
คาเลบ

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

หากคุณมีรูตและคุณต้องการให้งาน cron รันเป็นรูทดังนั้นทำไมจึงใส่ไว้ใน crontab ของผู้ใช้ ec2 crontab ของรูทจะไม่เหมาะสมกว่านี้ไหม หรือ / etc / crontab?
cas

@ CraigSanders: ฉันไม่ต้องการให้ cron job ทำงานเป็น root ในความเป็นจริงแล้วส่วนใหญ่ควรรันในฐานะผู้ใช้ คำถามไม่เกี่ยวกับการทำงานเป็นรูท แต่เกี่ยวกับสคริปต์ที่มีการเข้าถึงฟังก์ชันหนึ่งเป็นพิเศษผ่าน sudo
คาเลบ

คำตอบ:


39

Sudo มีตัวเลือกพิเศษบางอย่างในไฟล์สิทธิ์ซึ่งหนึ่งในนั้นอนุญาตให้มีการ จำกัด การใช้งานเชลล์ที่ทำงานอยู่ภายใน TTY ซึ่ง cron ไม่ใช่

distros บางตัวรวมถึง Amazon Linux AMI ได้เปิดใช้งานสิ่งนี้ตามค่าเริ่มต้น /etc/sudoersไฟล์จะมีลักษณะบางอย่างเช่นนี้

# Disable "ssh hostname sudo <cmd>", because it will show the password in clear.
#         You have to run "ssh -t hostname sudo <cmd>".
#
Defaults    requiretty

#
# Refuse to run if unable to disable echo on the tty. This setting should also be
# changed in order to be able to use sudo without a tty. See requiretty above.
#
Defaults   !visiblepw

หากคุณจับภาพเอาต์พุตไปยัง STDERR ที่ระดับเชลล์สคริปต์แทนที่จะใช้คำสั่ง sudo คุณจะได้รับข้อความเช่นนี้:

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

วิธีแก้ปัญหาคืออนุญาตให้ sudo ดำเนินการในสภาพแวดล้อมที่ไม่ใช่ TTY โดยลบหรือแสดงความคิดเห็นตัวเลือกเหล่านี้:

#Defaults    requiretty
#Defaults   !visiblepw

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