사용자 이름이 존재하는지 확인


68

쉘 스크립트에서 주어진 사용자 이름이 현재 시스템에 존재하는지 어떻게 알 수 있습니까?


/etc/passwd/etc/shadow불완전. OS X의 디렉토리 서비스 또는 마찬가지로 Active Directory가 통합 된 Linux를 고려하십시오.

답변:


103

가장 기본적인 도구 중 하나는 아마입니다 id.

#!/bin/bash
if id "$1" >/dev/null 2>&1; then
        echo "user exists"
else
        echo "user does not exist"
fi

어느 생산

$ ./userexists root
user exists
$ ./userexists alice
user does not exist
$ ./userexists
user does not exist

2
당신은 여기에서 역 인용 부호가 필요하지 않습니다 - 그냥 사용 if id -u "$1" >/dev/null 2>&1; then...
고든 데이비슨에게

1
물론 @Gordon. 감사합니다 :)
barbaz

"-u"도 불필요 해 보인다
palacsint

if부정적인 결과 검사기 만 필요한 경우 에는 무엇입니까?
Yura Shinkarev

id -u $1 1>/dev/null 2>&1; echo $?파이프에 사용할 수
JasonWayne

20

겟트

이 명령은 / etc 파일과 LDAP, AD, NIS / Yellow Pages, DNS 등과 같은 다양한 원격 서비스가 지원할 수있는 데이터베이스 항목을 수집하도록 설계되었습니다.

비밀번호 이름 지정 서비스 중 하나가 사용자 이름을 알고 있는지 확인하려면 다음을 실행하십시오.

getent passwd username

이것은 OS 및 구현에 따라 그룹, 호스트 및 기타와 함께 작동합니다.


1
Solaris와 Linux, 그리고 가장 최근에는 대부분의 BSD에도 있지만 getent, getentMac OS X 에는 없습니다
barbaz

실제로, 나는 Mac OS / X가 getent를 놓친 것을 놓쳤다.
jlliagre

그럼에도 불구하고 그것이 지원하는 시스템에서 매우 유용합니다.
Daniel Beck

1
getent는 id가 단일 사용자 이름 만 지원하는 여러 사용자 이름을 쿼리 할 수 ​​있기 때문에 좋습니다.
nall

6

finger

의 출력을 구문 분석하십시오 finger -m <username>. 유감스럽게도 사용자를 찾지 못하면 오류 코드가 없지만 찾지 못하면 오류 출력이 작성됩니다. 지금까지 단점이 없습니다.

finger -ms <username> 2>&1 1>/dev/null | wc -l

0사용자가 발견되면 (오류 출력이 없기 때문에) 인쇄 하고 그렇지 않으면 더 큰 숫자를 인쇄합니다.

chown

놀랍게도 모든 사용자로 실행하십시오.

T=$( mktemp -t foo.XXX ) ; chown <username> $T

로 실패 root하면 계정 이름이 유효하지 않은 것입니다.

root사용자 가 아닌 사용자 로 실패하면 허용되지 않는 조작 또는 유효하지 않은 사용자 (또는 동등한 사용자)에 대해 현지화 된 출력을 구문 분석하십시오 . LANG이를 확실하게 수행하도록 미리 설정하십시오 .


0

나는 당신이 의존 /etc/passwd하고 비슷 하다고 말하고 싶습니다 (예 : /etc/shadowShadow 기반 시스템의 경우; 주제를 벗어난 쪽지에서 일부 유사한 시스템은 /etc/master.passwd다른 파일을 사용할 수 있습니다 ).

/etc/passwd일반적으로 사용자가 존재하는지 여부에 대한 결정의 절대 권위로 처리된다. 이 페이지에 설명 된 다른 방법을 사용하고 다른 방법이 기존 사용자를 가리 키지 만 /etc/passwd그렇지 않은 경우 가장 일반적인 표준을 정의하여 사용자가 시스템에 제대로 존재하지 않는다고 말할 수 있습니다. 소프트웨어에 의존 할 것입니다.

즉, 다른 방법을 사용하여 사용할 수있는 다른 옵션을 추가 할 것입니다.

ls -l /home | grep ^customUserName$<BR> echo $?

"customuserName"을 확인하려는 사용자 이름으로 바꾸십시오. 시스템이 사용하는 경우 / home을 / users로 바꾸십시오. 특정 사용자에 대해 홈 디렉토리를 만들지 않은 경우 / etc / passwd에서 모든 사용자를 찾지 못할 수 있습니다. 사용자를 단순히 가져온 텍스트 (/ etc / passwd로 텍스트 줄)와 홈 디렉토리가없는 경우 발생할 수 있습니다. 사람이 로그인 할 때까지 /받지 않으면 안됩니다.


당신은 / etc / password 파일에 항목이 없습니다하지만 중 하나에 의해 유효한 것으로보고되고 사용자 상태 내가 왜하지 않습니다 id또는 getent"제대로"특히 영업 이익은 명확하게 명명 서비스가 진술 할 때, 시스템에 존재하지 않습니다 고려 될 것이다.
jlliagre 2016 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.