【问题标题】:IOError: 13, 'Permission denied' when writing to /etc/hosts via PythonIOError:13,通过 Python 写入 /etc/hosts 时出现“权限被拒绝”
【发布时间】:2011-11-22 13:29:15
【问题描述】:

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

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

这是有问题的代码:

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

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

【问题讨论】:

    标签: python io privileges sudo hosts-file


    【解决方案1】:

    如果您在sudoers 列表中,您可以使用sudo 开始您的计划:

     sudo python append_to_host.py
    

    sudo 以 root 权限运行你的 python 解释器。 第一次这样做时,系统会要求您提供您的密码,以后的电话将不会询问您上一次sudo 电话是否是不久前。

    在 sudoers 列表中(大多数情况下为/etc/sudoers)表示管理员信任您。如果您致电sudo,则不会要求您提供root 密码,而是您的密码。您必须证明正确的用户坐在终端上。

    更多关于sudohttp://en.wikipedia.org/wiki/Sudo

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

    【讨论】:

    • 谢谢,但理想情况下,我希望避免要求用户以 sudo 身份运行脚本。如果我有他们的密码,有没有办法在后台为他们做这件事?
    • 我对 'sudo -S' 做了更多研究,似乎我可以用它来将用户提供的密码传递到系统上。谢谢!
    【解决方案2】:

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

    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

    【讨论】:

    • 谢谢,这已经接近我需要的了。该脚本是图形的,那么有什么方法可以将字符串传递给系统进行身份验证?我想避免让用户输入终端
    • 如果您按照我的建议运行 gksu,那么它将在 GUI 对话框中提示用户。如果你运行普通的“sudo”,那么终端会提示。
    • 抱歉,由于某种原因我没听懂。但是,我没有 gksu,你知道 QT 可能有什么类似的东西吗?
    • 我没有,但我刚刚在 Google 上搜索“QT 等同于 sudo”,然后我发现了这个 Wikipedia 页面:en.wikipedia.org/wiki/… 看起来“kdesu”或“kdesudo”可能适合你.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-11
    • 2013-05-02
    • 2017-11-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多