Bash Scripting: مدیریت خودکار کاربر در لینوکس
![Bash Scripting: مدیریت خودکار کاربر در لینوکس 1 https%3A%2F%2Fdev to uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F75yaa8ivlarhpwacgzz0](https://i0.wp.com/media.dev.to/cdn-cgi/image/width=1000,height=500,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F75yaa8ivlarhpwacgzz0.png?w=780&resize=780,470&ssl=1)
چرا خودکار می کنیم؟
مدیریت کاربران و گروه ها در یک سیستم لینوکس می تواند یک کار خسته کننده باشد، به خصوص اگر مجبور باشید چندین حساب را مدیریت کنید. خوشبختانه با کمی دانش اسکریپت نویسی می توانید این فرآیند را خودکار کنید. در این مقاله، من شما را از طریق یک اسکریپت ساده 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
پردازش کاربران و گروه ها
قطعههای زیر فایل کارمند را خط به خط میخواند، هر کاربر و گروههای مرتبط با آنها را پردازش میکند و عملیات زیر را انجام میدهد:
- ایجاد کاربر: بررسی می کند که آیا کاربر وجود دارد، در غیر این صورت کاربر را ایجاد می کند و یک رمز عبور تصادفی تنظیم می کند.
- ایجاد گروه: گروهی با نام کاربر ایجاد می کند و کاربر را به آن اضافه می کند. همچنین، کاربر را به گروه های مشخص شده اضافه می کند.
- فهرست اصلی: اطمینان حاصل می کند که کاربر یک فهرست اصلی دارد.
بیایید آن را تجزیه کنیم
- خواندن فایل ورودی قطعه زیر هر خط را از یک فایل می خواند، خط را بر اساس نقطه ویرگول به کاربر و گروه تقسیم می کند و سپس هر فضای خالی اضافی را از این متغیرها برش می دهد.
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: هر گونه بازخورد قدردانی خواهد شد. ممنون که خواندید.