Как написать файл с привилегиями sudo в Python? - PullRequest
0 голосов
/ 12 апреля 2019

Я хочу записать содержимое в файл с python.Расположение файла находится в пути к корневому каталогу: /etc/hosts

Ниже указаны права доступа к файлу

-rw-r--r--  1 root root

Я хочу обновить этот файл, и он может быть обновлен только с помощью Судо .Итак, я написал следующий скрипт:

path = "/etc/hosts"
fr = open(path,'r')
b = fr.read()
b = b+'something to write'
fr.close()
fw = open(path,'w')
fw = os.system('echo %s|sudo -S python %s' % ('root', fw.write(b)))

Но я получаю сообщение об ошибке «Отказано в доступе»:

IOError: [Errno 13] Отказано в доступе: u '/ etc / hosts'

Я также пытался с подпроцессом:

os.popen("sudo -S %s"%(open(path,'w')), 'w').write(admin_password)

Но это опять не сработало.

Как мне решить эту проблему?

Ответы [ 3 ]

0 голосов
/ 12 апреля 2019

Вы можете перезапустить скрипт с помощью sudo, если у него нет привилегий. нужен модуль pexpect.

Например:

import os
import pexpect
import sys
import argparse

def get_args():
    parser = argparse.ArgumentParser(description="Run as sudo!")
    parser.add_argument('-p', dest='privelege', action='store', help='also has rights')
    args = parser.parse_args()
    return vars(args)

full_path = os.path.abspath(__file__)
print("full_path = %s", full_path)

if __name__ == '__main__':
    args = get_args()
    if args.get('privelege') == None:
        #check if it has sudo privelege and if not rerun with it.
        child = pexpect.spawn("sh", logfile = sys.stdout)
        child.sendline("sudo python %s  -p root" % full_path)
        child.expect("assword", timeout = 100)
        child.logfile = None
        child.sendline("YOUR_PASSWORD")
        child.logfile_read = sys.stdout
    elif args.get('privelege') == 'root':
        #if it have root privelege do action
        path = "/etc/hosts"
        fr = open(path,'r')
        b = fr.read()
        b = b+'something to write'
        fr.close()
        fw = open(path,'w')
        fw.write(b)
        fw.close()

Если скрипт не имеет корневого привилегия, он запускает sh, а затем повторно запускает себя с помощью sudo.

0 голосов
/ 13 апреля 2019

Следующее решение сработало для меня, наконец.Я создал новый файл с именем etcedit.py, который будет записывать в файл.

os.system("echo %s| sudo -S python etcedit.py %s"  % ('rootpassword', 'host_name'))

My etcedit.py file

import os, subprocess
import sys
from sys import argv

def etc_update(host_name, *args):
    path = "/etc/hosts"
    host_name = host_name[0]
    fw = open(path,'w')
    fw.write(host_name)

etc_update(sys.argv[1:])

Это работает!

0 голосов
/ 12 апреля 2019

Проверьте / etc / hosts разрешение папки или файл разрешение

...