$ USERおよび$ USERNAME環境変数を設定するのは誰ですか?


34

また、これらの変数は常に現在ログインしているユーザー名と一致しますか(私のDebianシステムで一致しますか)?他のUnix(-like)システムで利用できると仮定できますか?

またwhoami、これらの変数のいずれかを読み取るのではなく、なぜ使用するのか興味があります。


2
manページを見て、whoami有効なユーザーIDに関連付けられた名前を報告します。つまりsudo、setuid実行可能ファイルを使用または実行している場合は、別の何かを返します。sudo設定済みの場合はsudo whoami、たとえば試してください。
ジョセフR.

4
USERUSERNAMEは、通常の環境変数です。つまり、必要に応じて、任意の値に設定できます。と入力するだけですUSER=xyz。つまり、これらの変数が存在する場合でも、それらの値が現在ログインしているユーザー名と一致するという保証はありません。
ウーヴェ

@Uwe By guarantee、私はデフォルトで意味しました(つまり、ユーザーがそれらを変更しなかったと仮定)。
シェパン

2
結果を比較:@Tshepangとしての私の最初のコメントをフォローアップsudo whoamiし、sudo echo $USER
ジョセフ・R.

2
@JosephR。の場合sudo echo $USER、シェルは展開$USERしてから呼び出しますsudo。したがって、もちろん、と同じ出力は生成されませんwhoami。同様にsudo whoamisudo sh -c 'echo $USER'(通常)outputを行いますrootコメントwhoamiEUIDを使用して、ノートsudo whoamiの出力となるroot場合でも、whoamiUIDを使用します。sudoセットの両方それは(あなたが明示的に動作するようにそれを設定することは非常に異例な状況を除いて)実行するコマンドのためのEUIDとUID。と比較sudo id -uしてくださいsudo id -ru
エリアケイガン14年

回答:


29

それはだ、ログイン

Linuxのlogin(1)のマニュアルページには、

$ HOME$ USER$ SHELL$ PATH$ LOGNAME、および $ MAILは、パスワード入力の適切なフィールドに応じて設定されています。

FreeBSD login(1)のマニュアルページには次のように書かれています:

ログインユーティリティは、環境に情報を入力する(参照 環境を(7) )ユーザのホームディレクトリ(HOME)、コマンドインタプリタ(シェル)、検索パス(PATH)、端末タイプ(TERM)とユーザー名を指定する(LOGNAMEおよびUSERの両方) 。

NetBSDのOpenBSDのOS Xのmanページには、同じことを言います。

util-linuxログインのソースコードは次のとおりです。

setenv("HOME", pwd->pw_dir, 0); /* legal to override */
setenv("USER", pwd->pw_name, 1);
setenv("SHELL", pwd->pw_shell, 1);
/* ... */
setenv("LOGNAME", pwd->pw_name, 1);

以下は、FreeBSDログインのソースコードです

(void)setenv("LOGNAME", username, 1);
(void)setenv("USER", username, 1);
(void)setenv("PATH", rootlogin ? _PATH_STDPATH : _PATH_DEFPATH, 0);

2
私のFedora 16ボックスでは、両方USERUSERNAME設定があり、コマンドはのみを返しますLOGNAME
ジョセフR.

1
@JosephR。、残念ながら私はFedoraを手元に持っていませんが、FreeBSDのソースも調べました
。UPDを

しかし、これは明らかにFedoraには当てはまりません。私が言っているのは、loginこれらの変数を設定する唯一のものではないようです。
ジョセフR.

1
Linuxは単なるカーネルであり、loginコマンドはありません。Linuxをカーネルとして使用するOSは、好きな実装を自由に使用できます。たとえば、Debianベースのシステムは、util-linuxではなく、shadow-utilsのシステムを使用する傾向があります。
ステファンシャゼラス

1
多くのグラフィカルログインマネージャーloginで、sshまたはほとんどの場合、ログイン時に呼び出されないことに注意してください。
ステファンシャゼラス

11

ルールはありません。tcshまたはzshsetのようないくつかのシェル$LOGNAMEzshを設定します$USER

それは同様にあなたをログインいくつかのものが設定してもよいlogin(によって呼び出さとしてgettyのような他のもので、時には端末にする場合、ログインしてin.rlogind)、 、cronsusudosshdrshdグラフィカルなログインマネージャやないかもしれません。

私の経験で$USERは、ログインがあった場合、通常は設定されます(ただし、そのログインセッション内で(setuidコマンドを介して)ユーザーIDを変更した後、更新されない場合があります。POSIXでは、$LOGNAMEログイン時に設定する必要があります(およびcron)。

ログイン名を移植可能にするには、lognameコマンドを使用するのが最善です(ログインがなかった場合、何も返されないことがあります)。ユーザーIDを取得するには、を使用しますid -u。現在の有効なユーザーIDに対応する1つのユーザー名を取得するには:id -un。すべてを取得するには(ほとんどの場合、ユーザーIDごとにユーザー名は1つだけですが、それは保証されません):

perl -le 'while ($n = getpwent()) {print $n if getpwnam($n) == $>}'

ただし、ユーザーデータベースを列挙できないシステムでは機能しない場合があります(たとえば、ネットワーク化されたユーザーデータベースで発生する場合があります)。


3

おそらくある時点で、ユーザーのログイン(プログラムによって管理される)だけでなく、ジョブなども気にすることになるので、おそらくここのPOSIX標準に依存したいと思うでしょう。logincron

したがって、POSIXには$LOGNAMEが必要ですが、は必要ないことを知っておく必要があり$USERます。たとえば、Keith Thompsonの回答で$USER指摘されているように、cronで設定することはできません。これは、これがSystem-VとBSDの歴史にどのように関係するかについての歴史も参照しています。

...少なくとも私のシステム(Ubuntu 14.04)では、$ USER環境変数がcronジョブに設定されていません。代わりに、cronジョブの環境の一部である$ LOGNAMEを使用できます。

environ(7)のマニュアルページ(読むにはman environと入力)によると、$ USERはBSD派生プログラムで使用され、$ LOGNAMEはSystem-V派生プログラムで使用されます。


1

あなたが(代わりに、環境変数を使用したい場合whoamigetpwentgetpwnam)、彼らは常にすべての* NIXシステムで同じように設定されている場合はわからない、そしてbashでこれを試してみてください。

THIS_USER=${USER:-${USERNAME:-${LOGNAME}}}
echo ${THIS_USER}

それでもすべてが空の場合は、かなり難解なシステムにいます。;)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.