如何在 Python 中使用 sudo 权限写入文件?
How to write a file with sudo privileges in Python?
我想用 python 将内容写入文件。该文件的位置在根目录路径中:/etc/hosts
以下是文件权限
-rw-r--r-- 1 root root
我想更新这个文件,只能用sudo更新。所以我写了下面的脚本:
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] Permission denied: u'/etc/hosts'
我也试过子进程:
os.popen("sudo -S %s"%(open(path,'w')), 'w').write(admin_password)
但这又没用。
我该如何解决这个问题?
检查/etc/hosts文件夹权限或文件权限
如果没有权限,您可以使用 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()
如果脚本没有 root 权限,它 运行 sh 而不是 re运行 self with sudo。
以下解决方案最终对我有用。我创建了一个名为 etcedit.py
的新文件,它将写入该文件。
os.system("echo %s| sudo -S python etcedit.py %s" % ('rootpassword', 'host_name'))
我的etcedit.py文件
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:])
这有效!
我想用 python 将内容写入文件。该文件的位置在根目录路径中:/etc/hosts
以下是文件权限
-rw-r--r-- 1 root root
我想更新这个文件,只能用sudo更新。所以我写了下面的脚本:
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] Permission denied: u'/etc/hosts'
我也试过子进程:
os.popen("sudo -S %s"%(open(path,'w')), 'w').write(admin_password)
但这又没用。
我该如何解决这个问题?
检查/etc/hosts文件夹权限或文件权限
如果没有权限,您可以使用 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()
如果脚本没有 root 权限,它 运行 sh 而不是 re运行 self with sudo。
以下解决方案最终对我有用。我创建了一个名为 etcedit.py
的新文件,它将写入该文件。
os.system("echo %s| sudo -S python etcedit.py %s" % ('rootpassword', 'host_name'))
我的etcedit.py文件
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:])
这有效!