8

スクリプト実行のために現在のユーザーを変更したかった。これは私がしました

import os
newuid = pwd.getpwnam('newuser').pw_uid
os.setuid(newuid)    
print('User :' + getpass.getuser());

私はまだ得てrootいます。これより良い方法はありますか?ユーザーを一度切り替えてから、その新しいユーザーでスクリプト内の残りのコマンドの実行を続行します。

4

2 に答える 2

5

getpass.getuser()現在のユーザーを取得するためにgetuid()orを使用しません。geteuid()

http://docs.python.org/3/library/getpass.html#getpass.getuser

この関数は、環境変数 LOGNAME、USER、LNAME、および USERNAME を順番にチェックし、空でない文字列に設定されている最初の変数の値を返します。何も設定されていない場合、pwd モジュールをサポートするシステムでは、パスワード データベースからのログイン名が返されます。それ以外の場合は、例外が発生します。

于 2013-09-19T14:05:59.950 に答える
1

モジュールossubprocess、を試した後getpass、問題はユーザーが設定されているかどうかではないことに気付きました。ユーザーは を使用して設定または変更されますが、 、os.setuidのようなモジュールからユーザー名を取得するメソッドは、実際にはユーザー名を適切に取得しません。シェル コマンドを実行するか、またはを使用すると、変更されたユーザーが取得されます。これらは私にとって少し困惑した出力です。以下は、これらすべての奇妙な動作を示すスクリプトです。os.getlogin()getpass.getuser()whoamiidsubprocess.Popen()os.system()

import os
import subprocess
import pwd
import getpass

#os.chdir("/tmp")

#uid = pwd.getpwnam('newuser').pw_uid

os.setuid(500)     # newuser's id found from shell cmd line

print os.getuid()

p = subprocess.Popen(['id'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)

out, err = p.communicate()

# print os.system('useradd newuser1') # Try this commenting, it will not create, and then  try commenting above line of setuid. i.e. it will become root, and then see the change.

# print os.getcwd()

print out,err

p = subprocess.Popen(['whoami'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)

out, err = p.communicate()

print out,err

print getpass.getuser()

print os.getlogin()

print os.system('whoami')
于 2013-12-05T13:57:36.737 に答える