IOError: 13, "Отказано в доступе" при записи в /etc/hosts через Python

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

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

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

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

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

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 запросит у пользователя пароль. Если вы хотите, чтобы это основывалось на графическом интерфейсе, вы можете запустить sudo с графическим интерфейсом, например, "gksu".

В Windows файл hosts похоронен в нескольких подкаталогах в папке \Windows. Вы можете использовать тот же общий прием, но Windows не имеет команды sudo. Вот обсуждение эквивалентов:

https://superuser.com/questions/42537/is-there-any-sudo-command-for-windows

Если вы находитесь на 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

Другие вопросы по тегам