برنامه نویسی

Bash Scripting: مدیریت خودکار کاربر در لینوکس

چرا خودکار می کنیم؟

مدیریت کاربران و گروه ها در یک سیستم لینوکس می تواند یک کار خسته کننده باشد، به خصوص اگر مجبور باشید چندین حساب را مدیریت کنید. خوشبختانه با کمی دانش اسکریپت نویسی می توانید این فرآیند را خودکار کنید. در این مقاله، من شما را از طریق یک اسکریپت ساده Bash که برای ایجاد کاربران، اختصاص دادن آنها به گروه ها و تنظیم خودکار رمز عبور آنها طراحی شده است، راهنمایی می کنم.

چرا مدیریت کاربر را خودکار کنیم؟

  • کارایی: خودکار کردن کارهای تکراری باعث صرفه جویی در زمان می شود.
  • سازگاری: تضمین می کند که هر بار یک فرآیند مشابه دنبال می شود.
  • کاهش خطا: خطر خطای انسانی را به حداقل می رساند.

با اسکریپت Bash جدید هستید؟

برای کسانی که سعی در یادگیری در مورد برنامه نویسی bash دارند، لطفاً از اینجا دیدن کنید).

نمای کلی اسکریپت

این پروژه من را مجبور به ایجاد یک اسکریپت ساده کرد که عملکردهای زیر را انجام می دهد:

  • کاربران و گروه های ارائه شده در فایل txt. را می خواند
  • کاربران و گروه ها را از داده های خوانده شده ایجاد می کند
  • رمز عبور تصادفی تولید شده را به هر کاربر اختصاص می دهد. گذرواژه ها در آن ذخیره می شوند /var/secure/user_passwords.csv
  • کاربران را به گروه های مناسب اضافه می کند
  • a را ایجاد می کند $HOME دایرکتوری برای هر کاربر با مجوز مناسب
  • همه اقدامات اسکریپت را ثبت می کند /var/log/user_management.log
    هر مرحله توضیح داده خواهد شد.

مخزن پروژه را می توانید در اینجا بیابید.

پیش نیازها

قبل از اجرای اسکریپت، مطمئن شوید که:

  • امتیازات ریشه (اسکریپت باید به صورت روت اجرا شود).
  • یک فایل ورودی حاوی اطلاعات کاربر (به عنوان مثال، staffs.txt).

توضیح مفصل

بررسی امتیازات ریشه

اسکریپت با بررسی اینکه آیا به صورت روت اجرا می شود یا نه شروع می شود. این امر بسیار مهم است زیرا عملیات مدیریت کاربر و گروه به مجوزهای ریشه نیاز دارد. این کار را با تأیید اعتبار انجام می دهد$EUID متغیر 0 است.

if [[ "$EUID" -ne 0 ]]; then
  echo "Error: This script needs to run as root. Use sudo"
  exit 1
fi
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

ایجاد دایرکتوری های لازم

اگر دایرکتوری های مورد نیاز (/var/log و /var/secure) وجود نداشته باشند، اسکریپت آنها را ایجاد می کند.

# Create necessary directories if they don't exist
if [ ! -d /var/log ]; then
    mkdir -p /var/log
fi

if [ ! -d /var/secure ]; then
    mkdir -p /var/secure
fi
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

تابع ورود به سیستم

یک تابع ورود به سیستم log_message برای ثبت پیام‌های دارای مهر زمانی در یک فایل گزارش تعریف شده است.

log_message() {
    local message="$1"
    echo "$(date +"%Y-%m-%d %H:%M:%S") - $message" >> $log_file
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

اعتبار سنجی آرگومان های ورودی

اسکریپت دقیقاً یک آرگومان را انتظار دارد، مسیر فایل کارمند. اگر آرگومان ارائه نشود یا فایل وجود نداشته باشد، خطا را ثبت می کند و خارج می شود.

# Check for correct number of arguments
if [ "$#" -ne 1 ]; then
    arg_err="Usage: $0 "
    echo "$arg_err"
    log_message "$arg_err"
    exit 1
fi  

employee_file=$1

# Check if the employee file exists
if [ ! -f "$employee_file" ]; then
    file_missing_err="Error: File '$employee_file' not found."
    echo "$file_missing_err"
    log_message "$file_missing_err"
    exit 1
fi
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

ایمن سازی فایل رمز عبور

فایل رمز عبور با تنظیم مجوزهای صحیح ایجاد و ایمن می شود تا فقط مالک بتواند فایل ایجاد شده برای کاربران و رمزهای عبور را بخواند. اجازه 600 فقط به مالک امتیاز خواندن می دهد

# Secure password file
log_message "Securing $password_file"
if [ ! -f $password_file ]; then
    echo "User,password" >> $password_file
    chmod 600 $password_file
fi  
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

پردازش کاربران و گروه ها

قطعه‌های زیر فایل کارمند را خط به خط می‌خواند، هر کاربر و گروه‌های مرتبط با آنها را پردازش می‌کند و عملیات زیر را انجام می‌دهد:

  1. ایجاد کاربر: بررسی می کند که آیا کاربر وجود دارد، در غیر این صورت کاربر را ایجاد می کند و یک رمز عبور تصادفی تنظیم می کند.
  2. ایجاد گروه: گروهی با نام کاربر ایجاد می کند و کاربر را به آن اضافه می کند. همچنین، کاربر را به گروه های مشخص شده اضافه می کند.
  3. فهرست اصلی: اطمینان حاصل می کند که کاربر یک فهرست اصلی دارد.

بیایید آن را تجزیه کنیم

  • خواندن فایل ورودی قطعه زیر هر خط را از یک فایل می خواند، خط را بر اساس نقطه ویرگول به کاربر و گروه تقسیم می کند و سپس هر فضای خالی اضافی را از این متغیرها برش می دهد.
while IFS=';' read -r user groups; do
    # Read users and groups from the .txt file
    user=$(echo "$user" | xargs)
    groups=$(echo "$groups" | xargs)
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

همچنین بررسی می کند که آیا یک خط خالی بین ورودی ها وجود دارد یا خیر. این شرط بررسی می‌کند که آیا کاربر یا گروه‌ها خالی هستند (-z رشته‌ای با طول صفر را بررسی می‌کند).

if [[ -z "$user" || -z "$groups" ]]; then
        newline_err="Skipping invalid line in the input file"
        echo "$newline_err"
        log_message "$newline_err"
        continue
fi
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

  • ایجاد آرایه کاربر و گروه قطعه زیر کاربر در حال پردازش را ثبت و چاپ می‌کند، گروه‌های او را به یک آرایه تقسیم می‌کند، فضای خالی هر گروه را برش می‌دهد و سپس فهرست پاک‌شده گروه را ثبت و چاپ می‌کند.
echo "=> Processing user: $user"
    log_message "Processing user: $user"
    IFS=',' read -r -a group_array  "$groups"

    for i in "${!group_array[@]}"; do
        group_array[$i]=$(echo "${group_array[$i]}" | xargs)
    done

    echo "=> Groups for $user: ${group_array[*]}"
    log_message "Groups for $user: ${group_array[*]}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

  • ایجاد گروهی با همان نام کاربر این قطعه بررسی می کند که آیا گروهی وجود دارد یا خیر، گروه را در صورت نبودن ایجاد می کند و اقدامات انجام شده را ثبت می کند.
 # Create group with the same name as the user
if getent group "$user" &>/dev/null; then
      echo "Group $user already exists."
      log_message "Group $user already exists."
else
      if groupadd "$user"; then
         echo "=> Group $user created."
         log_message "Group $user created."
      else
         echo "Error creating group $user."
         log_message "Error creating group $user."
         continue
      fi
fi   
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

اگر کاربری وجود داشته باشد، اسکریپت ما آن را ثبت می‌کند و به سمت دیگری حرکت می‌کند، کاربر ایجاد می‌شود و سپس وارد سیستم می‌شود.

توجه داشته باشید: > /dev/null پاسخ را سرکوب می کند تا مجبور نباشیم خروجی را ببینیم

  • پدید آوردن $HOME دایرکتوری برای کاربر و تولید رمزهای عبور این قطعه به ایجاد کاربران، از جمله راه‌اندازی فهرست اصلی و اختصاص رمز عبور، در حالی که همه اقدامات و خطاها را به درستی ثبت می‌کند، انجام می‌دهد.
 # Creating user, user's home directory and assigning a randomly generated password
    echo "=> Creating user: $user..."
    log_message "Creating user: $user"
    if id "$user" &>/dev/null; then
        echo "User $user already exists."
        log_message "User $user already exists."
    else
        if useradd -m -s "$shell" -g "$user" "$user"; then
            echo "=> User $user created with home directory /home/$user."
            log_message "User $user created with home directory /home/$user."

            password=$(head /dev/urandom | tr -dc A-Za-z0-9 | fold -w 16 | head -n 1)
            if echo "$user:$password" | chpasswd; then
                echo "$user,$password" >> $password_file
                echo "=> Password set for $user"
                log_message "Password set for $user"
            else
                echo "Error setting password for $user."
                log_message "Error setting password for $user."
                continue
            fi
        else
            echo "Error creating user $user."
            log_message "Error creating user $user."
            continue
        fi
    fi
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این if useradd -m -s "$shell" -g "$user" "$user" تلاش برای ایجاد یک کاربر جدید با فهرست اصلی (-m)، پوسته مشخص (-s “$shell”)، و گروه اصلی (-g “$user”).
password=$(head /dev/urandom | tr -dc A-Za-z0-9 | fold -w 16 | head -n 1) با استفاده از یک رمز عبور تصادفی 16 کاراکتری ایجاد می کند urandom.
if echo "$user:$password" | chpasswd; then رمز عبور ایجاد شده را برای کاربر با استفاده از chpasswd فرمان
سرانجام، echo "$user,$password" >> $password_file کاربر و رمز عبور او را به فایل رمز مشخص شده اضافه می کند.

  • افزودن کاربر به گروه‌های مشخص شده این قطعه هر کاربر را پردازش می‌کند و آنها را به گروه‌های مشخص شده اضافه می‌کند و در صورت عدم وجود گروه‌ها را ایجاد می‌کند.
for group in "${group_array[@]}"; do
        if getent group "$group" &>/dev/null; then
            echo "Group $group already exists."
            log_message "Group $group already exists."
        else
            if groupadd "$group"; then
                echo "Group $group created."
                log_message "Group $group created."
            else
                echo "Error creating group $group."
                log_message "Error creating group $group."
                continue
            fi
        fi
        if usermod -aG "$group" "$user"; then
            echo "=> Added $user to group $group."
            log_message "Added $user to group $group."
        else
            echo "Error adding $user to group $group."
            log_message "Error adding $user to group $group."
            continue
        fi
done
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

از طریق گروه حلقه می زند، گروه هایی که وجود ندارند با گروه ایجاد می شوند groupadd فرمان
if usermod -aG "$group" "$user" تلاش می کند کاربر را به گروه اضافه کند. اگر کاربر قبلاً عضو گروه باشد، خطا می دهد

  • پایان حلقه و پردازش فایل
  echo "--------------------"
done "$employee_file"
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

echo "--------------------" یک خط جداکننده را برای وضوح در خروجی چاپ می کند.
done continues processing the next user and group pairs from the employee_file.

اسکریپت کامل به این شکل است

while IFS=';' read -r user groups; do
    # Read users and groups from the .txt file
    user=$(echo "$user" | xargs)
    groups=$(echo "$groups" | xargs)

    if [[ -z "$user" || -z "$groups" ]]; then
        newline_err="Skipping invalid line in the input file"
        echo "$newline_err"
        log_message "$newline_err"
        continue
    fi

    echo "=> Processing user: $user"
    log_message "Processing user: $user"
    IFS=',' read -r -a group_array  "$groups"

    for i in "${!group_array[@]}"; do
        group_array[$i]=$(echo "${group_array[$i]}" | xargs)
    done

    echo "=> Groups for $user: ${group_array[*]}"
    log_message "Groups for $user: ${group_array[*]}"

    # Create group with the same name as the user
    if getent group "$user" &>/dev/null; then
        echo "Group $user already exists."
        log_message "Group $user already exists."
    else
        if groupadd "$user"; then
            echo "=> Group $user created."
            log_message "Group $user created."
        else
            echo "Error creating group $user."
            log_message "Error creating group $user."
            continue
        fi
    fi

    # Creating user, user's home directory and assigning a randomly generated password
    echo "=> Creating user: $user..."
    log_message "Creating user: $user"
    if id "$user" &>/dev/null; then
        echo "User $user already exists."
        log_message "User $user already exists."
    else
        if useradd -m -s "$shell" -g "$user" "$user"; then
            echo "=> User $user created with home directory /home/$user."
            log_message "User $user created with home directory /home/$user."

            password=$(head /dev/urandom | tr -dc A-Za-z0-9 | fold -w 6 | head -n 1)
            if echo "$user:$password" | chpasswd; then
                echo "$user,$password" >> $password_file
                echo "=> Password set for $user"
                log_message "Password set for $user"
            else
                echo "Error setting password for $user."
                log_message "Error setting password for $user."
                continue
            fi
        else
            echo "Error creating user $user."
            log_message "Error creating user $user."
            continue
        fi
    fi

    # Add the user to other specified groups
    for group in "${group_array[@]}"; do
        if getent group "$group" &>/dev/null; then
            echo "Group $group already exists."
            log_message "Group $group already exists."
        else
            if groupadd "$group"; then
                echo "Group $group created."
                log_message "Group $group created."
            else
                echo "Error creating group $group."
                log_message "Error creating group $group."
                continue
            fi
        fi
        if usermod -aG "$group" "$user"; then
            echo "=> Added $user to group $group."
            log_message "Added $user to group $group."
        else
            echo "Error adding $user to group $group."
            log_message "Error adding $user to group $group."
            continue
        fi
    done

    echo "--------------------"
done "$employee_file"
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

نتیجه

این پروژه به من چیزهای زیادی در مورد سیستم مجوز لینوکس، مدیریت کاربر و گروه، حلقه ها، شرطی ها و دستکاری فایل در bash به من آموخت. برای کسانی که علاقه مند به آزمایش مهارت های خود هستند، می توانند به کارآموزی HNG مراجعه کنند، جایی که کارآموزان DevOps را می پذیرند. این کاملا رایگان است اما یک نسخه پریمیوم در دسترس است، برای اطلاعات بیشتر به اینجا مراجعه کنید.

PS: هر گونه بازخورد قدردانی خواهد شد. ممنون که خواندید.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا