برنامه نویسی

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

امروزه مدیریت صحیح حساب های کاربری برای متخصصان DevOps که در تنظیمات پویا IT کار می کنند بسیار مهم است.
مزیت ارائه کاربر این است که باعث صرفه جویی در زمان، تضمین ثبات، امنیت در سراسر سیستم ها و بهبود کارایی می شود زیرا بسیاری از فرآیندها می توانند خودکار شوند.

در این مقاله در مورد اسکریپت bash و نحوه ایجاد یک اسکریپت bash که می تواند برای ایجاد و مدیریت حساب های کاربران در سرورهای لینوکس استفاده شود، صحبت خواهیم کرد.

در این مقاله ما یک اسکریپت می نویسیم که یک فایل متنی حاوی نام کاربری و نام گروه کارمند را می خواند، که در آن هر خط به عنوان “user;groups” قالب بندی می شود.

این اسکریپت کاربران و گروه‌هایی را همانطور که مشخص شده است ایجاد می‌کند، دایرکتوری‌های خانگی را با مجوزها و مالکیت مناسب راه‌اندازی می‌کند، رمزهای عبور تصادفی برای کاربران ایجاد می‌کند و همه اقدامات را ثبت می‌کند. var/log/user_management.log

علاوه بر این، رمزهای عبور ایجاد شده را به صورت ایمن در آن ذخیره می کند /var/secure/user_passwords.txt.
ما از رسیدگی به خطا برای سناریوهایی مانند کاربران موجود توسط اسکریپت اطمینان حاصل خواهیم کرد.

  • هر کاربر یک گروه شخصی با نام گروه مشابه با نام کاربری خواهد داشت، این نام گروه در فایل متنی نوشته نخواهد شد.

  • یک کاربر می تواند چندین گروه داشته باشد که هر گروه با کاما “,”

  • نام های کاربری و گروه های کاربری با نقطه ویرگول “;” از هم جدا می شوند.
    مثلا؛

  1. سبک؛ sudo,dev,www-data
  2. ایدیما; من عرق می کنم
  3. مایووا توسعه دهنده، 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

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

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

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

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