2009-06-11 12 views
0

os.system()モジュールを異なるUIDとして実行する方法が必要です。それは、次のBASHコードに似た動作をする必要があります(これらは、私が実行しています正確なコマンドではありません注意してください):Pythonで与えられたUIDとしてシェルコマンドを実行する

su user1 
ls ~ 
mv file1 
su user2 
ls ~ 
mv file1 

ターゲットプラットフォームはGNU Linuxのジェネリックです。

もちろん、これらをos.systemモジュールに渡すことはできますが、パスワードの送信方法は?もちろん、私はrootとしてスクリプトを実行することができましたが、それはやや不安定で不安です。

パスワードはプレーンテキストにする必要はありません。

+0

David CournapeauとMichiel Buddinghの両方には良い点がありました。スクリプトを実行するために、特権ユーザー(rootではなく)と組み合わせたos.seteuid()関数を使用します。 – Caedis

答えて

1

あなたが探している機能は、os.seteuidと呼ばれています。私は恐らくあなたがおそらくrootとしてスクリプトを実行してエスケープしないのではないかと思いますが、私はcapabilities(7)フレームワークを使って実行を少し垣間見せてユーザーを変えることができると思いますスーパーユーザーが行うことができるその他の事柄のいずれか。

PAMでこれを行うこともできます。しかし、一般的に言えば、これを行うための「すっきりした」方法はありません.David Cournapeauは、管理スクリプトが特権で動作するのは伝統的です。

+0

@Vyeこれはオススメではありません。有害な編集を控えてください。 – Erbureth

+0

良いキャッチです、ごめんなさい。 – Vye

3

私はそれが自明なことではないと思います。それぞれのコマンドが独自のプロセスで起動され、独自のIDを持つため、シェルで実行できます。しかし、Pythonでは、すべてがPythonの解釈済みプロセスのUIDを持ちます(もちろん、サブプロセスモジュールとCOを使用してサブプロセスを起動しないと仮定します)。プロセスのユーザーを変更する方法はわかりません。たとえそれが可能かどうかわかりません。たとえそれがあったとしても、少なくとも管理者権限が必要です。

正確に何をしようとしていますか?これは、例えば管理者の目的のために行うべき正しいことのようには聞こえません。一般に、adminスクリプトは特権ユーザで実行されます。なぜなら、誰もユーザ2のパスワード(理論上は)を知っていないからです。 rootであるということは、パスワードを要求せずにsuユーザーが常に「通常の」ユーザーのために働くことを意味します。

+0

あなたの権利では、特定の昇格された権限でスクリプトを実行できる別の特権ユーザーを作る方が理にかなっています。 rootとして実行するよりもクリーンな解決策。 – Caedis

2

多分sudoはあなたが、あなたがこの

の上に向上させることができますが、物事にこのような 何かをするpexpectを使用することができます楽しみたい場合はそうでなければ、代わりにos.setuid

を実行するには、rootである必要があり、ここであなたを助けることができます

p = pexpect.spawn("su guest") 
p.logfile = sys.stdout 
p.expect('Password:') 
p.sendline("guest") 
1

あるプロセスまたは他のプロセスは、有効なUIDを任意の他のUIDに設定できるため、有効なUIDが0(ルート)である必要があります。

シェルでは、suコマンドはSUIDルートプログラムです。それは適切な特権(POSIX専門用語)であり、実際のUIDと実効UIDを設定することができます。同様に、sudoコマンドは同じジョブを実行できます。 sudoを使用すると、許可するコマンドとUIDを設定することもできます。重大な相違点は、suでは、あなたのためにターゲットユーザのパスワードが必要であることです。 sudoには、それを実行しているユーザーのパスワードが必要です。

もちろん、ユーザーが他のユーザーのパスワードを知るべきかどうかという問題があります。一般に、ユーザーは他のユーザーのパスワードを知るべきではありません。

UIDを変更するのは難しいです。あなたは行うことができます。

su altuser -c "commands to execute as altuser" 
sudo -u altuser commands to execute as altuser 

をしかし、suは制御端末からパスワードを要求されます(と制御端末がない場合に失敗します)。 sudoを使用している場合は、資格情報をキャッシュに入れる(または設定することができます)ので、パスワードの入力は一度しか求められませんが、初めてsuのように表示されます。

プロンプトを回避する作業は難しいです。擬似ttyを扱うツールをexpectと並列に使うことができます。しかし、あなたはスクリプトにパスワードを格納することになっています(良い考えではありません)。または何とかそれらを見えなくしてしまいます。


私が仕事に使うツールは、asrootと書いたものです。子プロセスが持つ必要があるUIDとGIDの属性を正確に制御することができます。しかし、それは私がそれを使用できるようにのみ設計されています - つまり、コンパイル時に、許可されたユーザー名が指定されています(もちろん変更可能です)。

これは「誰か」に現実と効果的なUIDを設定します
asroot -u someone -g theirgrp -C -A othergrp -m 022 -- somecmd arg1 ... 

は、「theirgrp」にプライマリグループを設定し、すべての補助グループを削除し、「othergrp」(そのプロセスが追加されています。しかし、私のようなことを行うことができますちょうど2つのグループに属します)、umaskを0222に設定します。与えられた引数で 'somecmd'を実行します。

他のユーザーアカウントへのアクセスが制限されている(または制限されていない)特定のユーザーにとって、これはうまくいきます。一般的な解決策として、それほど熱くない。 sudoはほとんどの点で優れていますが、まだパスワードが必要です(asrootはありません)。

関連する問題