2016-09-02 9 views
6

Cのプログラムでユーザーのユーザー名を取得する必要があります。私はgetlogingetlogin_rについて知っています。しかし、私のプログラムにはリダイレクトされた標準入力があります(forksのため)。C/Linux: `getlogin`を使わないでユーザーのログイン名を取得する方法

私が直面している問題は、manページに記載されている:glibcのは、POSIX仕様に従うと/ dev/ttyのの代わりに標準入力 を使用していないこと

注意。バグ。 (最近のシステムでは、 やHP-UX 11.11、FreeBSD 4.8などのすべてのシステムは、 stdinがリダイレクトされたときにもログイン名を返します)。

ユーザー名を取得できる方法はありますか?

+1

'getenv()'と '$ USER'は気にしていますが、本当に信頼できるものではありませんが、... – DevSolar

+1

あなたはユーザー名に何が必要ですか?答えはそれに依存する可能性があります。 – Art

+0

GUIで表示し、ネットワーク経由で送信するため。それは信頼できるものでなければなりません – Nidhoegger

答えて

6

getresuid(2)またはより具体的なID検索関数を使用して、実際のID(実際の設定、有効な設定、または保存済みの設定)を取得します(getloginをエミュレートする場合はRUIDが必要です。 getuidを呼び出して、有効で保存されたuidを忘れて)、getpwuid(3)またはそのリエントラントな対応部分を使用して、それをユーザーID文字列に変換します。

getenv("USER")でも同じ結果が得られるかもしれませんが、実際のセキュリティを必要としている場合はそれに頼ることはできません。

技術的には、stdinが制御端末である場合は、これらのすべてが、getloginの結果と異なる場合があります。あなたがいるなら

int saved_fd0; 
if(0>(saved_fd0 = dup(0)) 
     /*handle error*/; 
close(0); 

/*open always gets the lowest possible fd number == now 0*/ 
/*"/dev/tty" is always your current processes's controlling terminal*/ 
if(0>open("/dev/tty", O_RDONLY)) 
    /*handle error*/; 
/* 
getlogin() 
.. 
*/ 
/*restore saved_fd0*/ 
if(0>dup2(saved_fd0, 0)) 
     /*handle error*/; 
5

getuidでIDユーザーを取得してから、getpwuid_rを呼び出して、そのIDに対応するユーザー名を調べることができます。

編集は:おっと、私は正しく@PSkocikが指摘getpwuid_rの代わりgetpwent_rを言うことを意味しました。

2

:あなたは本当にgetloginはあなたを得るだろうか、あなたは一時的に再びあなたの制御端末にあなたのFD 0のポイントを作ることができるよう、そしてgetloginを呼び出し、その後、あなたのfd 0を復元同じ答えを必要とする場合UIDを取得するにはgetuid(2)またはgetresuid(2)を使用し、その後はgetpwuid(3)を使用して名前を取得します(同じUIDを持つ複数のユーザー名の場合は、同じUIDを持つ複数のユーザー名の場合は名前、ドキュメンテーションは、これがランダムな名前であるかどうか、ファイル内で最初に出会ったかどうかは分かりません)。

これは、ログインしている端末を指している特定のファイルディスクリプタに依存せず、utmpレコードにも依存しませんが、/ etc/passwdに存在するUIDに依存し、同一のUIDに結びつけられた複数のログインの存在下で使用されます(実際の問​​題ではないほど頻繁ではありません)。

関連する問題