필자는 종종 사용자 ID와 관련된 로그인 이름을 얻고 싶습니다. 일반적인 사용 사례로 입증 되었기 때문에이를 위해 쉘 함수를 작성하기로 결정했습니다. 나는 주로 GNU / Linux 배포판을 사용하지만 가능한 한 이식성이 뛰어난 스크립트를 작성하고 내가하고있는 일이 POSIX 호환인지 확인하려고합니다.
파싱 /etc/passwd
내가 시도한 첫 번째 접근법은 /etc/passwd
(을 사용하여 awk
) 구문 분석하는 것이 었습니다 .
awk -v uid="$uid" -F: '$3 == uid {print $1}' /etc/passwd
그러나이 방법의 문제점은 로그인이 로컬이 아닐 수 있다는 것입니다. 예를 들어, 사용자 인증은 NIS 또는 LDAP를 통한 것일 수 있습니다.
getent
명령을 사용하십시오
사용은 getent passwd
분석보다 더 이식 /etc/passwd
이 또한 로컬이 아닌 NIS 또는 LDAP 데이터베이스를 조회한다.
getent passwd "$uid" | cut -d: -f1
불행히도 getent
유틸리티는 POSIX에 의해 지정되지 않은 것 같습니다.
id
명령을 사용하십시오
id
사용자 ID에 대한 데이터를 가져 오기위한 POSIX 표준 유틸리티입니다.
BSD 및 GNU 구현에서는 사용자 ID를 피연산자로 사용합니다.
이는 사용자 ID와 연관된 로그인 이름을 인쇄하는 데 사용될 수 있음을 의미합니다.
id -nu "$uid"
그러나 피연산자로 사용자 ID를 제공하는 것은 POSIX에 지정되어 있지 않습니다. 피연산자로 로그인 이름 을 사용하는 것만 설명합니다 .
위의 모든 것을 결합
위의 세 가지 접근 방식을 다음과 같은 방식으로 결합하는 것을 고려했습니다.
get_username(){
uid="$1"
# First try using getent
getent passwd "$uid" | cut -d: -f1 ||
# Next try using the UID as an operand to id.
id -nu "$uid" ||
# As a last resort, parse `/etc/passwd`.
awk -v uid="$uid" -F: '$3 == uid {print $1}' /etc/passwd
}
그러나, 이것은 복잡하고 우아하며 더 중요한 것은 강력하지 않습니다. 사용자 ID가 유효하지 않거나 존재하지 않으면 0이 아닌 상태로 종료됩니다. 각 명령 호출의 종료 상태를 분석하고 저장하는 더 길고 복잡한 쉘 스크립트를 작성하기 전에 여기에 물어볼 것이라고 생각했습니다.
사용자 ID와 연관된 로그인 이름을 얻는 더 우아하고 이식 가능한 (POSIX 호환) 방법이 있습니까?
getent
도 id
첫 경기 과거 아무것도 반환하지 않습니다; 모든 것을 찾는 유일한 방법은 사용자 데이터베이스가 허용하는 경우 모든 사용자를 열거하는 것입니다. ( /etc/passwd
명백하게 정의 된 사용자를위한 작품을 찾는 것 .)
/etc/passwd
하고 /etc/shadow
이 시나리오를 테스트하려면 두 것을 확인 id
하고 getent passwd
당신이 설명하는대로 작동합니다. 어떤 단계에서 사용자가 여러 이름을 가진 시스템을 사용하게되면 이러한 시스템 유틸리티와 동일하게 수행하고 첫 번째 항목을 해당 사용자의 표준 이름으로 취급합니다.
setuid(some_id)
및 요구 사항이 없습니다 some_id
사용자 데이터베이스의 일부가 될 수있다. Linux의 사용자 네임 스페이스와 같은 것들로 인해 이는 스크립트에 대한 치명적인 가정이 될 수 있습니다.
getpwuid()
하는 ls
데 사용 되는 함수를 호출하는 비싼 방법 인 것 같습니다 . Gilles의 답변 은이를 달성하기위한보다 직접적이고 효율적인 방법입니다.