سؤال

أحتاج إلى طريقة لتنفيذ الوحدة النمطية للنظام OS.SYS () مثل UID مختلفة. ستحتاج إلى التصرف مشابه لرمز BASH التالي (ملاحظة هذه ليست الأوامر الدقيقة التي أعمل بها):

su user1
ls ~
mv file1
su user2
ls ~
mv file1

النظام الأساسي المستهدف هو جنو لينكس عام.

بالطبع يمكنني فقط تمرير هذه إلى وحدة النظام Os.System، ولكن كيفية إرسال كلمة المرور؟ بالطبع يمكنني تشغيل البرنامج النصي كجذر، لكن هذا قذر وغير آمن.

يفضل أن أفعل مع دون مطالبة بأي كلمات مرور لتكون في نص عادي.

هل كانت مفيدة؟

المحلول

وتسمى الوظيفة التي تبحث عنها os.seteuid. وبعد أخشى أنك ربما لن تهرب من تنفيذ البرنامج النصي كجذر، في أي حال، لكنني أعتقد أنه يمكنك استخدام capabilities(7) إطار إلى "التنفيذ في" التنفيذ قليلا، بحيث يمكنه تغيير المستخدمين - ولكن لا تفعل أي من الأشياء الأخرى التي يمكن للمخطأ بها.

بدلا من ذلك، أنت ربما تكون قادرة على القيام بذلك مع بام. ولكن بشكل عام، لا توجد طريقة "أنيقة" للقيام بذلك، و David Cournapeau غير صحيح تماما أنه من التقليد من البرامج النصية للإدارة بالامتيازات.

نصائح أخرى

أعتقد أن هذا ليس تافها: يمكنك القيام بذلك مع قذيفة لأن كل أمر يتم إطلاقه في عملية خاصة به، والذي يحتوي على معرف خاص به. ولكن مع بيثون، سيكون كل شيء لديه UID لعملية Python المترجمة (بالطبع، على افتراض أنك لا تشغل الإجراءات الفرعية باستخدام الوحدة الفرعية وشركاه). لا أعرف طريقة لتغيير مستخدم العملية - لا أعرف ما إذا كان ذلك ممكنا - حتى لو كانت كذلك، فهل تحتاج إلى امتيازات المسؤولين على الأقل.

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

ربما يمكن لسودو مساعدتك هنا، وإلا يجب أن تكون جذر لتنفيذ OS.Setuid

بدلا من ذلك، إذا كنت ترغب في الحصول على المتعة، يمكنك استخدام PEXPONE للقيام بأشياء شيء مثل هذا، يمكنك تحسين هذا

p = pexpect.spawn("su guest")
p.logfile = sys.stdout 
p.expect('Password:')
p.sendline("guest")

في مكان ما على طول الخط، ستحتاج بعض العملية أو غيرها إلى UID الفعال من 0 (الجذر)، لأن هذه العملية فقط يمكن أن تحدد UID الفعال إلى UID الأخرى.

في قذيفة، su القيادة هو برنامج جذر السويد؛ يتميز بشكل مناسب (Posix Jargon) ويمكن تعيين UID الحقيقي والفعال. وبالمثل، sudo يمكن أن تفعل الأمر نفس الوظيفة. مع sudo, ، يمكنك أيضا تكوين الأوامر والمسموح بها UID. الفرق الحاسم هو ذلك su يتطلب كلمة مرور المستخدم المستهدف تتيح لك؛ sudo يتطلب كلمة مرور المستخدم تشغيله.

بطبيعة الحال، هناك مسألة ما إذا كان يجب على المستخدم معرفة كلمات مرور المستخدمين الآخرين. بشكل عام، لا ينبغي لأي مستخدم معرفة كلمة مرور مستخدم آخر.

التغييرات البرمجة النصية UID أمر صعب. يمكنك ان تفعل:

su altuser -c "commands to execute as altuser"
sudo -u altuser commands to execute as altuser

لكن، su ستطلب كلمة مرور من محطة التحكم (وسوف تفشل إذا لم يكن هناك محطة مراقبة). إذا كنت تستخدم sudo, ، سوف تقوم ببيانات اعتماد ذاكرة التخزين المؤقت (أو يمكن تكوينها للقيام بذلك) حتى تسأل فقط مرة واحدة لكلمة مرور - لكنها ستوفر في المرة الأولى su يفعل.

العمل حول المطالبة صعبة. يمكنك استخدام الأدوات بالتوازي expect التي تعامل مع ttys pseudo لك. ومع ذلك، فإنك تواجه بعد ذلك بتخزين كلمات المرور في البرامج النصية (ليست فكرة جيدة) أو بطريقة أو بأخرى من مشهدها.


الأداة التي استخدمتها المهمة هي واحدة كتبت، ودعا asroot. وبعد يسمح لي بالتحكم في السموم UID و GID بدقة أن عملية الطفل يجب أن يكون لها. ولكن تم تصميمه لسماح لي فقط باستخدامه - وهذا هو، في وقت الترجمة، يتم تحديد اسم المستخدم المعتمد (بالطبع، يمكن تغييره). ومع ذلك، يمكنني القيام بأشياء مثل:

asroot -u someone -g theirgrp -C -A othergrp -m 022 -- somecmd arg1 ...

هذا يحدد UID الحقيقي والفعال UID "شخص ما"، يقوم بإزالة المجموعة الأساسية إلى "Mergrp"، ويزيل جميع المجموعات المستكدة، وتضيف "Outhorgrp" (وبالتالي فإن العملية تنتمي إلى مجموعتين فقط) وتعيين UMASK TO 0222؛ ثم ينفذ "Somecmd" مع الحجج المعينة.

بالنسبة لمستخدم معين يحتاج إلى الوصول المحدود (أو غير محدود للغاية) إلى حسابات المستخدمين الأخرى، يعمل هذا بشكل جيد. كحل عام، ليس حارا جدا؛ sudo أفضل في معظم النواحي، ولكن لا يزال يتطلب كلمة مرور (التي asroot لا).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top