IOError: 13,'权限拒绝',通过Python写入/etc/hosts时
我正在开发一个Python应用程序,需要访问主机文件(hosts file)来添加几行内容。在我的测试文件上,一切都运行得很好,但当我让程序实际修改位于 /etc/hosts 的主机文件时,出现了IOError 13。根据我的理解,我的应用程序没有管理员权限。
我想问的是,怎么才能解决这个问题呢?有没有办法提示用户输入他们的密码?如果我在Windows机器上运行这个应用,过程会有什么不同吗?
以下是相关的代码:
f = open("/etc/hosts", "a")
f.write("Hello Hosts File!")
另外,我打算使用py2app和py2exe来制作最终产品。它们会帮我处理管理员权限的问题吗?
2 个回答
如果你在 sudoers
列表上,你可以用 sudo
来启动你的程序:
sudo python append_to_host.py
使用 sudo
可以让你的 Python 解释器以管理员权限运行。第一次使用的时候,系统会要求你输入 自己的 密码,以后如果你在不久前已经用过 sudo
,就不会再问你了。
在 sudoers
列表上(通常是 /etc/sudoers
)意味着管理员信任你。当你使用 sudo
时,系统不会要求你输入管理员的密码,而是要求你输入自己的密码。这样做是为了确认是你本人在使用这个终端。
想了解更多关于 sudo
的信息,可以访问 http://en.wikipedia.org/wiki/Sudo
如果你想远程控制这个过程,可以使用 -S
命令行选项,或者查看 http://www.noah.org/wiki/pexpect
处理这个问题最简单的方法是先把你的修改写到一个临时文件里,然后再运行一个程序来覆盖掉受保护的文件。就像这样:
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程序会提示用户输入密码。如果你想要图形界面的方式,可以使用一个图形化的sudo,比如“gksu”。
在Windows系统中,hosts文件藏在\Windows的几个子目录下。你可以用类似的方法,但Windows没有sudo这个命令。这里有一个关于替代方法的讨论:
https://superuser.com/questions/42537/is-there-any-sudo-command-for-windows