uidからユーザー名を取得する方法

uidからユーザー名を取得する方法

ユーザーが提供したuidに基づいてユーザー名を表示するbashスクリプトを作成しようとしています。

#!/bin/bash

read -p "donner l UID" cheruid

 if [ $(grep -w $cheruid) -n ]
 then
    grep -w $cheruid /etc/passwd | cut -d ":" -f "1" | xargs echo "user is : "
else
    echo "user not found"

fi

このコマンドを実行すると、端末にプロンプ​​トメッセージのみが表示され、動作が停止します。

私は何を逃したことがありませんか?

答え1

GNUを使用すると、id次のことができます。

id -un -- "$cheruid"

次に、アカウントデータベース(/etc/passwdLDAP、NIS +、RDBMS ...に保存されているかどうか)を照会して、対応するuidを持つ最初のユーザー名を見つけます。

通常、uidごとに1つのユーザー名しかありませんが、これは保証されません。ユーザーアカウントデータベースのキーは、ユーザーIDではなくユーザー名です。

特定のuidのすべてのユーザー名を知りたい場合は、次のようにします。

getent passwd | ID=$cheruid awk -F: '$3 == ENVIRON["ID"] {print $1}'

ただし、サポートされていない一部のアカウントデータベースでは機能しない可能性があります。リストできる(時には大規模なLDAPベースの場合です)。

答え2

$ printf 'User is %s\n' "$( getent passwd 1001 | cut -d : -f 1 )"
User is myself

myself(私のシステムにUID 1001を持つユーザーがいます)

その後、passwd指定されたUIDに対してデータベースを照会し、その応答からユーザー名を削除し、結果をパラメーターとして使用しますprintf。 macOSでは動作しません。

不明なUIDをキャプチャするには:

$ printf 'User is %s\n' "$( { getent passwd 1001 || echo 'UNKNOWN USER'; } | cut -d : -f 1 )"
User is myself
$ printf 'User is %s\n' "$( { getent passwd 1002 || echo 'UNKNOWN USER'; } | cut -d : -f 1 )"
User is UNKNOWN USER

コマンドラインから必要な数のUIDを使用するスクリプト(出力をわずかに変更):

#!/bin/sh

for uid do
    printf 'User with UID %d is %s\n' "$uid" \
        "$( { getent passwd "$uid" || echo 'NOT KNOWN'; } | cut -d : -f 1 )"
done

テスト(これは私のOpenBSDシステムの一部のサービスアカウントのUIDを渡します):

$ sh ./script.sh {110..115}
User with UID 110 is _sndiop
User with UID 111 is NOT KNOWN
User with UID 112 is _syspatch
User with UID 113 is NOT KNOWN
User with UID 114 is NOT KNOWN
User with UID 115 is _slaacd

答え3

生のシェルスクリプトを理解するのに役立ちます

if文のテストで問題が発生しました。次のシェルスクリプトを使用することをお勧めします。

#!/bin/bash

read -p "donner l UID " cheruid

 if [ "$(grep -w "^$cheruid" /etc/passwd)" != "" ]
 then
    grep -w "$cheruid" /etc/passwd | cut -d ":" -f "1" | xargs echo "user is : "
else
    echo "user not found"
fi

編集1:私^テストの行の先頭でのみ一致するものを探します。

編集2:以降:区切り記号なので、区切り文字とその後のすべての項目を削除し、結果を行で直接使用し(echoテストで許可されている場合)、シェルスクリプトを簡素化する

#!/bin/bash

read -p "donner l UID " cheruid

cheruid=${cheruid%%:*}
user=$(grep -wo "^$cheruid" /etc/passwd)

if [ "$user" != "" ]
then
    echo "user is : $user"
else
    echo "user not found"
fi

これは良いbashシェルスクリプトを書くのに役立ちます。

ユーザーIDを見つけるためのより効率的で一般的な方法id

特定のユーザー名が存在することを確認する効率的な方法が必要な場合は、質問に対するStéphane Chazelasの他の回答に示されているように<test-name>使用できます。id

id -un -- <test-name>

例えば

id -un -- mehdi

id/etc/passwdここに保存されているユーザーIDだけでなく、Matteo Italiaが述べたように、プロフェッショナルサーバーシステムで一般的に使用されているLDAPなど、他の方法で管理および保存されたユーザーIDも見つけることができます。


すべてのユーザーを調べたい場合

  • システムユーザー(ユーザーが1000人未満の多くのLinuxシステム)

  • 多くのLinuxシステムでは、「人間」ユーザー> = 1000人

  • すべてのユーザー数が2000人未満であるとします(必要に応じて修正)。

bashループを使用する次の1行コードを使用できますid

for ((i=0;i<2000;i++));do name=$(id -un $i 2>/dev/null);if [ $? -eq 0 ];then echo "$i: $name" ;fi;done

「人間」ユーザーだけが見たい場合、ユーザーID番号をスキップしないと仮定すると(削除されたユーザーなし)、次のbashオネライナーは非常に高速です。

i=1000;while true;do name=$(id -un $i 2>/dev/null);if [ $? -eq 0 ];then echo "$name" ;else break;fi;i=$((i+1));done

しかし、より信頼性の高い仮説は、一部のID番号をスキップしたり(ユーザーを削除)、

for ((i=1000;i<2000;i++));do name=$(id -un $i 2>/dev/null);if [ $? -eq 0 ];then echo "$i: $name" ;fi;done

ユーザーのユーザー名をusers印刷する方法もあります。who現在ログインしています現在のホストに。

答え4

grepを使用すると、すべての数字が一致することを意味します。ユーザーIDまたはグループID:

$ grep '109' /etc/passwd
uuidd:x:105:109::/run/uuidd:/bin/false
usbmux:x:109:46:usbmux daemon,,,:/var/lib/usbmux:/bin/false

そして一致するかもしれません1109。で呼び出されてもgrep -wマッチングを回避できます1109。これは重要な質問です。


getentを使用してください:

$ getent passwd 109
usbmux:x:109:46:usbmux daemon,,,:/var/lib/usbmux:/bin/false

どちらが一致しますか?ただgid(数値が指定された場合、またはテキストが指定されている場合は名前)ではなく、見つかった最初のユーザーエントリのアカウントデータベース(/etc/passwd、、、、...)の数値uid。 macOSでは使用できません。LDAPNIS+

したがって、スクリプトは次のようになります。

#!/bin/bash
read -p "donner l UID: " cheruid

if     name=$(getent passwd "$cheruid")
then   name=${name%%:*}
       echo "user is : $name"
else   echo "user not found"
fi

名前を取得するためにsed、awk、cutは必要ありません。

関連情報