[Python] تشغيل عمليات الطفل كمستخدم مختلف من عملية تشغيل طويلة


Answers

هناك طريقة os.setuid() . يمكنك استخدامه لتغيير المستخدم الحالي لهذا البرنامج النصي.

حل واحد هو ، في مكان حيث يبدأ الطفل ، للاتصال os.setuid() و os.setgid() لتغيير المستخدم ومعرف المجموعة وبعد ذلك استدعاء واحدة من الأساليب os.exec * لتفرخ طفل جديد. سيتم تشغيل الطفل الذي تم إنشاؤه حديثًا مع مستخدم أقل قوة دون القدرة على أن يصبح أكثر قوة مرة أخرى.

آخر هو القيام بذلك عند بدء تشغيل daemon (عملية الرئيسي) ثم سيتم تشغيل كافة العمليات spawned حديثاً تحت نفس المستخدم.

للحصول على معلومات ، ابحث في صفحة manu عن setuid .

Question

لقد حصلت على عملية بيثون شيطانية طويلة الأمد تستخدم عملية فرعية لإنتاج عمليات جديدة عند حدوث أحداث معينة. يتم تشغيل العملية طويلة التشغيل بواسطة مستخدم لديه امتيازات مستخدم فائقة. أحتاج إلى عمليات الطفل التي ينتجها للتشغيل كمستخدم مختلف (على سبيل المثال ، "لا أحد") مع الاحتفاظ بامتيازات المستخدم الفائق لعملية الأصل.

أنا أستخدم حاليا

su -m nobody -c <program to execute as a child>

ولكن هذا يبدو الوزن الثقيل ولا يموت بشكل نظيف جدا.

هل هناك طريقة لإنجاز هذا برمجيًا بدلاً من استخدام su؟ أنا أبحث في أساليب مدخلات os.set * ، ولكن وثيقة في بيثون بي بي بي القياسية ليست متفرقة في هذا المجال.




تمكين المستخدم على sudo على أنه لا يتطلب كلمة مرور

username ALL=(ALL) NOPASSWD: ALL

ثم استدعاء وظيفة الجذر مع sudo ، على سبيل المثال:

import pexpect
child = pexpect.spawn('sudo apachectl restart')
for i in child: print i #if you want to see the output from the process