フルネーム/ gecosフィールドでユーザー名を見つけますか?

フルネーム/ gecosフィールドでユーザー名を見つけますか?

ユーザーデータがOpenLDAPデータベースから出ていて、ファイルにはないシステムがあるとします/etc/passwdgetent passwdフルネーム(一部)を指定してデータベースを検索し、ユーザーID /名前を見つけることはできますか?

たとえば、getent passwd newbie次の項目を教えてください。

newbie:x:1000:1000:firstname lastname:/home/newbie:/bin/zsh

「姓」を持つすべてのユーザーを見つける方法は?似たようなものがありますかgetpwnamgecosフィールドの場合?

getent passwd注:データベースが大きすぎるため、ユーザー名なしで使用して解析することはできません。

答え1

データベースを検索する方法が見つかりませんでしたが、OpenLDAPでエントリを見つけることは直接役立ちました。

$ ldapsearch -x -h ldap.example.com -ZZ \
             -D cn=lookup,dc=example,dc=com -W \
             -b ou=People,dc=example,dc=com -LLL \
             sn=lastname uid
dn: uid=newbie,ou=People,dc=example,dc=com  
uid: newbie

$

答え2

sed次のようなコマンドを使用できます。

$ SURNAME=Smith
$ getent passwd | sed -n '/'$SURNAME'/s/^\([^:]*\):\([^:]*\):\([^:]*\):\([^:]*\):\([[:alpha:]]\+ '$SURNAME'\):\([^:]*\):\([^:]*\)$/\1 (\5)/p'
$ fps (Finnbarr Smith)
  jms (James Smith)
$

あなたの質問によると、上記の「sed」正規表現は、GECOSフィールドに「James Smith」などの<FIRSTNAME> <SPACE> <LASTNAME>が含まれていると想定しています。他のGECOSサイトのレイアウトに合わせて簡単に変更できます。

答え3

次の出力でawkを使用できますgetent passwd

getent passwd | awk -F: '$5 ~ /lastname/ {print $1}'

関連情報