모든 사용자 이름을 다운로드하는 방법은 무엇입니까?

모든 사용자 이름을 다운로드하는 방법은 무엇입니까?

모든 학생이 계정을 갖고 있는 대학의 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()이를 수행하는 방법은 독자에게 연습 과제로 남겨집니다.

답변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에서 모든 사용자 정보를 얻을 수 있습니다.

관련 정보