4

私が取り組んでいる Python アプリには、ホスト ファイルにアクセスして数行を追加する必要があります。私のテストファイルではすべてが機能しましたが、/etc/hosts のホストファイルを実際に変更するようにプログラムに指示すると、IOError 13 が発生します。私が理解していることから、私のアプリにはルート権限がありません。

私の質問は、どうすればこの問題を回避できますか? ユーザーにパスワードの入力を求める方法はありますか? Windows マシンでアプリを実行している場合、プロセスは異なりますか?

問題のコードは次のとおりです。

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

また、最終製品には py2app と py2exe を使用する予定です。ルート権限の問題を処理してくれますか?

4

2 に答える 2

7

これを処理する最も簡単な方法は、変更を一時ファイルに書き出し、プログラムを実行して保護されたファイルを上書きすることです。そのようです:

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 ベースにしたい場合は、「gksu」などの GUI sudo を実行できます。

Windows では、hosts ファイルは \Windows の下のいくつかのサブディレクトリに埋め込まれています。同じ一般的なトリックを使用できますが、Windows には sudo コマンドがありません。同等の議論は次のとおりです。

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

于 2011-09-22T07:43:54.907 に答える
6

リストに載っている場合はsudoers、次のコマンドでプログラムを開始できますsudo

 sudo python append_to_host.py

sudo は、root 権限で Python インタープリターを実行します。初めて電話をかけるときはパスワードを尋ねられますsudoが、それ以降の電話では、最後の電話がそれほど前ではないかどうかを尋ねられません.

sudoers リスト (ほとんどの場合/etc/sudoers) に登録されているということは、管理者があなたを信頼していることを示しています。電話をかけた場合、パスワードsudoは求められませんが、あなたのものです。root適切なユーザーが端末に座っていることを証明する必要があります。

詳細についてsudoは、http://en.wikipedia.org/wiki/Sudoを参照してください。

これをリモート制御したい場合は、-Sコマンド ライン スイッチを使用するか、http://www.noah.org/wiki/pexpectを使用できます。

于 2011-09-22T07:36:07.347 に答える