جدولة مجموعة Linux للمستخدم لا يتم تطبيقها على عملية Setuid-ed

StackOverflow https://stackoverflow.com/questions/1920952

سؤال

في 2.6.28-11 Linux Kernel، أنا أستخدم SetPriority للتحيز مقدار العمليات المعالجة المركزية عمليات المستخدم المختلفة تلقيها. المستخدم 1 هو الحصول على ضعف قوة وحدة المعالجة المركزية للمستخدم 2. استخدام SetPriority Linux، لقد قمت بتعيين المستخدم 2 أولوية أقل (أعلى من حيث القيم الجميلة). عندما أقوم بتشغيل نفس البرنامج بالضبط عبر Shell باستخدام الكمبيوتر قيد التحميل، يستغرق تنفيذ المستخدم 2 مرتين طالما المستخدم 1. ومع ذلك، إذا قمت بتشغيل البرنامج كجذر، ثم استخدم Setuid و Seteuid و SetGID و Setegid و SetGroups لتصبح المستخدم 2 (مرة أخرى يتم تحميل الكمبيوتر مع نفس البرنامج بالضبط يديره المستخدم 1 بنفس الطريقة) ، تأخذ البرامج نفس القدر من الوقت للتنفيذ؛ لم يتم جدولة عملية المستخدم 2 أي أقل من المستخدم 1. كيف يمكنني الحصول على هذا؟ هل أحتاج إلى تعيين أي شيء آخر للحصول على جدولة لإدراك أن العملية هي الآن جزء من مستخدم مختلف؟

البرنامج قيد التشغيل في بيثون.

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

المحلول

صحيح، هذا هو السلوك المصمم، حتى لو لم يكن ما تريد. يمكنك تحديث أولويتك الخاصة لتتناسب مع ما يجب أن تراثه، إذا بدأت عادة:

/* C */
#include <sys/resource.h>
int proc_prio = getpriority(PRIO_PROCESS, getpid()),
    pgrp_prio = getpriority(PRIO_PGRP, getpgrp()),
    user_prio = getpriority(PRIO_USER, getuid());
setpriority(PRIO_PROCESS, getpid(),
    proc_prio < pgrp_prio ? pgrp_prio < user_prio ? user_prio
                                                  : pgrp_prio
                          : proc_prio < user_prio ? user_prio
                                                  : proc_prio);

# Python
import ctypes
import os
PRIO_PROCESS, PRIO_PGRP, PRIO_USER = 0, 1, 2
libc = ctypes.CDLL('libc.so.6')
libc.setpriority(PRIO_PROCESS, os.getpid(),
    max(libc.getpriority(PRIO_PROCESS, os.getpid()),
        libc.getpriority(PRIO_PGRP, os.getpgrp()),
        libc.getpriority(PRIO_USER, os.getuid())))

أو بالطبع يمكنك إصلاح أولوية عملية أخرى، مع امتيازات مناسبة.

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