GNU id
を使用 、できること:
id -un -- "$cheruid"
これにより、アカウント データベースが照会されます (/etc/passwd
に格納されているかどうか)。 、LDAP、NIS+、RDBMS...)、その uid を持つ最初のユーザー名。
通常、uid ごとに 1 つのユーザー名しかありませんが、それは保証されません。ユーザー アカウント データベースのキーは、ユーザー ID ではなくユーザー名です。
特定の uid のすべてのユーザー名を知りたい場合は、次のようにすることができます:
getent passwd | ID=$cheruid awk -F: '$3 == ENVIRON["ID"] {print $1}'
ただし、列挙可能ではない一部のアカウント データベースでは機能しない場合があります。 (大規模な LDAP ベースの場合によくあることです)。
$ 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
元のシェルスクリプトのヘルプ
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
Edit1:^
を追加しました
Edit2::
以降 はセパレーターです。それ以降のすべてを削除して、結果を 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 を見つける効率的でより一般的な方法
特定のユーザー名が存在するかどうかを確認する効率的な方法が必要な場合は、 <test-name>
、 id
を使用できます 、Stéphane Chazelas によるあなたの質問に対する別の回答で示されているように:
id -un -- <test-name>
例えば
id -un -- mehdi
id
/etc/passwd
に格納されているユーザー ID だけでなく、 しかし、マッテオ・イタリアがコメントしているように、プロのサーバーシステムで一般的な LDAP など、他の方法で管理および保存されているものも含まれます。
すべてのユーザーをスキャンする場合
-
システム ユーザー、多くの Linux システムではユーザー番号 <1000
-
多くの Linux システムでは、ユーザー番号>=1000 の「人間」ユーザー
-
すべてのユーザーの番号が 2000 未満であると仮定します (必要に応じて変更してください)
次の bash
を使用できます 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
oneliner は非常に高速です。
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
現在ログインしているユーザーのユーザー名を出力します 現在のホストに。