パスワードでユーザーを作成し、ユーザーが存在することを確認してグループに追加します。

パスワードでユーザーを作成し、ユーザーが存在することを確認してグループに追加します。

Bashスクリプトを書く必要があります

  1. rootユーザーとして実行していることを確認する
  2. ユーザー名を尋ねる
  3. ユーザーが存在することを確認する
  4. 新しいユーザーとパスワードを追加
  5. グループ名を尋ねる
  6. グループが存在することを確認してください。
  7. グループにユーザーを追加

私はこのようなコードを書いた。

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全体を繰り返し、1行ずつ比較する必要はありません。代わりに、以下を実行してください。

awk -F: -v user=$userschool '$1 == user {print $1}' /etc/passwd

-vawkでは、変数の割り当てはどこにありますか?

すでに存在する場合は、指定したユーザー名を出力します。

# 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あらゆる状況で施行したいからです。しかし、問題がある場合はそうではありませんsleepdelay_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
}

関連情報