를 사용하려고 하는데 useradd
, 구체적인 부분은 이해가 안가지만 해보고 싶은 예제를 찾았습니다.
전체 예는 다음과 같습니다.
if [ $(id -u) -eq 0 ]; then
read -p "Enter username : " username
read -s -p "Enter password : " password
egrep "^$username" /etc/passwd >/dev/null
if [ $? -eq 0 ]; then
echo "$username exists!"
exit 1
나는 무슨 일이 일어나고 있는지 기본적으로 이해하지만 구체적으로 다음과 같습니다.
[ $(id -u) -eq 0 ];
그리고
[ $? -eq 0 ];
괄호 안에 변수가 생성되는 것 같습니다. 그러나 나는 항상 그 목적이나 의미를 이해하려고 애썼습니다.
답변1
남성의 경우:
-u, --사용자
print only the effective user ID
id -u
사용자 ID를 인쇄합니다. 이 스크립트는 UID 0을 가진 루트 사용자로 제한됩니다.
$?
이전에 실행된 명령의 종료 상태입니다.
답변2
이 id
유틸리티를 -u
옵션과 함께 사용하면 현재 사용자의 UID가 출력됩니다. UID가 0이면 사용자는 루트입니다. 루트 사용자만 새 사용자를 추가할 수 있습니다.
따라서 스크립트는 스크립트를 실행하는 사용자의 UID가 0인지 다시 테스트하고 사용자가 루트인 경우에만 권한 있는 작업을 수행합니다(질문의 스크립트에는 표시되지 않음).
전체 스크립트에 루트가 필요한 경우 스크립트 내에서 이를 처리하는 더 좋은 방법은 처음부터 UID가 0이 아닌지 확인하고, 그렇다면 오류와 함께 종료하는 것입니다.
if [ "$(id -u)" -ne 0 ]; then
echo 'You are not root. Try again with sudo.' >&2
exit 1
fi
의 경우 $?
가장 최근에 실행된 명령의 종료 상태를 항상 포함하는 특수 쉘 변수입니다. 이것은매우 드물다if
직접 사용할 수만 있는 것이 아니기 때문에 직접 사용해야 합니다 grep
.
if grep -q "^$username" /etc/passwd; then
printf 'User "%s" already exists\n' "$username" >&2
exit 1
fi
여기서는 if
종료 상태가 사용됩니다 grep
. 출력이 생성되지 않도록 방지하고 구문 분석하기 위해 grep
with 를 사용합니다.-q
모두첫 번째 일치 항목을 넘어서는 파일입니다. 단지 사용될 종료 상태를 반환합니다 if
. egrep
정규식은 확장 정규식이 아니기 때문에 둘 중 하나도 필요하지 않습니다 ( egrep
와 동일 grep -E
).
또한 진단 메시지는 표준 오류 스트림에 기록되어야 합니다. 메시지에 대한 리디렉션을 사용하면 이를 수행할 수 있습니다 >&2
. 반품,printf
echo
가변 데이터를 출력할 때보 다 낫다..
NIS 또는 LDAP와 같은 디렉터리 서비스를 사용하는 시스템을 사용하는 경우 /etc/passwd
실제 사용자가 별도의 데이터베이스에 저장될 수 있으므로 기존 사용자에 대한 파악이 유용하지 않을 수 있습니다.
그러한 시스템에서는 이를 사용하는 것이 더 나을 수 있습니다 getent passwd "$username"
(이는 NIS/LDAP가 아닌 시스템에도 적용됩니다). 이는 특정 사용자에 대한 비밀번호 데이터베이스 항목을 반환하거나 0이 아닌 종료 상태로 종료됩니다.저것테스트에서:
if getent passwd "$username" >/dev/null; then
printf 'User "%s" already exists\n' "$username" >&2
exit 1
fi
NIS 또는 LDAP 데이터베이스에는 사용자 를 useradd
추가할 수 없습니다.
하지만 엄밀히 말하면 위의 항목 중 어느 것도 실제로 필요하지 않습니다. 왜냐하면 useradd
현재 사용자가 루트가 아니거나 추가된 사용자가 이미 존재하는 경우에는 유용한 작업을 수행하지 않기 때문입니다.