IOError: 13, «Отказано в доступе» при записи в / etc / hosts через Python - PullRequest
4 голосов
/ 22 сентября 2011

У меня есть приложение на Python, над которым я работаю, которому нужно получить доступ к файлу hosts, чтобы добавить несколько строк. Все работало с моим тестовым файлом, но когда я сказал программе фактически изменить мой файл hosts в / etc / hosts, я получил IOError 13. Из того, что я понимаю, мое приложение не имеет привилегий root.

Мой вопрос: как я могу обойти эту проблему? Есть ли способ запросить у пользователя пароль? Изменился бы процесс, если бы я запускал приложение на компьютере с Windows?

Вот код, о котором идет речь:

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

Кроме того, я планирую использовать py2app и py2exe для конечного продукта. Могут ли они решить проблему с привилегиями суперпользователя?

Ответы [ 2 ]

6 голосов
/ 22 сентября 2011

Если вы находитесь в списке sudoers, вы можете начать свою программу с sudo:

 sudo python append_to_host.py

sudo запускает ваш интерпретатор python с правами root. В первый раз, когда вы это сделаете, вам будет предложено ввести ваш пароль, но при последующих вызовах вы не будете спрашивать, не последний ли ваш последний звонок sudo был давно.

Наличие в списке sudoers (в большинстве случаев /etc/sudoers) говорит о том, что администратор доверяет вам. Если вы звоните sudo, вас спрашивают не пароль root, а ваш. Вы должны доказать, что на терминале сидит нужный пользователь.

Подробнее о sudo о http://en.wikipedia.org/wiki/Sudo

Если вы хотите дистанционно управлять этим, вы можете использовать переключатель командной строки -S или http://www.noah.org/wiki/pexpect

5 голосов
/ 22 сентября 2011

Самый простой способ справиться с этим - записать ваши изменения во временный файл, а затем запустить программу для перезаписи защищенного файла.Например:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...