Pythonスクリプトでは、root権限が必要な操作をいくつか実行します。私はまた、私がrootによって排他的に所有されるのではなく、自分のスクリプトを実行しているユーザによって作成され、ファイルに書き出します。Pythonの特定の操作に対するroot権限の削除
通常、私はsudo
を使用してスクリプトを実行します。上記を行う方法はありますか?
Pythonスクリプトでは、root権限が必要な操作をいくつか実行します。私はまた、私がrootによって排他的に所有されるのではなく、自分のスクリプトを実行しているユーザによって作成され、ファイルに書き出します。Pythonの特定の操作に対するroot権限の削除
通常、私はsudo
を使用してスクリプトを実行します。上記を行う方法はありますか?
あなたは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としてfile1
とfile3
を作成しますが、file2
UID 501
を持つユーザーとして、あなたが呼び出しされているユーザーを判別したい場合それぞれのユーザーを
SUDO_USER
SUDO_UID
:2つの環境変数を設定sudo
スクリプト、名前とsudo
を呼び出したユーザーのuid。したがって、os.seteuid()
と一緒に使用するにはint(os.environ['SUDO_UID'])
を使用できます。
http://linux.die.net/man/8/sudo引用:
現実と実効uidとgidはそうターゲットユーザー
のものと一致するように設定されている、使用するユーザーを知る唯一のオプションは、いずれかの設定から、ターゲットユーザーを読むことですファイルまたはcmdlineオプション、または幾分ヒューリスティックな推測。
いわゆる「権利譲渡」と呼ばれるのが良いアイディアです。ルート特権で始まり、次に掘り下げたものを行います。その後、あまり特権のないユーザーになります。
あなたはそのためのosモジュールを使用します。 http://docs.python.org/2/library/os.html#os.setuid
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
はあなたがsudo' 'を実行している場合、' '__FILE__'の所有者にchown'あなたの後'done done – slezica
@uʍopǝpısdnはい...そういうことをするのは、あなたがあまり注意を払わないとすばやくなります。 – thejh
申し訳ありませんでした。すべてのファイルを作成するのはルートです(sudoの結果)。スクリプトを実行しているユーザーのユーザーIDを取得するにはどうすればよいですか? –