تشغيل أمر كمستخدم فائق من البرنامج النصي Python
-
05-09-2019 - |
سؤال
لذلك أحاول الحصول على عملية يجب تشغيلها كمستخدم فائق من داخل البرنامج النصي Python باستخدام Subprocess. في قذيفة ipython شيء مثل
proc = subprocess.Popen('sudo apach2ctl restart',
shell=True, stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
يعمل بشكل جيد، ولكن بمجرد أن ألصقه في برنامج نصي أبدأ الحصول على: sudo: apach2ctl: command not found
.
أعتقد أن هذا يرجع إلى طريقة مقابض Sudo البيئات على أوبونتو. (لقد حاولت أيضا sudo -E apche2ctl restart
و sudo env path=$PATH apache2ctl restart
دون جدوى)
لذلك سؤالي هو أساسا، إذا كنت أريد تشغيل apache2ctl restart
كمستخدم فائق يطالب المستخدم بكلمة مرور المستخدم السوبر عند الاقتضاء، كيف يجب أن أذهب في القيام بذلك؟ ليس لدي أي نية لتخزين كلمات المرور في البرنامج النصي.
يحرر:
لقد حاولت تمرير الأوامر كسلسلة وتمزيقها إلى قائمة. في مترجم الثعبان، مع سلسلة سأحصل على موجه كلمة المرور بشكل صحيح (لا يزال لا يعمل في برنامج نصي ثعبان كما في مشكلتي الأصلية)، تقدم قائمة فقط شاشة المساعدة لسودو.
تحرير 2:
إذن ما أجمعه هو أنه في حين أن البابا سيعمل مع بعض الأوامر تماما كسلاسل عندما Shell = TRUE، فإنه يأخذ
proc = subprocess.Popen(['sudo','/usr/sbin/apache2ctl','restart'])
بدون "shell = true" للحصول على sudo للعمل.
شكرا!
المحلول
حاول إعطاء المسار الكامل إلى Apache2CTL.
نصائح أخرى
يحاول:
subprocess.call(['sudo', 'apach2ctl', 'restart'])
يحتاج البرنامج الفرعي إلى الوصول إلى Stdin / Out / ERR للحصول عليه لتتمكن من مطالبةك، وقراءة كلمة المرور الخاصة بك. إذا قمت بإعدادها كأنابيب، فأنت بحاجة إلى إطعام كلمة المرور في هذا الأنابيب بنفسك.
إذا كنت لا تحددها، فمن الاستيلاء على SYS.STDOUT، إلخ ...
هناك طريقة أخرى هي جعل المستخدم الخاص بك كلمة مرور أقل sudo user
.
اكتب سطر الأوامر التالي:
sudo visudo
ثم أضف ما يلي واستبدال <username>
معك:
<username> ALL=(ALL) NOPASSWD: ALL
هذا سيسمح للمستخدم بالتنفيذ sudo
أمر دون الحاجة إلى طلب كلمة المرور (بما في ذلك التطبيق الذي أطلقه المستخدم المذكور. قد يكون هذا مخاطرة أمنية
يجب عليك استخدام Popen مثل هذا:
cmd = ['sudo', 'apache2ctl', 'restart']
proc = subprocess.Popen(cmd, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
تتوقع قائمة.
اعتدت هذا لبثيون 3.5. فعلت ذلك باستخدام subprocess. وحدة.Using كلمة المرور مثل هذا جدا غير آمن.
ال subprocess. يحمل الوحدة النمطية كقائمة من السلاسل، لذلك إما إنشاء قائمة مسبقا باستخدام الانقسام() أو اجتياز القائمة بأكملها في وقت لاحق. اقرأ الوثائق لمزيد من المعلومات.
ما نفعله هنا هو تردد كلمة المرور ثم استخدام يضخ ننقلها إلى SUDO من خلال حجة "-s".
#!/usr/bin/env python
import subprocess
sudo_password = 'mysecretpass'
command = 'apach2ctl restart'
command = command.split()
cmd1 = subprocess.Popen(['echo',sudo_password], stdout=subprocess.PIPE)
cmd2 = subprocess.Popen(['sudo','-S'] + command, stdin=cmd1.stdout, stdout=subprocess.PIPE)
output = cmd2.stdout.read().decode()
حاولت كل الحلول، لكنها لم تنجح. أراد تشغيل المهام الجارية الطويلة مع الكرفس ولكن بالنسبة لهؤلاء كنت بحاجة إلى تشغيل أمر Sudo Chown مع SubProcess.Call ().
هذا هو ما عمل لي:
لإضافة متغيرات بيئة آمنة، في سطر الأوامر، اكتب:
export MY_SUDO_PASS="user_password_here"
لاختبار ما إذا كان نوع العمل:
echo $MY_SUDO_PASS
> user_password_here
لتشغيله عند بدء تشغيل النظام إضافته إلى نهاية هذا الملف:
nano ~/.bashrc
#.bashrc
...
existing_content:
elif [ -f /etc/bash_completion ]; then
. /etc/bash_completion
fi
fi
...
export MY_SUDO_PASS="user_password_here"
يمكنك إضافة كل ما تبذلونه من كلمات كلمات المرور، أسماء المستخدمين، المضيف، إلخ هنا في وقت لاحق.
إذا كانت المتغيرات الخاصة بك جاهزة، يمكنك تشغيل:
للتحديث:
echo $MY_SUDO_PASS | sudo -S apt-get update
أو لتثبيت قائد منتصف الليل
echo $MY_SUDO_PASS | sudo -S apt-get install mc
لبدء قائد منتصف الليل مع sudo
echo $MY_SUDO_PASS | sudo -S mc
أو من قذيفة بيثون (أو django / celery)، لتغيير ملكية الدليل بشكل متكرر:
python
>> import subprocess
>> subprocess.call('echo $MY_SUDO_PASS | sudo -S chown -R username_here /home/username_here/folder_to_change_ownership_recursivley', shell=True)
آمل أن يساعد.
الطريقة الأكثر أمانا للقيام بذلك هي مطالبة بكلمة المرور مسبقا ثم توجيهها إلى الأمر. ستفعل كلمة المرور لتجنب وجود كلمة المرور المحفوظة في أي مكان في التعليمات البرمجية الخاصة بك ولن تظهر أيضا في سجل باش. إليك مثال:
from getpass import getpass
from subprocess import Popen, PIPE
password = getpass("Please enter your password: ")
# sudo requires the flag '-S' in order to take input from stdin
proc = Popen("sudo -S apach2ctl restart".split(), stdin=PIPE, stdout=PIPE, stderr=PIPE)
# Popen only accepts byte-arrays so you must encode the string
proc.communicate(password.encode())