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