4

我有一个正在开发的 Python 应用程序,它需要访问主机文件以附加几行。一切都在我的测试文件上运行,但是当我告诉程序实际修改 /etc/hosts 中的主机文件时,我得到 IOError 13。据我了解,我的应用程序没有 root 权限。

我的问题是,我该如何绕过这个问题?有没有办法提示用户输入密码?如果我在 Windows 机器上运行应用程序,这个过程会有什么不同吗?

这是有问题的代码:

f = open("/etc/hosts", "a")
f.write("Hello Hosts File!")

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

4

2 回答 2

7

处理此问题的最简单方法是将您的更改写入临时文件,然后运行程序覆盖受保护的文件。像这样:

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

于 2011-09-22T07:43:54.907 回答
6

如果你在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

于 2011-09-22T07:36:07.347 回答