قم بتشغيل أمر نظام Linux كخطأ، باستخدام برنامج نصي Python

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

سؤال

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

sudo /usr/sbin/postmap /etc/postfix/virtual_alias 2>>/work/postfix_valias_errorfile
لكنني أحصل على الخطأ:
sudo: sorry, you must have a tty to run sudo

أريد تشغيل الأمر SUDO المذكور بطريقة غير إنسانية (معنى، أقوم بتشغيل أمر النظام هذا من برنامج نصي بيثون.). فكيف يمكنني تشغيل هذا الأمر برمجيا؟

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

المحلول

يمكنك إما تشغيل البرنامج النصي Python الخاص بك كجذر نفسه - فلن تحتاج إلى إضافة امتياز لإعادة تحميل PostFix.

أو يمكنك تكوين SUDO لعدم الحاجة إلى كلمة مرور ل /etc/init.d/postfix.

يتيح تكوين Sudo (Via Visudo) NOPASSWD: للسماح للأمر بدون كلمة مرور. يرى http://www.sudo.ws/sudo/man/sudoers.html#nopasswd_and_passwd.

<username>  ALL = NOPASSWD: /etc/init.d/postfix

أو شيئا من هذا القبيل.

نصائح أخرى

#include <unistd.h>
#include <stdlib.h>

// gcc -o reload_postfix reload_postfix.c
// chown root reload_postfix
// chmod +s reload_postfix

int main( int argc, char **argv ) {
    setuid( geteuid() );
    system("/etc/init.d/postifx reload");
}

لف الأمر الخاص بك في برنامج setuid-ed. سيتيح هذا أي مستخدم إعادة تشغيل postfix. يمكنك بالطبع مزيد من تقييد إذن تنفيذ مجموعات معينة.

للإجابة على الخطأ: "Sudo: عذرا، يجب أن يكون لديك Tty لتشغيل Sudo"، لدينا إعداد يسمى "متتابع الإعدادات الافتراضية" في ملف Sudoers. حاولت التعليق عليها وعملت: د.

import os
os.popen("sudo -S /etc/init.d/postifx reload", 'w').write("yourpassword")

هذا بالطبع ليس دائما فكرة جيدة مثل كلمة المرور في نص عادي.

إذا كنت ستفعل هذا في بيثون، يجب عليك فقط القيام بما يلي:

اكتب هذا الأمر قبل السطر الذي تسميه أمر Shell

os.setuid(os.geteuid())

ثم، يمكنك استدعاء الأمر Shell بدون بادئة "SUDO"

يرى stacklick.

تحتاج إلى منح المستخدم لتشغيل سودو القيادة بدون كلمة مرور.

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