모든 사용자 이름을 다운로드하려면 어떻게 해야 합니까?

모든 사용자 이름을 다운로드하려면 어떻게 해야 합니까?

모든 학생이 계정을 갖고 있는 대학의 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

getentLinux 시스템에는 표준 get*ent(2)기능( getpwent()여기서 사용하는 기능) 을 활용하는 프로그램이 있습니다 . 검색하려는 내용은 passwd데이터베이스의 내용입니다( man 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()로그인 시스템이 어떻게 구성되어 있는지(, LDAP, NIS, …?) 가정할 필요가 없고 /etc/passwd시스템이 실제 구성으로 정보를 검색하도록 한다는 큰 장점이 있습니다.

편집하다:passwd데이터베이스의 저장소 백엔드(예: LDAP)가 데이터베이스 열거를 허용하지 않고 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()독자에게 연습 과제로 남겨 둡니다.

답변2

getent는 실제로 Unix/Linux 시스템의 이름 스위치를 통해 모든 데이터베이스에 액세스하는 올바른 방법이므로 계정이 /etc/passwd에 로컬로 저장되어 있는지, 아니면 LDAP, AD, NIS 또는지에 있는지는 중요하지 않습니다. nsswitch.conf에서 구성한 모든 서비스.

그래서 나는 이렇게 할 것이다:

getent passwd | awk -F: '$1 ~"^e[0-9]*$" {print $5}'

그러면 'e'로 시작하고 뒤에 숫자만 오는 모든 계정의 전체 사용자 이름이 인쇄됩니다.

Windows 시스템에서 이 작업을 수행해야 한다면 cygwin을 설치한 다음 위와 같이 수행합니다. :) 사실 저는 방금 Windows/cygwin에서 getent를 테스트했는데 훌륭하게 작동했습니다(다소 놀랍게도).

답변3

이 bash 스크립트는 반복을 수행합니다.

#!/bin/bash
for i in {205846..205850}; do
    finger e${i}
    id e${i}
done

다른 범위를 얻으려면 205846 및 205850을 수정하면 됩니다.

답변4

/etc/passwd에서 모든 사용자 정보를 얻을 수 있습니다.

관련 정보