تشغيل أمر كمستخدم فائق من البرنامج النصي Python

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

  •  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())
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top