当使用Python写入/etc/hosts文件时出现IOError: 13,“Permission denied”错误。

4
我有一个Python应用程序,需要访问hosts文件并追加几行内容。在测试文件上一切正常,但当我让程序实际修改位于/etc/hosts的hosts文件时,我遇到了IOError 13错误。据我所知,我的应用程序没有root权限。
我的问题是,如何避开这个问题?有办法提示用户输入密码吗?如果我在Windows机器上运行该应用程序,过程会有任何不同吗?
以下是相关代码:
f = open("/etc/hosts", "a")
f.write("Hello Hosts File!")

另外,我计划在最终产品中使用py2app和py2exe。它们能为我处理好根权限问题吗?

2个回答

8
最简单的方法是将更改写入临时文件,然后运行程序覆盖受保护的文件。就像这样:
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


谢谢,这已经接近我需要的了。不过脚本是图形化的,有没有办法将字符串传递给系统进行身份验证?我想避免用户在终端中输入。 - Parker
1
如果按照我的建议运行gksu,它会在GUI对话框中提示用户。如果运行普通的“sudo”,那么它会在终端中提示。 - steveha
抱歉,由于某些原因我没有听懂。但是,我没有gksu,你知道QT中类似的工具吗? - Parker
1
我不确定,但我刚刚在Google上搜索了“QT相当于sudo”,并找到了这个维基百科页面:http://en.wikipedia.org/wiki/Comparison_of_privilege_authorization_features。看起来“kdesu”或“kdesudo”可能适合你。 - steveha

5

如果您在sudoers列表中,可以使用sudo启动您的程序:

 sudo python append_to_host.py

sudo可以以root权限运行你的python解释器。第一次使用时,会要求您输入您的密码,如果您最近的sudo调用不太久,则后续调用将不会再要求您输入密码。

在sudoers列表中(在大多数情况下是/etc/sudoers),代表管理员信任您。如果您调用sudo,您将不会被要求输入root密码,而是需要输入您自己的密码。您必须证明正确的用户坐在终端前。

有关sudo的更多信息,请参见http://en.wikipedia.org/wiki/Sudo

如果您想进行远程控制,可以使用-S命令行开关或使用http://www.noah.org/wiki/pexpect


谢谢,但理想情况下我希望避免要求用户以sudo身份运行脚本。如果我有他们的密码,是否有办法在后台为他们完成这个操作? - Parker
我对“sudo -S”进行了更多的研究,似乎这是我可以使用的方法将用户提供的密码传递给系统。谢谢! - Parker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接