uid에서 사용자 이름을 얻는 방법

uid에서 사용자 이름을 얻는 방법

사용자가 제공한 uid를 기반으로 사용자 이름을 표시하는 bash 스크립트를 작성하려고 합니다.

#!/bin/bash

read -p "donner l UID" cheruid

 if [ $(grep -w $cheruid) -n ]
 then
    grep -w $cheruid /etc/passwd | cut -d ":" -f "1" | xargs echo "user is : "
else
    echo "user not found"

fi

이 명령을 실행하면 터미널에 프롬프트 메시지만 표시되고 작동이 중지됩니다.

내가 뭐 놓친 거 없니?

답변1

GNU를 사용하면 id다음을 수행할 수 있습니다.

id -un -- "$cheruid"

그러면 계정 데이터베이스( /etc/passwdLDAP, NIS+, RDBMS...에 저장되어 있는지 여부)를 쿼리하여 해당 uid가 있는 첫 번째 사용자 이름을 찾습니다.

일반적으로 uid당 하나의 사용자 이름만 있지만 이것이 보장되지는 않습니다. 사용자 계정 데이터베이스의 키는 사용자 ID가 아니라 사용자 이름입니다.

특정 uid에 대한 모든 사용자 이름을 알고 싶다면 다음을 수행하세요.

getent passwd | ID=$cheruid awk -F: '$3 == ENVIRON["ID"] {print $1}'

그러나 지원되지 않는 일부 계정 데이터베이스에서는 작동하지 않을 수 있습니다.열거할 수 있는(때때로 대규모 LDAP 기반의 경우입니다).

답변2

$ 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

답변3

원시 쉘 스크립트를 이해하는 데 도움

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

편집 1: 나는^테스트의 줄 시작 부분에서만 일치하는 항목을 찾습니다.

편집 2: 이후:구분 기호이므로 구분 기호와 그 뒤의 모든 항목을 제거하고 결과를 줄에서 직접 사용하고( 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

특정 사용자 이름이 존재하는지 확인하는 효율적인 방법을 원한다면 질문에 대한 Stéphane Chazelas의 다른 답변에 표시된 대로 를 <test-name>사용할 수 있습니다 .id

id -un -- <test-name>

예를 들어

id -un -- mehdi

id/etc/passwd여기에 저장된 사용자 ID뿐만 아니라 Matteo Italia가 언급한 것처럼 전문 서버 시스템에서 흔히 사용되는 LDAP와 같은 다른 방식으로 관리되고 저장된 사용자 ID 도 찾을 수 있습니다 .


모든 사용자를 검사하고 싶다면

  • 시스템 사용자(사용자가 1000명 미만인 많은 Linux 시스템)

  • 많은 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 번호를 건너뛰지 않는다고 가정하면(삭제된 사용자 없음) 다음 bashoneliner는 매우 빠릅니다.

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현재 로그인되어 있음현재 호스트에.

답변4

grep을 사용하면 모든 숫자가 일치한다는 의미입니다. 사용자 ID 또는 그룹 ID:

$ grep '109' /etc/passwd
uuidd:x:105:109::/run/uuidd:/bin/false
usbmux:x:109:46:usbmux daemon,,,:/var/lib/usbmux:/bin/false

그리고 일치할 수도 있습니다 1109. 로 호출되더라도 grep -w매칭을 피할 수 있습니다 1109. 이것은 중요한 질문입니다.


getent를 사용하세요:

$ getent passwd 109
usbmux:x:109:46:usbmux daemon,,,:/var/lib/usbmux:/bin/false

어느 것이 일치할까요?오직gid(숫자가 제공된 경우 또는 텍스트가 제공된 경우 이름)가 아니라 발견된 첫 번째 사용자 항목의 계정 데이터베이스( /etc/passwd, , , ...)의 숫자 uid입니다. macOS에서는 사용할 수 없습니다.LDAPNIS+

따라서 스크립트는 다음과 같습니다.

#!/bin/bash
read -p "donner l UID: " cheruid

if     name=$(getent passwd "$cheruid")
then   name=${name%%:*}
       echo "user is : $name"
else   echo "user not found"
fi

이름을 얻기 위해 sed, awk, cut이 필요하지 않습니다.

관련 정보