Bash 스크립트를 작성해야 해요
root
사용자로 실행 중인지 확인- 사용자 이름을 물어보세요
- 사용자가 존재하는지 확인
- 새 사용자 및 비밀번호 추가
- 그룹 이름을 묻는다
- 그룹이 존재하는지 확인하세요.
- 그룹에 사용자 추가
나는 이런 코드를 썼다.
function create_user() {
if (( $EUID == 0)); then
echo "Only for root users."
exit
fi
echo "User name: "
read userschool
for x in $(awk -F":" '{ print }' /etc/passwd ); do
if [ $x == userschool ] ; then
echo "This user exists"
sleep $delay_time && exit
fi
done
sudo useradd -p $(openssl passwd -1 $PASS) $userschool
echo "User has been added"
sleep $delay_time
echo "Name of group"
read school
for x in $(awk -F":" '{ print }' /etc/group ); do
if [ $x == school ] ; then
echo "Group doesn't exists"
else
echo "$userschool has been added to group $school"
sleep $delay_time
break 2
fi
done
}
거의 작동하지만 사용자가 존재하면 스크립트도 그를 다시 추가하는데 이유는 모르겠습니다. 사용자가 존재하고 정지한다는 메시지를 전달하고 싶다.
답변1
$x
변수가 아닌 리터럴과 비교하고 있습니다 userschool
. 변수 호출을 큰따옴표로 묶어야 합니다.와일드카드 및 단어 분할 방지. 그것은해야한다:
if [ "$x" == "$userschool" ]; then
...
fi
if [ "$x" == "$school" ]; then
...
fi
그리고 전체 /etc/passwd를 반복하고 한 줄씩 비교할 필요가 없습니다. 대신 다음을 수행하세요.
awk -F: -v user=$userschool '$1 == user {print $1}' /etc/passwd
-v
awk에서 변수 할당은 어디에 있습니까?
이미 존재하는 경우 지정된 사용자 이름을 출력합니다.
# Since it's bash, you can do this instead
read -p "Username: " userschool
exists=$(awk -F: -v user=$userschool '$1 == user {print $1}' /etc/passwd)
if [[ "$exists" ]]; then
echo "User exists."
sleep $delay_time
exit 1
fi
# create user
...
답변2
주요 문제는
awk -F":" '{ print }' /etc/passwd
전체 줄을 인쇄합니다. 확실히 그렇습니다
awk -F":" '{ print $1; }' /etc/passwd
그리고 당신은 잊어버렸 $
습니다 $x == userschool
. "$x" = "$userschool"
물론 그래야 합니다.
exit
게다가 전화하는 것도 의미가 없어
sleep $delay_time && exit
exit
모든 상황에서 시행되기를 원하기 때문입니다 . 하지만 문제가 있는 경우에는 그렇지 않습니다 sleep
(예: 설정하는 것을 잊었거나 잘못된 값을 부여한 경우 ). delay_time
그래서 그래야 한다
E_USER_EXISTS=3
if [ "$x" = "$userschool" ] ; then
echo "This user exists"
sleep "$delay_time"
exit "$E_USER_EXISTS"
fi
그럼에도 불구하고 이것은 나쁜 접근 방식입니다. 나중에 더 나은 것을 추천하겠습니다.
답변3
기본적으로 useradd 명령은 사용자가 이미 존재하는 경우 오류를 발생시킵니다. 다시 확인할 필요가 없습니다.
function create_user() {
if [[ $EUID -ne 0 ]]; then
echo "This script must be run as root"
exit 1
fi
echo -n "User name: "
read userschool
sudo useradd -p $(openssl passwd -1 $PASS) $userschool && echo "User has been added"
sleep $delay_time
echo "Name of group"
read school
sudo groupadd $school &>>/dev/null && echo "Group created $school"
sudo usermod -aG $school $userschool
}