0
votes

Comment écrire un fichier avec des privilèges sudo à Python?

Je veux écrire du contenu dans un fichier avec Python. L'emplacement du fichier est dans le chemin du répertoire racine: / etc / hosts

ci-dessous sont les autorisations de fichier xxx

Je veux mettre à jour ce fichier , et il ne peut être mis à jour que avec sudo . J'ai donc écrit le script suivant: xxx

mais je reçois la permission refusé l'erreur:

IOERROR: [ERGNO 13] Autorisation refusée: U '/ etc / hosts'

J'ai également essayé avec sous-processus: xxx

mais cela n'a pas encore fonctionné.

Comment puis-je résoudre ce problème?


4 commentaires

Vous devez exécuter le script Python avec sudo comme sudo python myscript.py


Vous obtenez déjà l'erreur d'autorisation lorsque vous essayez de lire.


Mon code entier est dans le même fichier et je n'exègre pas cela avec le terminal :)


@Dschoni Aucune lecture de fichier n'est effectuée avec succès mais ne pas écrire.


3 Réponses :


-1
votes

Vérifiez / etc / hosts autorisation de dossier ou fichier autorisation


2 commentaires

Cela a été donné dans la question. Et cela devrait être un commentaire si vous ne l'avez pas vu


J'ai besoin de la permission de sudo pour écrire ce dossier c'est pourquoi j'ai ajouté OS.System ('Echo% S | Sudo -s Python% S'% S '% ("ROOT", FW.WRITE (B)))



-1
votes

Votre script informatique peut revenir à Sudo s'il n'a pas de privilège. Le module PEXPPECT est nécessaire.

Par exemple: P>

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()


0 commentaires

-1
votes

La solution suivante a fonctionné pour moi enfin. J'ai créé un nouveau fichier appelé etedit.py code> qui écrira sur le fichier.

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 commentaires