برنامه نویسی

ایجاد خودکار و مدیریت کاربر با Bash: راهنمای گام به گام

Summarize this content to 400 words in Persian Lang
ایجاد و مدیریت خودکار کاربر می تواند در زمان صرفه جویی کند، خطاها را کاهش دهد و امنیت را برای مهندسان SysOps افزایش دهد. در این مقاله، یک اسکریپت Bash را بررسی خواهیم کرد که ایجاد کاربران و گروه‌ها را خودکار می‌کند، دایرکتوری‌های خانگی را تنظیم می‌کند و رمزهای عبور را به صورت ایمن مدیریت می‌کند. اسکریپت از یک فایل متنی خوانده می شود که در آن هر خط از یک نام کاربری و گروه های مربوط به آنها تشکیل شده است، هر اقدامی را در یک فایل گزارش ثبت می کند و رمزهای عبور تصادفی تولید شده برای هر کاربر را در یک مکان امن ذخیره می کند. .csv فایل فقط برای مالک قابل دسترسی است.

بیایید به اسکریپت bash شیرجه بزنیم و آن را مرحله به مرحله تجزیه کنیم.

توضیح خط به خط

1.) اول از همه، ما شبانگ خود را داریم.

#!/bin/bash

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

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

این نوع اسکریپت مفسر را مشخص می کند که با آن اجرا می شود. از آنجایی که این یک اسکریپت “bash” است، باید با مترجم Bourne Again Shell (Bash) اجرا شود. همچنین، برخی از دستورات در اسکریپت ممکن است خارج از Bash به درستی تفسیر نشوند.

2.) مسیرهای فایل log و فایل رمز عبور برای جلوگیری از تکرار غیر ضروری در اسکریپت تنظیم شده است.

# Define log and password storage files
LOG_FILE=”/var/log/user_management.log”
PASSWORD_FILE=”/var/secure/user_passwords.csv”

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

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

3.) برای اطمینان از اینکه اسکریپت bash با حقوق ریشه اجرا می شود، یک دستور if بررسی می کند که آیا شناسه کاربر مؤثر (EUID) برابر با صفر است یا خیر. EUID مجوزهایی را که اسکریپت برای اجرا استفاده می کند تعیین می کند و 0 نشان دهنده شناسه کاربر ریشه در سیستم های لینوکس است. فقط کاربرانی که دارای امتیازات مدیریتی هستند (کاربرانی که می توانند از sudo یا خود کاربر ریشه استفاده کنند) می توانند اسکریپت را اجرا کنند. اگر شخصی سعی کند آن را بدون چنین امتیازاتی اجرا کند، یک پیام خطا و روند اجرای اسکریپت خاتمه می یابد.

# Check if the script is run with root privileges
if [[ $EUID -ne 0 ]]; then
echo “This script must be run with root privileges.” >&2
exit 1
fi

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

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

4.) برای اطمینان از اینکه یک فایل ورودی به عنوان آرگومان هنگام اجرای اسکریپت ارائه می شود، این کار را انجام دهید if در صورت عدم ارائه آرگومان، دستور اسکریپت را خاتمه می دهد. در این بیانیه، $# نشان دهنده آرگومان ارائه شده هنگام اجرای اسکریپت است. اگر برابر با صفر باشد (آگومان ارائه نشده است) یا اگر بزرگتر یا مساوی 2 باشد، یک پیغام خطا چاپ می شود و اجرای اسکریپت متوقف می شود.

# Check if the input file is provided
if [[ $# -eq 0 || $# -ge 2 ]]; then
echo “Usage: $0 ” >&2
exit 1
fi

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

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

5.) بعدی است log_action عملکردی که گزارش‌ها را با استفاده از حروف پررنگ (قالب‌بندی شده با کدهای فرار ANSI) ضبط می‌کند: \033[1m and \033[0m) and a timestamp (using the date command to get the current date and the specified date format: ‘%Y-%m-%d %H:%M:%S’). This function is used to log important steps, success messages, and error messages in the script.

# Log function
log_action() {
echo “————————————————–” | tee -a “$LOG_FILE”
echo -e “$(date +’%Y-%m-%d %H:%M:%S’) – \033[1m$1\033[0m” | tee -a “$LOG_FILE”
echo “————————————————–” | tee -a “$LOG_FILE”
}

Enter fullscreen mode

Exit fullscreen mode

6.) Next is the create_user_account function that manages the entire process of creating a user, setting up their home directories with appropriate permissions and ownership, adding them to specified groups, and assigning randomly generated passwords. Every important step is logged.

create_user_account function

create_user_account() {
local username=”$1″
local groups=”$2″

log_action “Creating user account ‘$username’…”

# Check if user already exists
if id “$username” &> /dev/null; then
echo “User ‘$username’ already exists. Skipping…” | tee -a “$LOG_FILE”
return 1
fi

# Create user with home directory and set shell
if useradd -m -s /bin/bash “$username”; then
echo “User $username created successfully.” | tee -a “$LOG_FILE”
else
echo “Error creating user $username.” | tee -a “$LOG_FILE”
return 1
fi

# Create user group if it does not exist (in case the script is run in other linux distributions that do not create user groups by default)
if ! getent group “$username” >/dev/null; then
groupadd “$username”
usermod -g “$username” “$username”
log_action “Group $username created.”
fi

# Set up home directory permissions
echo “Setting permissions for /home/$username…” | tee -a “$LOG_FILE”
chmod 700 “/home/$username” && chown “$username:$username” “/home/$username”
if [[ $? -eq 0 ]]؛ سپس “مجوزهای تنظیم شده برای /home/$username” را تکرار کنید. | tee -a “$LOG_FILE” other echo “خطا در تنظیم مجوزها برای /home/$username.” | tee -a “$LOG_FILE” return 1 fi # افزودن کاربر به گروه‌های اضافی (با کاما از هم جدا شده است) echo “افزودن کاربر $username به گروه‌های اضافی مشخص شده…” | tee -a “$LOG_FILE” IFS=’,’ read -ra group_array /dev/null; سپس اگر “$group” را به گروه اضافه کنید. سپس echo “Group $group وجود نداشت. اکنون ایجاد شد.” | tee -a “$LOG_FILE” other Echo “خطا در ایجاد گروه $group.” | tee -a “$LOG_FILE” ادامه fi fi # افزودن کاربر به گروه if gpasswd -a “$username” “$group”; سپس “User $username به گروه $group اضافه شد” بازتاب دهید. | tee -a “$LOG_FILE” other echo “خطا در افزودن username $ به گروه $group.” | اگر گروه دیگری مشخص نشده باشد، اگر گروه دیگری مشخص نشده باشد، ثبت نام کنید [[ -z “$groups” ]]؛ سپس “هیچ گروه اضافی مشخص نشده” را تکرار کنید. | tee -a “$LOG_FILE” fi # رمز عبور تصادفی ایجاد کنید، آن را برای کاربر تنظیم کنید، و آن را در یک echo ذخیره کنید “تنظیم رمز عبور برای کاربر $username…” | tee -a “$LOG_FILE” رمز عبور=$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 12) echo “$username:$password” | chpasswd if [[ $? -eq 0 ]]؛ سپس عبارت “Password set for user $username” را تکرار کنید. | tee -a “$LOG_FILE” echo “$username,$password” >> “$PASSWORD_FILE” else echo “خطا در تنظیم رمز عبور برای کاربر $username. حذف حساب کاربری $username” | tee -a “$LOG_FILE” userdel -r “$username” بازگشت 1 fi }

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

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

در تابع، در ابتدا متغیرهای محلی را تنظیم کردم تا مقادیر نام کاربری و گروه های مشخص شده را نگه دارند تا از تکرار جلوگیری شود.

local username=”$1″
local groups=”$2″

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

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

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

log_action “Creating user account ‘$username’…”

# Check if user already exists
if id “$username” &> /dev/null; then
echo “User ‘$username’ already exists. Skipping…” | tee -a “$LOG_FILE”
return 1
fi

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

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

بعد، یک دستور if وجود دارد که از عبارت استفاده می کند useradd فرمان با -m و -s پرچم برای ایجاد یک کاربر با پوسته ورود (در این مورد، پوسته ورود به سیستم تنظیم شده است /bin/bash. در صورت تمایل می توانید آن را اصلاح یا حذف کنید -s /bin/bash به طور کامل) و یک فهرست اصلی را به کاربر اختصاص می دهد. اگر در حین اجرای فرمان خطایی رخ دهد، فرآیند اجرای اسکریپت را متوقف می کند.

# Create user with home directory and set shell
if useradd -m -s /bin/bash “$username”; then
echo “User $username created successfully.” | tee -a “$LOG_FILE”
else
echo “Error creating user $username.” | tee -a “$LOG_FILE”
return 1
fi

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

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

در مرحله بعد، در صورتی که اسکریپت بر روی سایر توزیع‌های لینوکس اجرا شود که یک گروه اصلی با نام کاربر جدید ایجاد و اختصاص نمی‌دهند، دستور if در اینجا گروهی با همان نام کاربر ایجاد می‌کند و اضافه می‌کند. آن را به عنوان گروه اصلی کاربر.

# Create user group if it does not exist (in case the script is run in other linux distributions that do not create user groups by default)
if ! getent group “$username” >/dev/null; then
groupadd “$username”
usermod -g “$username” “$username”
log_action “Group $username created.”
fi

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

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

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

# Set up home directory permissions
echo “Setting permissions for /home/$username…” | tee -a “$LOG_FILE”
chmod 700 “/home/$username” && chown “$username:$username” “/home/$username”
if [[ $? -eq 0 ]]; then
echo “Permissions set for /home/$username.” | tee -a “$LOG_FILE”
else
echo “Error setting permissions for /home/$username.” | tee -a “$LOG_FILE”
return 1
fi

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

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

در این قسمت کاربر تازه ایجاد شده به گروه های اضافی مشخص شده در فایل ورودی اضافه می شود. با تنظیم Internal Field Separator (IFS) برای انتظار مقادیر جدا شده با کاما و استفاده از read فرمان با -ra پرچم ها، گروه ها به صورت جداگانه در داخل آرایه ای به نام قرار می گیرند group_array برای استفاده در حلقه for بعدی. در داخل حلقه، برای هر مقدار در group_array، مقدار xargs دستور هر فضای خالی را حذف می کند، گروه را در صورت عدم وجود ایجاد می کند و در نهایت کاربر را با استفاده از دستور به گروه اضافه می کند. gpasswd فرمان با -a پرچم. در صورتی که هیچ گروهی برای کاربر در فایل ورودی مشخص نشده باشد، پیامی چاپ خواهد شد.

# Add user to additional groups (comma separated)
echo “Adding user $username to specified additional groups…” | tee -a “$LOG_FILE”
IFS=’,’ read -ra group_array /dev/null; then
if groupadd “$group”; then
echo “Group $group did not exist. Now created.” | tee -a “$LOG_FILE”
else
echo “Error creating group $group.” | tee -a “$LOG_FILE”
continue
fi
fi

# Add user to group
if gpasswd -a “$username” “$group”; then
echo “User $username added to group $group.” | tee -a “$LOG_FILE”
else
echo “Error adding user $username to group $group.” | tee -a “$LOG_FILE”
fi
done

# Log if no additional groups are specified
if [[ -z “$groups” ]]; then
echo “No additional groups specified.” | tee -a “$LOG_FILE”
fi

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

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

برای بخش آخر تابع، یک رمز عبور تصادفی 12 کاراکتری تولید و برای کاربر تنظیم می شود. دستور head جریانی از بایت های تصادفی را از /dev/urandom فایل. این جریان به لوله کشی می شود tr دستور، که بایت ها را فیلتر می کند تا فقط کاراکترهای الفبایی (AZ، az، 0-9) را با استفاده از -dc پرچم. سپس نتیجه فیلتر شده به دستور سر دیگری منتقل می‌شود که تنها ۱۲ کاراکتر اول را از جریان ویرایش شده انتخاب می‌کند. سپس رمز عبور با وارد کردن نام کاربر و رمز عبور تصادفی ایجاد شده در آن تنظیم می شود chpasswd فرمان کاربر و رمز عبور تولید شده در رمز عبور تعیین شده ذخیره می شوند .csv فایل. اگر تنظیم رمز عبور ناموفق باشد، اسکریپت حساب کاربری را حذف می کند و خطا را ثبت می کند تا از هرگونه خطر امنیتی احتمالی جلوگیری شود.

# Generate random password, set it for the user, and store it in a file
echo “Setting password for user $username…” | tee -a “$LOG_FILE”
password=$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 12)
echo “$username:$password” | chpasswd
if [[ $? -eq 0 ]]; then
echo “Password set for user $username.” | tee -a “$LOG_FILE”
echo “$username,$password” >> “$PASSWORD_FILE”
else
echo “Error setting password for user $username. Deleting $username user account” | tee -a “$LOG_FILE”
userdel -r “$username”
return 1
fi

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

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

7.) پس از ایجاد تابع create_user_account، اسکریپت یک فایل حاوی اطلاعات کاربر را پردازش می کند و بر این اساس حساب های کاربری ایجاد می کند.

# Process the user file
user_file=”$1″
while IFS=’;’ read -r username groups; do
if create_user_account “$username” “${groups%%[ ;]}”; then
log_action “User account ‘$username’ created successfully.”
else
log_action “Error creating user account ‘$username’.”
fi
done

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

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

اسکریپت فایل کاربر را به عنوان آرگومان خود می گیرد و آن را به متغیر اختصاص می دهد user_file.
حلقه while هر خط از فایل کاربر را می خواند. «IFS=’;’part sets the Internal Field Separator to a semicolon (;), splitting each line at the semicolon. Theقسمت read -r` username groups قسمت های تقسیم شده را به متغیرهای نام کاربری و گروه بندی می خواند.
برای هر خط در فایل، اسکریپت تابع create_user_account را با نام کاربری و گروه ها (با حذف فاصله های انتهایی) فراخوانی می کند. using ${groups%%[ ;]}). اسکریپت همچنین یک پیام را ثبت می کند اگر نتیجه از create_user_account موفقیت یا شکست بود

8.) پس از انجام تمام کارهایی که انجام شد، اسکریپت فقط به مالک (ریشه) و کسانی که دارای امتیازات روت هستند به فایل رمز دسترسی می دهد، اتمام اجرای اسکریپت را ثبت می کند و فایل لاگ و محل فایل رمز عبور را چاپ می کند.

`

chmod 600 “$PASSWORD_FILE”

log_action “User creation script completed.”

echo “Check $LOG_FILE for details.”echo “Check $PASSWORD_FILE for user passwords.”`Prerequisites for running the script

A Linux system
A bash terminal (Optional. You can use any available shell terminal on the Linux system).
Root privileges on your system.
The text file containing the usernames and groups, must be formatted as username;group1,group2.

برای اجرای اسکریپت:1.) فایل را از مخزن HNG_Stage1 کپی یا کلون کنید

2.) فایل متنی حاوی نام های کاربری و گروه ها را در پوشه ای که اسکریپت در آن قرار دارد کپی کنید.

3.) سپس، در دایرکتوری که هم اکنون اسکریپت و فایل متنی در آن قرار دارند، اجرا کنید sudo ./create_users.sh

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

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

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

بیایید به اسکریپت bash شیرجه بزنیم و آن را مرحله به مرحله تجزیه کنیم.

توضیح خط به خط

1.) اول از همه، ما شبانگ خود را داریم.

#!/bin/bash
وارد حالت تمام صفحه شوید

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

این نوع اسکریپت مفسر را مشخص می کند که با آن اجرا می شود. از آنجایی که این یک اسکریپت “bash” است، باید با مترجم Bourne Again Shell (Bash) اجرا شود. همچنین، برخی از دستورات در اسکریپت ممکن است خارج از Bash به درستی تفسیر نشوند.

2.) مسیرهای فایل log و فایل رمز عبور برای جلوگیری از تکرار غیر ضروری در اسکریپت تنظیم شده است.

# Define log and password storage files
LOG_FILE="/var/log/user_management.log"
PASSWORD_FILE="/var/secure/user_passwords.csv"
وارد حالت تمام صفحه شوید

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

3.) برای اطمینان از اینکه اسکریپت bash با حقوق ریشه اجرا می شود، یک دستور if بررسی می کند که آیا شناسه کاربر مؤثر (EUID) برابر با صفر است یا خیر. EUID مجوزهایی را که اسکریپت برای اجرا استفاده می کند تعیین می کند و 0 نشان دهنده شناسه کاربر ریشه در سیستم های لینوکس است. فقط کاربرانی که دارای امتیازات مدیریتی هستند (کاربرانی که می توانند از sudo یا خود کاربر ریشه استفاده کنند) می توانند اسکریپت را اجرا کنند. اگر شخصی سعی کند آن را بدون چنین امتیازاتی اجرا کند، یک پیام خطا و روند اجرای اسکریپت خاتمه می یابد.

# Check if the script is run with root privileges
if [[ $EUID -ne 0 ]]; then
  echo "This script must be run with root privileges." >&2
  exit 1
fi
وارد حالت تمام صفحه شوید

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

4.) برای اطمینان از اینکه یک فایل ورودی به عنوان آرگومان هنگام اجرای اسکریپت ارائه می شود، این کار را انجام دهید if در صورت عدم ارائه آرگومان، دستور اسکریپت را خاتمه می دهد. در این بیانیه، $# نشان دهنده آرگومان ارائه شده هنگام اجرای اسکریپت است. اگر برابر با صفر باشد (آگومان ارائه نشده است) یا اگر بزرگتر یا مساوی 2 باشد، یک پیغام خطا چاپ می شود و اجرای اسکریپت متوقف می شود.

# Check if the input file is provided
if [[ $# -eq 0 || $# -ge 2 ]]; then
  echo "Usage: $0 " >&2
  exit 1
fi

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

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

5.) بعدی است log_action عملکردی که گزارش‌ها را با استفاده از حروف پررنگ (قالب‌بندی شده با کدهای فرار ANSI) ضبط می‌کند: \033[1m and \033[0m) and a timestamp (using the date command to get the current date and the specified date format: '%Y-%m-%d %H:%M:%S'). This function is used to log important steps, success messages, and error messages in the script.

# Log function
log_action() {
  echo "--------------------------------------------------" | tee -a "$LOG_FILE"
  echo -e "$(date +'%Y-%m-%d %H:%M:%S') - \033[1m$1\033[0m" | tee -a "$LOG_FILE"
  echo "--------------------------------------------------" | tee -a "$LOG_FILE"
}
Enter fullscreen mode

Exit fullscreen mode

6.) Next is the create_user_account function that manages the entire process of creating a user, setting up their home directories with appropriate permissions and ownership, adding them to specified groups, and assigning randomly generated passwords. Every important step is logged.

create_user_account function



create_user_account() {
  local username="$1"
  local groups="$2"

  log_action "Creating user account '$username'..."

  # Check if user already exists
  if id "$username" &> /dev/null; then
    echo "User '$username' already exists. Skipping..." | tee -a "$LOG_FILE"
    return 1
  fi

  # Create user with home directory and set shell
  if useradd -m -s /bin/bash "$username"; then
    echo "User $username created successfully." | tee -a "$LOG_FILE"
  else
    echo "Error creating user $username." | tee -a "$LOG_FILE"
    return 1
  fi

  # Create user group if it does not exist (in case the script is run in other linux distributions that do not create user groups by default)
  if ! getent group "$username" >/dev/null; then
    groupadd "$username"
    usermod -g "$username" "$username"
    log_action "Group $username created."
  fi

  # Set up home directory permissions
  echo "Setting permissions for /home/$username..." | tee -a "$LOG_FILE"
  chmod 700 "/home/$username" && chown "$username:$username" "/home/$username"
  if [[ $? -eq 0 ]]؛  سپس "مجوزهای تنظیم شده برای /home/$username" را تکرار کنید.  |  tee -a "$LOG_FILE" other echo "خطا در تنظیم مجوزها برای /home/$username."  |  tee -a "$LOG_FILE" return 1 fi # افزودن کاربر به گروه‌های اضافی (با کاما از هم جدا شده است) echo "افزودن کاربر $username به گروه‌های اضافی مشخص شده..." |  tee -a "$LOG_FILE" IFS=',' read -ra group_array /dev/null;  سپس اگر "$group" را به گروه اضافه کنید.  سپس echo "Group $group وجود نداشت. اکنون ایجاد شد."  |  tee -a "$LOG_FILE" other Echo "خطا در ایجاد گروه $group."  |  tee -a "$LOG_FILE" ادامه fi fi # افزودن کاربر به گروه if gpasswd -a "$username" "$group";  سپس "User $username به گروه $group اضافه شد" بازتاب دهید.  |  tee -a "$LOG_FILE" other echo "خطا در افزودن username $ به گروه $group."  |  اگر گروه دیگری مشخص نشده باشد، اگر گروه دیگری مشخص نشده باشد، ثبت نام کنید [[ -z "$groups" ]]؛  سپس "هیچ گروه اضافی مشخص نشده" را تکرار کنید.  |  tee -a "$LOG_FILE" fi # رمز عبور تصادفی ایجاد کنید، آن را برای کاربر تنظیم کنید، و آن را در یک echo ذخیره کنید "تنظیم رمز عبور برای کاربر $username..." |  tee -a "$LOG_FILE" رمز عبور=$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 12) echo "$username:$password" |  chpasswd if [[ $? -eq 0 ]]؛  سپس عبارت "Password set for user $username" را تکرار کنید.  |  tee -a "$LOG_FILE" echo "$username,$password" >> "$PASSWORD_FILE" else echo "خطا در تنظیم رمز عبور برای کاربر $username. حذف حساب کاربری $username" |  tee -a "$LOG_FILE" userdel -r "$username" بازگشت 1 fi }

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

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

  • در تابع، در ابتدا متغیرهای محلی را تنظیم کردم تا مقادیر نام کاربری و گروه های مشخص شده را نگه دارند تا از تکرار جلوگیری شود.

local username="$1"
local groups="$2"
وارد حالت تمام صفحه شوید

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

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

log_action "Creating user account '$username'..."

  # Check if user already exists
  if id "$username" &> /dev/null; then
    echo "User '$username' already exists. Skipping..." | tee -a "$LOG_FILE"
    return 1
  fi

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

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

  • بعد، یک دستور if وجود دارد که از عبارت استفاده می کند useradd فرمان با -m و -s پرچم برای ایجاد یک کاربر با پوسته ورود (در این مورد، پوسته ورود به سیستم تنظیم شده است /bin/bash. در صورت تمایل می توانید آن را اصلاح یا حذف کنید -s /bin/bash به طور کامل) و یک فهرست اصلی را به کاربر اختصاص می دهد. اگر در حین اجرای فرمان خطایی رخ دهد، فرآیند اجرای اسکریپت را متوقف می کند.

# Create user with home directory and set shell
  if useradd -m -s /bin/bash "$username"; then
    echo "User $username created successfully." | tee -a "$LOG_FILE"
  else
    echo "Error creating user $username." | tee -a "$LOG_FILE"
    return 1
  fi
وارد حالت تمام صفحه شوید

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

  • در مرحله بعد، در صورتی که اسکریپت بر روی سایر توزیع‌های لینوکس اجرا شود که یک گروه اصلی با نام کاربر جدید ایجاد و اختصاص نمی‌دهند، دستور if در اینجا گروهی با همان نام کاربر ایجاد می‌کند و اضافه می‌کند. آن را به عنوان گروه اصلی کاربر.

# Create user group if it does not exist (in case the script is run in other linux distributions that do not create user groups by default)
  if ! getent group "$username" >/dev/null; then
    groupadd "$username"
    usermod -g "$username" "$username"
    log_action "Group $username created."
  fi
وارد حالت تمام صفحه شوید

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

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

# Set up home directory permissions
  echo "Setting permissions for /home/$username..." | tee -a "$LOG_FILE"
  chmod 700 "/home/$username" && chown "$username:$username" "/home/$username"
  if [[ $? -eq 0 ]]; then
    echo "Permissions set for /home/$username." | tee -a "$LOG_FILE"
  else
    echo "Error setting permissions for /home/$username." | tee -a "$LOG_FILE"
    return 1
  fi

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

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

  • در این قسمت کاربر تازه ایجاد شده به گروه های اضافی مشخص شده در فایل ورودی اضافه می شود. با تنظیم Internal Field Separator (IFS) برای انتظار مقادیر جدا شده با کاما و استفاده از read فرمان با -ra پرچم ها، گروه ها به صورت جداگانه در داخل آرایه ای به نام قرار می گیرند group_array برای استفاده در حلقه for بعدی. در داخل حلقه، برای هر مقدار در group_array، مقدار xargs دستور هر فضای خالی را حذف می کند، گروه را در صورت عدم وجود ایجاد می کند و در نهایت کاربر را با استفاده از دستور به گروه اضافه می کند. gpasswd فرمان با -a پرچم. در صورتی که هیچ گروهی برای کاربر در فایل ورودی مشخص نشده باشد، پیامی چاپ خواهد شد.

# Add user to additional groups (comma separated)
  echo "Adding user $username to specified additional groups..." | tee -a "$LOG_FILE"
  IFS=',' read -ra group_array /dev/null; then
      if groupadd "$group"; then
        echo "Group $group did not exist. Now created." | tee -a "$LOG_FILE"
      else
        echo "Error creating group $group." | tee -a "$LOG_FILE"
        continue
      fi
    fi

    # Add user to group
    if gpasswd -a "$username" "$group"; then
      echo "User $username added to group $group." | tee -a "$LOG_FILE"
    else
      echo "Error adding user $username to group $group." | tee -a "$LOG_FILE"
    fi
  done

  # Log if no additional groups are specified
  if [[ -z "$groups" ]]; then
    echo "No additional groups specified." | tee -a "$LOG_FILE"
  fi
وارد حالت تمام صفحه شوید

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

  • برای بخش آخر تابع، یک رمز عبور تصادفی 12 کاراکتری تولید و برای کاربر تنظیم می شود. دستور head جریانی از بایت های تصادفی را از /dev/urandom فایل. این جریان به لوله کشی می شود tr دستور، که بایت ها را فیلتر می کند تا فقط کاراکترهای الفبایی (AZ، az، 0-9) را با استفاده از -dc پرچم. سپس نتیجه فیلتر شده به دستور سر دیگری منتقل می‌شود که تنها ۱۲ کاراکتر اول را از جریان ویرایش شده انتخاب می‌کند. سپس رمز عبور با وارد کردن نام کاربر و رمز عبور تصادفی ایجاد شده در آن تنظیم می شود chpasswd فرمان کاربر و رمز عبور تولید شده در رمز عبور تعیین شده ذخیره می شوند .csv فایل. اگر تنظیم رمز عبور ناموفق باشد، اسکریپت حساب کاربری را حذف می کند و خطا را ثبت می کند تا از هرگونه خطر امنیتی احتمالی جلوگیری شود.

# Generate random password, set it for the user, and store it in a file
  echo "Setting password for user $username..." | tee -a "$LOG_FILE"
  password=$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 12)
  echo "$username:$password" | chpasswd
  if [[ $? -eq 0 ]]; then
    echo "Password set for user $username." | tee -a "$LOG_FILE"
    echo "$username,$password" >> "$PASSWORD_FILE"
  else
    echo "Error setting password for user $username. Deleting $username user account" | tee -a "$LOG_FILE"
    userdel -r "$username"
    return 1
  fi

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

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

7.) پس از ایجاد تابع create_user_account، اسکریپت یک فایل حاوی اطلاعات کاربر را پردازش می کند و بر این اساس حساب های کاربری ایجاد می کند.

# Process the user file
user_file="$1"
while IFS=';' read -r username groups; do
  if create_user_account "$username" "${groups%%[ ;]}"; then
    log_action "User account '$username' created successfully."
  else
    log_action "Error creating user account '$username'."
  fi
done 
وارد حالت تمام صفحه شوید

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

  • اسکریپت فایل کاربر را به عنوان آرگومان خود می گیرد و آن را به متغیر اختصاص می دهد user_file.

  • حلقه while هر خط از فایل کاربر را می خواند. «IFS=';part sets the Internal Field Separator to a semicolon (;), splitting each line at the semicolon. Theقسمت read -r` username groups قسمت های تقسیم شده را به متغیرهای نام کاربری و گروه بندی می خواند.

  • برای هر خط در فایل، اسکریپت تابع create_user_account را با نام کاربری و گروه ها (با حذف فاصله های انتهایی) فراخوانی می کند. using ${groups%%[ ;]}). اسکریپت همچنین یک پیام را ثبت می کند اگر نتیجه از create_user_account موفقیت یا شکست بود

8.) پس از انجام تمام کارهایی که انجام شد، اسکریپت فقط به مالک (ریشه) و کسانی که دارای امتیازات روت هستند به فایل رمز دسترسی می دهد، اتمام اجرای اسکریپت را ثبت می کند و فایل لاگ و محل فایل رمز عبور را چاپ می کند.

`

chmod 600 “$PASSWORD_FILE”

log_action “User creation script completed.”

echo “Check $LOG_FILE for details.”
echo “Check $PASSWORD_FILE for user passwords.”
`
Prerequisites for running the script

  • A Linux system

  • A bash terminal (Optional. You can use any available shell terminal on the Linux system).

  • Root privileges on your system.

  • The text file containing the usernames and groups, must be formatted as username;group1,group2.

برای اجرای اسکریپت:
1.) فایل را از مخزن HNG_Stage1 کپی یا کلون کنید

2.) فایل متنی حاوی نام های کاربری و گروه ها را در پوشه ای که اسکریپت در آن قرار دارد کپی کنید.

3.) سپس، در دایرکتوری که هم اکنون اسکریپت و فایل متنی در آن قرار دارند، اجرا کنید sudo ./create_users.sh

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

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

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

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

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

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