6

いくつかのスクリプトを起動するためのプラットフォームを構築しようとしています。このスクリプトは、各ユーザーのホーム フォルダーに配置されます。すべての起動は各ユーザー ID で行う必要があるため、ユーザーごとに次のようにしています。

user_id = pwd.getpwnam( user )[ 3 ]
user_home = pwd.getpwnam( user )[ 5 ]

os.chdir( user_home )
os.setuid( user_id )

subprocess.Popen( shlex.split( "user_script.py" ) )

しかし、Python がそれを行おうとすると、次のos.setuid( user_id )例外が発生します。

Traceback (most recent call last):
  File "launcher.py", line XX, in <module>

OSError: [Errno 1] Operation not permitted

ちなみに、このスクリプトを起動するユーザーは root グループ (GNU/linux OS 上) に属しており、すべての root 権限を持っています。

root ユーザーで同じコードを起動しようとすると、別のエラーが発生します。

OSError: [Errno 13] Permission denied

誰かが何が起こっているのかを理解するのを手伝ってくれるなら...

4

5 に答える 5

5

rootだけがsetuidを実行でき、rootグループにいるだけでは十分ではありません。

于 2011-09-23T12:58:56.900 に答える
2

uidを変更できるのは、スーパーユーザーだけです。ユーザーをルートグループに追加するだけでは不十分です。

setuid(2)たとえば、次のように言及します。

 The setuid() system call is permitted if the specified ID is equal to the
 real user ID or the effective user ID of the process, or if the effective
 user ID is that of the super user.

Linuxには、次のものもあります。

   Under Linux, setuid() is implemented like the POSIX version with the 
   _POSIX_SAVED_IDS feature.  This allows a set-user-ID (other than  root)
   program to drop all of its user privileges, do some un-privileged work, and
   then reengage the original effective user ID in a secure manner.

Pythonがこれを直接実装しているかどうかさえわかりませんが、とにかくそれはあなたが望むものではありません。

したがって、簡単な答えは次のとおりです。ルートとして初期プロセスを開始します。

セキュリティが心配な場合は、2つのプロセスを開始します。1つはrootとして、もう1つは非特権ユーザーとして開始し、非特権プロセスがソケットを使用してrootプロセスと通信するようにします。ただし、これはより高度な設定です...

于 2011-09-23T12:59:39.763 に答える
0

OSError: [Errno 1] Operation not permittedスクリプトを開始したユーザーの権限が不十分であることを示します。ルートグループにいるだけでは十分ではなく、実際にはCAP_SETUID機能が必要です。

OSError: [Errno 13] Permission deniedおそらく無関係のエラーです。そのスタックトレースを確認する必要があります。

于 2011-09-23T12:59:49.983 に答える
0

この線

subprocess.Popen( shlex.split( "user_script.py" ) )

さまざまな方法で私を混乱させます。

  1. shlex.split()分割するものがないため、は冗長なようです。
  2. Popen()のパラメータをリストに入れる方がよいでしょう。
  3. 実行権限がない場合user_script.pyは、rootでも実行できません。
于 2011-09-23T13:00:07.500 に答える
-1

setuid パーミッションも使用します。つまり、

       chmod 4755 script.py

これで一般ユーザーからでもプログラムを実行すればその用途に切り替わるようになります。権限の問題は発生しません。

于 2014-07-23T12:55:44.530 に答える