すべてのユーザー名をダウンロードする方法は?

すべてのユーザー名をダウンロードする方法は?

すべての学生がアカウントを持っている大学のLinuxサーバーにアクセスできます。を入力してフルネームを検索し、を入力してfinger username部門を検索できますid username。すべての学生のユーザー名は連続しています。たとえば、

e205846
e205847
e205848
e205849
e205850
...

一種のスクリプトを作成し、すべての情報を一種のデータベースで検索できますか?それともすでに利用可能なツールがありますか?また、参考までに、Linuxにはすべてのユーザー名を含むwwwフォルダがあります。

これは例です

e147290@beluga:~$ finger e204158
Login: e204158                          Name: april oneil
Directory: /home705/e204158             Shell: /bin/bash
Never logged in.
No mail.
No Plan.

e147290@beluga:~$ id e204159
uid=53653(e204158) gid=5621(ce_bs) groups=5621(ce_bs)

ベストアンサー1

Linuxシステムには、標準機能(ここで使用されている機能)をgetent利用するプログラムがあります。検索したいのはデータベースの内容です(もっと理解してください)。get*ent(2)getpwent()passwdman nsswitch.conf

$ getent passwd
root:x:0:0:root:/root:/bin/bash
sashroot:x:0:0:root:/root:/bin/sash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:65004:65534:sync:/bin:/bin/sync
games:x:65005:65060:games:/usr/games:/bin/sh
man:x:65006:65012:man:/var/cache/man:/bin/sh
lp:x:65007:7:lp:/var/spool/lpd:/bin/sh
mail:x:65008:65008:mail:/var/mail:/bin/sh
...

標準システムアカウントがロールオーバーすると、より興味深くなります。

Linuxシステムでない場合は、この機能を使用してユーザーデータベースダンプを直接作成することで簡単にこれを達成できますgetpwent(2)。 C言語の例は次のとおりです。

#include <sys/types.h>
#include <pwd.h>
#include <stdio.h>

int
main(void)
{
    struct passwd *pwd;

    while ((pwd = getpwent()) != NULL) {
        printf("user = `%s', uid = %d, gid = %d, name = `%s'\n",
               pwd->pw_name, pwd->pw_uid, pwd->pw_gid, pwd->pw_gecos);
    }

    return 0;
}

ファイルに入れて、test.c次のようにビルドします。

$ gcc -o test test.c

その後、電話をかけて何が得られるかを確認できます./test

$ ./test
user = `root', uid = 0, gid = 0, name = `root'
user = `sashroot', uid = 0, gid = 0, name = `root'
user = `daemon', uid = 1, gid = 1, name = `daemon'
user = `bin', uid = 2, gid = 2, name = `bin'
user = `sys', uid = 3, gid = 3, name = `sys'
user = `sync', uid = 65004, gid = 65534, name = `sync'
user = `games', uid = 65005, gid = 65060, name = `games'
user = `man', uid = 65006, gid = 65012, name = `man'
user = `lp', uid = 65007, gid = 7, name = `lp'
user = `mail', uid = 65008, gid = 65008, name = `mail'
...

上記のように、後でより興味深くなります。

このアプローチを使用するgetwent()最大の利点は、/etc/passwdログインシステムがどのように構成されているか(LDAP、NIS、...?)仮定する必要がなく、システムが実際の構成に基づいて情報を取得できるようにすることです。

編集する:passwdデータベースのストレージバックエンド(LDAPなど)がデータベース列挙(so getpwent())を許可せず、キーが明示的に要求されたデータセット(ログインまたはUID、したがって、またはgetpwuid()有効である可能性がある)のみを提供する場合getpwnam()。この場合(そしてターゲットユーザー名の名前は非常にきれいに指定されているので)、@masegaloehのスクリプトを修正して手動で「列挙する」ことができます。

#!/bin/bash

for i in {000000..999999}; do 
    getent passwd "e${i}" 2> /dev/null
done

getentシステムAPI(getpwnam()、、)なしでgetpwuid()これを行う方法は、読者に練習課題として残されます。

おすすめ記事