GNU/Linux >> Linux の 問題 >  >> Linux

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

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 現在ログインしているユーザーのユーザー名を出力します 現在のホストに。


Linux
  1. Makefile でユーザー名を取得するにはどうすればよいですか?

  2. 標準入力からsedを読み取るにはどうすればよいですか?

  3. プロセス名でPIDを取得するには?

  1. PythonGDB (GDB 7.1) で gdb.execute から出力を取得するには?

  2. 親プロセスから子プロセスを取得する方法

  3. Active Directory からユーザー パスワードの有効期限を取得する方法は?

  1. IP (Linux) からホスト名を取得するには?

  2. bashでリストから要素を取得する方法は?

  3. bash 関数を設定解除または削除するにはどうすればよいですか?