0

ルートとして実行しているプログラムがあり、別のプログラムを呼び出して実行します(A)。

ログオンしたユーザーとして実行したい。コマンドを使用しました:su - 'username' -c A

またはメイン関数で、私は呼び出しました: setuid(current_uid_logged).

しかし、root プロセスでログオンしたユーザー名または uid を取得する方法がわかりません。

私が試した方法:getenv("USERNAME")またはgetlogin()常にrootアカウントを返します。と混同しました。getlogin()カーネルの起動時にプログラムが実行され、ユーザーのログインを待機します (ユーザーのログオンを検出するために実行中の Finder プロセス (Mac OSX) を待機するスレッドがあります)。10 秒待って呼び出しますgetlogin()が、いつか返されますrootただし、ユーザー ログインを返すことができます。ユーザーがログオンしたときにFinderプロセスが実行されていると思います。しかし、sudoコマンドで実行するアプリを呼び出すと、getlogin()常に現在ログオンしているユーザーが返されます。

どうすればいいですか?

4

2 に答える 2

1

getlogin(3)プロセスの制御端末を所有するユーザーの名前を返します。これは、オペレーティング システムの GUI にログインするユーザーのユーザー名とは関係ありません。代わりにgetlogin(3)、プログラムを開始getuid(2)したユーザー アカウントの名前/uid のみを返します。コンピューターの前に座っているユーザーよりも、プロセス履歴に関係があります。

環境変数についても同様の話があります。USERいずれLOGNAMEかがプロセスで設定された場合、それはプロセスの呼び出しツリーの上位のプロセスによって設定されました。どちらのユーザーが最終的にコンピュータの前に座っても、影響を受けることはありません。

OS X マシンで現在ログオンしているユーザーを検出する何らかのメカニズムがあると確信していますが、それを提供する従来の Unix API ではありません。

于 2011-11-17T03:23:35.013 に答える
0

どうuid_t getuid()ですか?

詳細については、http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man2/getuid.2.htmlを参照してください。

于 2011-11-17T03:19:33.240 に答える