اسکریپت مدیریت خودکار کاربر برای سیستم های لینوکس

امروزه مدیریت صحیح حساب های کاربری برای متخصصان DevOps که در تنظیمات پویا IT کار می کنند بسیار مهم است.
مزیت ارائه کاربر این است که باعث صرفه جویی در زمان، تضمین ثبات، امنیت در سراسر سیستم ها و بهبود کارایی می شود زیرا بسیاری از فرآیندها می توانند خودکار شوند.
در این مقاله در مورد اسکریپت bash و نحوه ایجاد یک اسکریپت bash که می تواند برای ایجاد و مدیریت حساب های کاربران در سرورهای لینوکس استفاده شود، صحبت خواهیم کرد.
در این مقاله ما یک اسکریپت می نویسیم که یک فایل متنی حاوی نام کاربری و نام گروه کارمند را می خواند، که در آن هر خط به عنوان “user;groups” قالب بندی می شود.
این اسکریپت کاربران و گروههایی را همانطور که مشخص شده است ایجاد میکند، دایرکتوریهای خانگی را با مجوزها و مالکیت مناسب راهاندازی میکند، رمزهای عبور تصادفی برای کاربران ایجاد میکند و همه اقدامات را ثبت میکند. var/log/user_management.log
علاوه بر این، رمزهای عبور ایجاد شده را به صورت ایمن در آن ذخیره می کند /var/secure/user_passwords.txt.
ما از رسیدگی به خطا برای سناریوهایی مانند کاربران موجود توسط اسکریپت اطمینان حاصل خواهیم کرد.
-
هر کاربر یک گروه شخصی با نام گروه مشابه با نام کاربری خواهد داشت، این نام گروه در فایل متنی نوشته نخواهد شد.
-
یک کاربر می تواند چندین گروه داشته باشد که هر گروه با کاما “,”
-
نام های کاربری و گروه های کاربری با نقطه ویرگول “;” از هم جدا می شوند.
مثلا؛
- سبک؛ sudo,dev,www-data
- ایدیما; من عرق می کنم
- مایووا توسعه دهنده، www-data
جایی که نور نام کاربری است و گروهها sudo، dev، www-data هستند
اولا،
#!/bin/bash
# Check if script is run as root
if [ "$EUID" -ne 0 ]; then
echo "Please run as root"
exit 1
fi
#!/bin/bash نماد shebang است که به سیستم عامل می گوید از کدام مترجم استفاده کند و در مورد ما از پوسته bash استفاده خواهد کرد.
اگر [ “$EUID” -ne 0 ]; با این کار بررسی میشود که آیا اسکریپت بهعنوان «ریشه» اجرا میشود، زیرا اطمینان حاصل میکند که ما برای انجام کارهایی که به امتیازات فوقالعاده نیاز دارند دسترسی مدیریتی داریم که مقدار ID به صفر (۰) اختصاص داده شده است.
EUID به معنای شناسه کاربر مؤثر و -ne است (مقایسه عددی که به معنای برابر نیست)
بعد؛
# Check if the input file is provided
if [ -z "$1" ]; then
echo "Usage: bash create_users.sh "
exit 1
fi
ما اطمینان حاصل می کنیم که یک آرگومان موقعیتی به اسکریپت ارسال می شود و در صورت عدم تصویب، از (1) خارج می شود و پیام را تکرار می کند. “استفاده: bash create_user.sh”، برای فعال کردن کاربر برای عبور آرگومان مناسب.
-z یک مقدار رشته ای است که به این معنی است که طول مقدار صفر است و “$1” اولین پارامتر بعد از نام اسکریپت را نشان می دهد ($0) که نام متغیر INPUT_FILE به آن اختصاص داده شده است. بنابراین بررسی می کند که آیا اولین پارامتر موقعیتی خالی است یا خیر.
بعد؛
INPUT_FILE="$1"
LOG_FILE="/var/log/user_management.log"
PASSWORD_FILE="/var/secure/user_passwords.txt"
# Ensure log and password files exist and have the correct permissions
touch $LOG_FILE
chmod 644 $LOG_FILE
mkdir -p /var/secure
touch $PASSWORD_FILE
chmod 600 $PASSWORD_FILE
بنابراین ما یک directory_ /var/secure ایجاد می کنیم و یک فایل _user_password.txt ایجاد کنید در آن میخواهیم رمز عبور کاربر را به روشی امن با استفاده از مجوز “600” ذخیره کنیم، اجازه خواندن (rw) را فقط به مالک اعطا میکنیم و فایل management.log را در فهرست /var/log ایجاد میکنیم تا همه رویدادها را ثبت کنیم.
اولین پارامتر موقعیتی ($1) به INPUT_FILE به عنوان متغیر اختصاص داده می شود
بعد؛
# Function to generate random password
generate_password() {
openssl rand -base64 12
}
ما از دستور OpenSSL استفاده خواهیم کرد رند برای ایجاد یک رمز عبور رمزنگاری با کد base64 (قوی و مقاوم چون حاوی حروف، اعداد و کاراکترها است).
این تابع قرار است رمز عبور را تولید کند و ما آن را در اسکریپت فراخوانی می کنیم.
بعد؛
# Process the input file
while IFS=';' read -r username groups; do
# Create personal group for the user
if ! getent group "$username" &>/dev/null; then
groupadd "$username"
echo "Created group $username" | tee -a $LOG_FILE
fi
بیایید فایل ورودی را پردازش کنیم.
IFS به معنای جداکننده میدان داخلی است. این یک متغیر محیطی است که لیستی از کاراکترهایی را تعریف می کند که پوسته Bash به عنوان جداکننده فیلد استفاده می کند. اینها شامل فضا، تب، خط جدید است.
از شرط while برای خواندن نام کاربری و گروه یادداشت جداکننده ها توسط IFS استفاده کنید.
ما یک گروه شخصی برای کاربر ایجاد خواهیم کرد، اما قبل از آن، پایگاه داده گروه سیستم (/etc/group) را با استفاده از دریافت دستور برای اطمینان از عدم حضور گروه.
الف را اضافه می کنیم عملگر نفی (!) که عبارت را نفی می کند و آن را True می کند، اگر گروه $ وجود نداشته باشد و در نتیجه باعث ایجاد گروه در صورت عدم وجود با استفاده از گروه اضافه کردن فرمان
# Check if user already exists
if id "$username" &>/dev/null; then
echo "User $username already exists. Skipping..." | tee -a $LOG_FILE
continue
fi
اگر کاربر از قبل وجود داشته باشد، اسکریپت پوسته ما یک پیغام خطایی می دهد که نشان می دهد کاربر وجود دارد اما می خواهیم چنین خروجی (خطای استاندارد یا خروجی) را به /dev/null و سه راهی خروجی را می خواند و آن را بی صدا در $LOG_FILE ذخیره می کند.
سپس از ادامه برای ایجاد کاربر در صورت عدم وجود کاربر استفاده می کنیم.
# Create user and personal group
useradd -m -s /bin/bash -g "$username" "$username"
if [ $? -eq 0 ]; then
echo "Created user $username with a personal group $username" | tee -a $LOG_FILE
else
echo "Failed to create user $username" | tee -a $LOG_FILE
continue
fi
بیایید user user را اضافه کنیم و با استفاده از دستور محبوب به گروه شخصی اضافه کنیم useradd و از -m(برای افزودن یک فهرست اصلی برای کاربر، -s (برای تنظیم پوسته به /bin/bash) استفاده کنید.
اگر کاربر با موفقیت ایجاد و به گروه شخصی اضافه شود، وضعیت خروج ($?) برابر با صفر (0) می شود و پیام موفقیت آمیز “Created user $username with a personal group $username” را در $LOG_FILE چاپ می کند و اگر نه اینکه دستور else را اجرا کند.
بعد؛
# Generate password and set it for the user
password=$(generate_password)
echo "$username:$password" | chpasswd
if [ $? -eq 0 ]; then
echo "$username,$password" >> $PASSWORD_FILE
echo "Set password for $username" | tee -a $LOG_FILE
else
echo "Failed to set password for $username" | tee -a $LOG_FILE
fi
بیایید تابع را برای تولید رمز عبور فراخوانی کنیم و رمز عبور را برای کاربر با استفاده از chpasswd (تغییر رمز عبور) تنظیم کنیم، نام کاربری، رمز عبور را در $PASSWORD_FILE بنویسیم و آن را وارد کنیم.
chpasswd برای پردازش چندین جفت نام کاربری و رمز عبور از ورودی استاندارد (معمولاً از طریق یک لوله | یا یک تغییر مسیر) طراحی شده است.
بعد،
# Create additional groups if specified
if [ -n "$groups" ]; then
IFS=',' read -ra group_array /dev/null; then
groupadd "$group"
echo "Created group $group" | tee -a $LOG_FILE
fi
fi
ما گروه دیگری را ایجاد خواهیم کرد که کاربر با ارسال $groups به عنوان یک آرایه و تکرار روی آن توسط “${group_array” خواهد بود.[@]}” که در آن “@” هر کاراکتری را القا می کند.
کاراکتر -n نیز شبیه به -z است فقط به این دلیل که مقدار طول آن بزرگتر از صفر است
ما پایگاه داده گروه سیستم (/etc/group) را با استفاده از دستور getent بررسی می کنیم اما یک عملگر نفی (!) اضافه می کنیم که عبارت را نفی می کند و آن را True می کند، اگر گروه $ وجود نداشته باشد و در نتیجه باعث ایجاد گروه می شود. اگر وجود ندارد با استفاده از دستور groupadd همانطور که قبلاً بحث شد.
بعد؛
usermod -aG "$group" "$username"
if [ $? -eq 0 ]; then
echo "Added $username to group $group" | tee -a $LOG_FILE
else
echo "Failed to add $username to group $group" | tee -a $LOG_FILE
fi
done
fi
سپس کاربر را با استفاده از دستور usermod -aG به گروه اضافه می کنیم
سرانجام،
done
شرط حلقه while خود را می بندیم و $INPUT_FILE را برای خواندن خطوط از آن پاس می کنیم.
یک دایرکتوری ایجاد کنید، فایلی به نام create.sh (اسکریپت پوسته) را در دایرکتوری لمس کنید و فایل را قابل اجرا کنید.
sudo mkdir -p ~/bash-script
sudo chmod +x ~/bash-script/create_users.sh
ایجاد را باز کنید و این اسکریپت را بچسبانید.
#!/bin/bash
#check if script is run as root
if [ "$EUID" -ne 0 ]; then
echo "Please run as root"
exit 1
fi
# Check if the input file is provided
if [ -z "$1" ]; then
echo "Usage: bash create_users.sh "
exit 1
fi
INPUT_FILE="$1"
LOG_FILE="/var/log/user_management.log"
PASSWORD_FILE="/var/secure/user_passwords.txt"
# Ensure log and password files exist and have the correct permissions
touch $LOG_FILE
chmod 644 $LOG_FILE
mkdir -p /var/secure
touch $PASSWORD_FILE
chmod 600 $PASSWORD_FILE
# Function to generate random password
generate_password() {
openssl rand -base64 12
}
# Process the input file
while IFS=';' read -r username groups; do
# Create personal group for the user
if ! getent group "$username" &>/dev/null; then
groupadd "$username"
echo "Created group $username" | tee -a $LOG_FILE
fi
# Check if user already exists
if id "$username" &>/dev/null; then
echo "User $username already exists. Skipping..." | tee -a $LOG_FILE
continue
fi
# Create user and personal group
useradd -m -s /bin/bash -g "$username" "$username"
if [ $? -eq 0 ]; then
echo "Created user $username with a personal group $username" | tee -a $LOG_FILE
else
echo "Failed to create user $username" | tee -a $LOG_FILE
continue
fi
# Generate password and set it for the user
password=$(generate_password)
echo "$username:$password" | chpasswd
if [ $? -eq 0 ]; then
echo "$username,$password" >> $PASSWORD_FILE
echo "Set password for $username" | tee -a $LOG_FILE
else
echo "Failed to set password for $username" | tee -a $LOG_FILE
fi
# Create additional groups if specified
if [ -n "$groups" ]; then
IFS=',' read -ra group_array /dev/null; then
groupadd "$group"
echo "Created group $group" | tee -a $LOG_FILE
fi
usermod -aG "$group" "$username"
if [ $? -eq 0 ]; then
echo "Added $username to group $group" | tee -a $LOG_FILE
else
echo "Failed to add $username to group $group" | tee -a $LOG_FILE
fi
done
fi
done
یک فایل (input_file.txt) حاوی نام کاربری؛ گروه ها ایجاد کنید
light; sudo,dev,www-data
idimma; sudo
mayowa; dev,www-data
اسکریپت را اجرا کنید و input_file.txt را به عنوان آرگومان ارسال کنید.
از اینکه مطالعه کردید متشکریم، برای یادگیری بیشتر لطفاً به برنامه کارآموزی HNG بپیوندید تا مهارت های فنی خود را ارتقا دهید و شغل رویایی خود را بدست آورید.
این لینک را دنبال کنید
https://hng.tech/internship،
https://hng.tech/hire
hsh