我有一个我正在研究的Python应用程序需要访问hosts文件以附加几行。一切都在我的测试文件上工作,但是当我告诉程序实际修改/ etc / hosts中的hosts文件时,我得到IOError 13.根据我的理解,我的应用程序没有root权限。
我的问题是,我该如何绕过这个问题呢?有没有办法提示用户输入密码?如果我在Windows机器上运行应用程序,那么这个过程会有什么不同吗?
以下是相关代码:
f = open("/etc/hosts", "a")
f.write("Hello Hosts File!")
另外,我计划使用py2app和py2exe作为最终产品。他们会为我处理root权限问题吗?
答案 0 :(得分:6)
如果您在sudoers
列表中,则可以使用sudo
启动您的程序:
sudo python append_to_host.py
sudo以root权限运行你的python解释器。
第一次执行此操作时,系统会要求您输入 密码,以后的通话将不会询问您上一次sudo
电话是否很久以前。
在sudoers列表中(在大多数情况下/etc/sudoers
)表示管理员信任您。如果您致电sudo
,则系统不会要求您提供root
密码,而是您的密码。你必须证明合适的用户坐在终端上。
有关http://en.wikipedia.org/wiki/Sudo
的sudo
的更多信息
如果您想远程控制,可以使用-S
命令行开关或使用http://www.noah.org/wiki/pexpect
答案 1 :(得分:5)
处理此问题的最简单方法是将更改写入临时文件,然后运行程序覆盖受保护的文件。像这样:
with open('/etc/hosts', 'rt') as f:
s = f.read() + '\n' + '127.0.0.1\t\t\thome_sweet_home\n'
with open('/tmp/etc_hosts.tmp', 'wt') as outf:
outf.write(s)
os.system('sudo mv /tmp/etc_hosts.tmp /etc/hosts')
当你的Python程序运行sudo时,sudo程序会提示用户输入他/她的密码。如果您希望这是基于GUI的,您可以运行GUI sudo,例如“gksu”。
在Windows上,hosts文件被隐藏在\ Windows下的几个子目录中。您可以使用相同的一般技巧,但Windows没有sudo命令。以下是对等价物的讨论:
https://superuser.com/questions/42537/is-there-any-sudo-command-for-windows