Bashで現在のユーザーのユーザー名を取得するにはどうすればよいですか?


321

ユーザーのユーザー名を取得する必要があるプログラムをBashで作成しています。

という言葉を聞いたことがありますが、whoami何をするか、どう使うかわかりません。

現在のユーザー名を取得するにはどのコマンドを使用しますか?


$ USERに依存したり、別のプロセスを起動したりせずに、これまでに提案された方法が機能しないようです。別のプロセスを呼び出さずにユーザー名を取得する組み込みのbashはありませんか?
ColinM

9
コマンドを聞いたが、その使用方法がわからない場合man whoamiは、通常、ドキュメントをチェックするための最初のストップとして、チェックをお勧めします。
Mark Stosberg、2017

回答:


470

コマンドラインで、

whoami

または

echo "$USER"

これらの値を変数に保存するには、次のようにします。

myvariable=$(whoami)

または

myvariable=$USER

もちろん、変数を作成する必要があるため、変数を作成する必要はありません$USER


53
別のユーザーとしてsshを介してコマンドを実行すると、$ USERとwhoamiは異なる値を返すことに注意してください。whoamiはOSユーザーを返し、$ USERはsshユーザーを返します。
BillMan、2014

4
@BillMan、それはどういう意味ですか?例を挙げていただけますか?
Dejay Clayton

17
場合によっては、$USERまったく設定されていません。それはユーザーによって上書きすることができますので、さらに悪いことに、それだけで環境変数は、次のとおりです。USER=thisisnotmyname bash -c 'echo $USER' # prints thisisnotmyname
sitaktif

1
@sitaktifこの問題の解決策として何を提案しますか?
SethMMorton 2015

3
@SethMMorton私は問題を通常よりも悪化させていることに気づきました。ただし、質問に答えるために、whoami(提案したように)を使用すると、上書きされた環境変数がコンテキスト内の潜在的な問題であると想定して、問題が完全に解消されます。
sitaktif

81

の代替whoamiid -u -nです。

id -uユーザーIDを返します(例:rootの場合は 0 )。


5
idコマンド-u-nフラグがposixの

3
これは本当に受け入れられる答えです。"${USER}"そして、whoamiの両方がログインする方法によって異なります。具体的には、ログインシェルとsudoは$ USER、および設定されますwhoami標準入力に接続ユーザーのルックスを。ただし、cronからバッチジョブを実行している場合、またはroot以外のユーザーとして起動スクリプトを実行している場合、これらは誤ったユーザー(root)を出力するか、何も出力しません。この回答は、プロセスのユーザーIDを見ても正しい値を返します。
Asfand Qazi

これは、IDではなくユーザー名が必要な場合は役に立ちません
Jonathan

3
誤ったコメントを追加する前にコマンドを試した場合-n、元の質問のように、引数がユーザー名を出力することがわかります。以下を参照してください:id -u -nプリントbrett-ダーウィンでも。
ブレット

20

lognameログインしているユーザーを取得するには、標準のUnix / Linux / BSD / MacOSコマンドを使用します。これらは信頼できないレポーターであるため、環境とsudoを無視します。常にログインしているユーザーの名前を表示して終了します。このコマンドは1981年頃から存在しています。

My-Mac:~ devin$ logname
devin
My-Mac:~ devin$ sudo logname
Password:
devin
My-Mac:~ devin$ sudo su -
My-Mac:~ root# logname
devin
My-Mac:~ root# echo $USER
root

17

私がSolaris 9とLinuxで使用したハックは、両方で正常に機能します。

ps -o user= -p $$ | awk '{print $1}'

このスニペットは、現在のEUIDを持つユーザーの名前を出力します。

注:ここではインタープリターとしてBashが必要です。

Solarisでは、上記の方法に問題があります。

  • id-u-nパラメータを受け入れません(したがって、出力を解析する必要があります)
  • whoami 存在しない(デフォルト)
  • who am I 現在の端末の所有者を出力します(EUIDを無視します)
  • $USER変数は、プロファイルファイル(など/etc/profile)を読み取った後にのみ正しく設定されます

1
なぜインタープリターとしてbashが必要なのですか?表示されているコマンドラインには、シェルに固有のものはありません。実際、なぜawkにパイプを含めるのですか?私の知る限り、psコマンドは現在のシェルのpidの所有者を表示するために必要なすべてのものです。
ghoti 2014

人間として私たちが余分な情報を無視するのは自然なことです。awkの部分は、必要なデータを分離します-変数の場合、または一般に、この初歩的なレベルではまだその場で仮定を行うことができないコンピューターの場合。
BradChesney79 2015年

Solarisでは、command -p id(POSIXシェルから)またはを使用し/usr/xpg4/bin/idます。より一般的には、Solarisでは、70s / 80sからのコマンドがPATH=行き詰まらないように、環境を変更して(getconf PATH`のようなものを使用して、必ず実行する/usr/xpg4/bin/sh)POSIX環境にする必要があります。
Stephane Chazelas 2016年

'ps:unknown option-o'
Anand Rockzz

12

2つのコマンド:

  1. id グループと共にユーザーIDを出力します。フォーマット:uid=usernumber(username) ...

  2. whoami 現在のユーザー名を与える


1
$ whoamiはbash では変数として使用できません。whoamiコマンドを実際に実行するには、$(whoami)または `whoami`を実行する必要があります!
ルドルフメイヤー

@RudolfMayer修正しました
wjandrea 2017年

6

root(sudo)権限が必要な場合(通常、スクリプトを使用する場合は90%以上)、以前の回答の方法で常に回答が得られますroot

現在の「ログイン」ユーザーを取得するのも同じくらい簡単ですが、さまざまな変数にアクセスする必要が$SUDO_UIDあり$SUDO_USERます。

それらはエコーすることができます:

echo $SUDO_UID
echo $SUDO_USER

または割り当て済み、たとえば:

myuid=$SUDO_UID
myuname=$SUDO_USER

6

Solaris OS、私は、このコマンドを使用しました:

$ who am i     # Remember to use it with space.

Linuxでは、誰かがすでにコメントでこれに答えています。

$ whoami       # Without space

5

バッシュKornシェルksh)、shなど、ご質問の多くは、すぐにどちらかで回答されています。

man [function]

使用しているシステムのドキュメント、または通常はより便利なドキュメントを取得するには:

google「man関数」

これにより、LinuxとUnixでわずかな違いがある場合、結果が異なる場合があります。

この質問については、シェルに「whoami」と入力してください。

スクリプトを作成するには:

myvar=$(whoami)

2

現在のユーザーのユーザー名は、${parameter@operator}パラメーター拡張(Bash 4.4で導入)を使用して純粋なBashで取得できます。

$ : \\u
$ printf '%s\n' "${_@P}"

に格納されている最後の引数を設定することにより、一時変数の代わりに:組み込み(の同義語true)が使用され$_ます。次に\uP演算子を使用したプロンプト文字列であるかのように展開()します。

これは、通常の環境変数であるため$USER、を使用するよりも優れてい$USERます。変更したり、設定を解除したりできます。意図的に改ざんされていなくても、ログインシェル(suのデフォルト)を起動せずにユーザーを切り替えた場合に、それがまだ正しくない一般的なケースです。


1

上のほとんどのLinuxシステムでは、単に入力にwhoamiコマンドラインでは、ユーザーIDを提供します。

ただし、Solarisでは、以下のコマンドを使用してログインしたユーザーのUIDを判別することにより、ユーザーIDを判別する必要がある場合があります。

echo $UID

UIDがわかったら、UIDを/etc/passwdファイルと照合してユーザーを見つけます。

cat /etc/passwd | cut -d":" -f1,3

猫/ etc / passwd | カット-d ":" -f1,3 | grep $ UID | cut -d ":" -f1
Andrew Taylorが

-4

現在のタスクのuser_structを取得します

#define get_current_user()              \
({                                      \
    struct user_struct *__u;            \
    const struct cred *__cred;          \
    __cred = current_cred();            \
    __u = get_uid(__cred->user);        \
    __u;                                \
})

2
問題は、bashスクリプト内でユーザー名を取得する方法に関するものでした。この答えは、Linuxカーネル内で実行されているCコード(カスタムLinuxカーネルモジュールなど)から数値のユーザーID(ユーザー名ではない)を取得する方法についてです。質問に対する答えではなく、別の質問に対する答えです。
Simon Kissane、2018年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.