スクリプト実行のために現在のユーザーを変更したかった。これは私がしました
import os
newuid = pwd.getpwnam('newuser').pw_uid
os.setuid(newuid)
print('User :' + getpass.getuser());
私はまだ得てroot
います。これより良い方法はありますか?ユーザーを一度切り替えてから、その新しいユーザーでスクリプト内の残りのコマンドの実行を続行します。
スクリプト実行のために現在のユーザーを変更したかった。これは私がしました
import os
newuid = pwd.getpwnam('newuser').pw_uid
os.setuid(newuid)
print('User :' + getpass.getuser());
私はまだ得てroot
います。これより良い方法はありますか?ユーザーを一度切り替えてから、その新しいユーザーでスクリプト内の残りのコマンドの実行を続行します。
getpass.getuser()
現在のユーザーを取得するためにgetuid()
orを使用しません。geteuid()
http://docs.python.org/3/library/getpass.html#getpass.getuser
この関数は、環境変数 LOGNAME、USER、LNAME、および USERNAME を順番にチェックし、空でない文字列に設定されている最初の変数の値を返します。何も設定されていない場合、pwd モジュールをサポートするシステムでは、パスワード データベースからのログイン名が返されます。それ以外の場合は、例外が発生します。
モジュールos
、subprocess
、を試した後getpass
、問題はユーザーが設定されているかどうかではないことに気付きました。ユーザーは を使用して設定または変更されますが、 、os.setuid
のようなモジュールからユーザー名を取得するメソッドは、実際にはユーザー名を適切に取得しません。シェル コマンドを実行するか、またはを使用すると、変更されたユーザーが取得されます。これらは私にとって少し困惑した出力です。以下は、これらすべての奇妙な動作を示すスクリプトです。os.getlogin()
getpass.getuser()
whoami
id
subprocess.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')