2013-03-29 13 views
10

Pythonスクリプトでは、root権限が必要な操作をいくつか実行します。私はまた、私がrootによって排他的に所有されるのではなく、自分のスクリプトを実行しているユーザによって作成され、ファイルに書き出します。Pythonの特定の操作に対するroot権限の削除

通常、私はsudoを使用してスクリプトを実行します。上記を行う方法はありますか?

+0

はあなたがsudo' 'を実行している場合、' '__FILE__'の所有者にchown'あなたの後'done done – slezica

+0

@uʍopǝpısdnはい...そういうことをするのは、あなたがあまり注意を払わないとすばやくなります。 – thejh

+0

申し訳ありませんでした。すべてのファイルを作成するのはルートです(sudoの結果)。スクリプトを実行しているユーザーのユーザーIDを取得するにはどうすればよいですか? –

答えて

10

あなたはos.seteuid()を使用してのUIDの間で切り替えることができます。これは、os.setuid()とは異なり、必要なときにルート権限を得ることに戻ることができます。例えば

、rootとして次のコマンドを実行します。

import os 

open('file1', 'wc') 

# switch to userid 501 
os.seteuid(501) 
open('file2', 'wc') 

# switch back to root 
os.seteuid(0) 
open('file3', 'wc') 

これは、rootとしてfile1file3を作成しますが、file2 UID 501

を持つユーザーとして、あなたが呼び出しされているユーザーを判別したい場合それぞれのユーザーを

SUDO_USER 
SUDO_UID 

:2つの環境変数を設定sudoスクリプト、名前とsudoを呼び出したユーザーのuid。したがって、os.seteuid()と一緒に使用するにはint(os.environ['SUDO_UID'])を使用できます。

1

http://linux.die.net/man/8/sudo引用:
現実と実効uidとgidはそうターゲットユーザー

のものと一致するように設定されている、使用するユーザーを知る唯一のオプションは、いずれかの設定から、ターゲットユーザーを読むことですファイルまたはcmdlineオプション、または幾分ヒューリスティックな推測。

いわゆる「権利譲渡」と呼ばれるのが良いアイディアです。ルート特権で始まり、次に掘り下げたものを行います。その後、あまり特権のないユーザーになります。
あなたはそのためのosモジュールを使用します。 http://docs.python.org/2/library/os.html#os.setuid

1

os.seteuidとos.setegidを使用しても、実際にはroot権限が削除されていないことがわかりました。それらを呼び出した後、私はまだroot権限を必要とすることを実行することができました。働いていた私が見つけた解決策はos.setresuid使用することでしたし、代わりにos.setresgid:あなたは常にでき、

sudo_uid = int(os.getenv("SUDO_UID")) 
sudo_gid = int(os.getenv("SUDO_GID")) 

# drop root privileges 
os.setresgid(sudo_gid, sudo_gid, -1) 
os.setresuid(sudo_uid, sudo_uid, -1) 

subprocess.call("mkdir /foo1", shell = True) # should fail 

# regain root privileges 
os.setresgid(0, 0, -1) 
os.setresuid(0, 0, -1) 

subprocess.call("mkdir /foo2", shell = True) # should succeed 
関連する問題