Pythonで与えられたUIDとしてシェルコマンドを実行します
-
13-09-2019 - |
質問
私は別のUIDのようos.system()モジュールを実行するための方法が必要です。これは、(これらは、私が実行しています正確なコマンドはありません注意してください)以下のBASHコードに似た振る舞いをする必要があります:
su user1
ls ~
mv file1
su user2
ls ~
mv file1
ターゲットプラットフォームはGNU Linuxの総称です。
もちろん私はos.systemモジュールにこれらを渡すこともできますが、パスワードを送信するためにどのように?もちろん、私は、rootとしてスクリプトを実行することができ、それはずさんな安全でないです。
好ましく私はプレーンテキストであることを任意のパスワードを必要とせずにしたいと思っています。
解決
あなたが探している機能をos.seteuid
と呼ばれています。やるではない - 私はあなたがおそらくどのような場合には、rootとしてスクリプトを実行逃れられないだろうが、私はそれがユーザーを変更することができるようにあなたは、実行「にフェンス」に少しcapabilities(7)
フレームワークを使用することができると思う怖いです他のもののいずれかのスーパーユーザーことができます。
また、あなたはをはPAMでこれを行うことができるかもしれません。しかし、一般的に言えば、そこにこれを行うには「きちんと」道ません、とDavid Cournapeauがadminスクリプトは権限で実行することが伝統的だという絶対的に正しいです。
他のヒント
私はそれが簡単ではないと思う:各コマンドが独自のIDを持っている独自のプロセスの中に起動されるので、あなたがシェルでそれを行うことができます。しかし、パイソンと、すべてが(もちろん、あなたがサブプロセスモジュールとの共同を使用してサブプロセスを起動していないと仮定した場合)のpython解釈プロセスのUIDを持つことになります。私は、プロセスのユーザーを変更する方法を知っていない - それも可能だ場合、私は知らない - 。それがあったとしても、あなたは、少なくとも管理者権限が必要になります。
あなたは何を正確にやろうとしていますか?これは、例えば、管理目的のために行うには正しいことのような音はありません。一般的に、管理スクリプトはpriviledgeユーザーで実行 - 誰もが(理論的に)利用者2を除いて、ユーザ2のパスワードを知っているので。ビーイングルートは、suユーザーが常にパスワードを要求せず、「通常」のユーザのために働くことを意味する。
多分sudoはそうあなたがos.setuid実行するには、rootである必要があり、ここであなたを助けることができます。
あなたが楽しみを持っているしたい場合は、その代わりに、あなたは物事を行うにはpexpectを使用することができます このようなものは、あなたがこの上で改善することができます。
p = pexpect.spawn("su guest")
p.logfile = sys.stdout
p.expect('Password:')
p.sendline("guest")
どこかのラインに沿って、いくつかのプロセスまたは他ののみ、そのようなプロセスは、任意の他のUIDに有効なUIDを設定することができるので、0(ルート)の有効なUIDを必要としようとしている。
シェルでは、su
コマンドはSUIDルートプログラムです。それは、(POSIX専門用語)を適切特権があり、現実と実効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
がするよう初めてを促すメッセージが表示されます。
プロンプトを中心に作業することは困難です。あなたはあなたのための擬似ttysのを扱うexpect
にツールを平行に使用することができます。しかし、あなたはその後、視界の外にそれらをスタッシュ何とか(ない良いアイデア)のスクリプトでパスワードを保存するかに直面しています。
私は仕事のために使用するツールは、私が書いたものです、asroot
と呼ばれます。それは正確にUIDとGIDは、子プロセスが持つべき属性私が制御することができます。 (変更することができる、もちろん)つまり、コンパイル時に、許可ユーザ名が指定されている - しかし、私だけがそれを使用できるように設計されています。しかし、私はのようなものを行うことができます:
asroot -u someone -g theirgrp -C -A othergrp -m 022 -- somecmd arg1 ...
これは、「誰か」に現実と効果的なUIDを設定し、「theirgrp」にプライマリグループを設定し、すべての補助グループを削除し、「othergrp」追加(そのプロセスがちょうど2つのグループに属している)と0222へのumaskを設定し、 ;それは、与えられた引数を持つ「somecmd」を実行します。
は、他のユーザーアカウントに(そのように限定されるものではないか)制限されたアクセスを必要とする特定のユーザーにとって、これはうまく動作します。一般的な解決策として、それはとても暑いではありません。 sudo
は、ほとんどの点で優れているが、それでも(asroot
にはない)パスワードが必要です。