ユーザーが提供した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/passwd
LDAP、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では使用できません。LDAP
NIS+
したがって、スクリプトは次のようになります。
#!/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は必要ありません。