1

こんにちは、アプリケーション構成ファイルを変更する Python スクリプトがあります。これを適用するには、アプリケーションを再起動する必要があります。そのために、init.d ファイルを呼び出します。ただし、このアクションを実行するときは root である必要があります。そうしないと、アプリケーションは彼女をポートにバインドできません。また、ルートの権限ですべての Python スクリプトを実行したくありません。root 権限で再起動を実行してから削除するにはどうすればよいですか。

最初にユーザー権限を次のように設定しました。

if __name__ == "__main__":
    uid = pwd.getpwnam('ubuntu')[2]
    os.setuid(uid)
    app.run(host='0.0.0.0', port=5001, debug=True)

スクリプトの最後で、次を実行する必要があります。

commands.getoutput('/etc/init.d/webapplication restart')

webapplication はポート 80 でバインドします。

この構成でスクリプトを実行すると、webapplication が起動できず、"cannot bind socket on the 80" というメッセージが返されます。

何か案が?pythonスクリプトの下でDebianサーバー上でroot権限で外部コマンドを1つだけ実行するクリーンなソリューションを手に入れるには?

事前に感謝します。

PS: メイン関数と同じ方法を使用しようとしましたが、ユーザー「ubuntu」を「root」に置き換えましたが、うまくいきません。

4

2 に答える 2

0

次の2つのアプローチのいずれかを使用できます。

  1. スクリプトを実行することが唯一の仕事であるプログラムを作成し、init.dそれをsetuidrootにします。(しっかりと書いてください!)。メインスクリプトは通常のユーザー権限で実行され、ランナーを呼び出します。

  2. プログラムが自身の特権をエスカレートする方法はありませんが(sudo少なくともアプローチ1と同じくらい高価なを実行することを除いて)、rootとして実行されているプログラムはそれ自体をエスカレート解除できます。したがって、rootとしていくつかの手順を実行してから、uidを実際のuidに設定することにより、通常のユーザーとして続行できます。ただし、プログラムが最後に実行するためにroot権限が必要な場合、これは役に立ちません。

于 2013-03-03T00:08:02.610 に答える
0

最終的に目標を達成するために、sudo ソリューションを使用しました。Debian サーバーでこれを行うには:

apt-get install sudo
Edit: /etc/sudoers
Add line: my_user(uses for the setuid) ALL = NOPASSWD : /etc/init.d/webapplication
And in my python script:
commands.getoutput('sudo /etc/init.d/webapplication restart')    

そして、それは機能します。

于 2013-03-04T13:58:19.843 に答える