برنامه نویسی

خودکارسازی ایجاد کاربر لینوکس با اسکریپت Bash

Summarize this content to 400 words in Persian Lang

یک اسکریپت کاربردی برای مهندسین SysOps

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

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

پيش نياز:

محیط پوسته Bash.
ویرایشگر متن برای ویرایش اسکریپت و تهیه فایل ورودی.

بیایید نگاهی به اسکریپت خود بیندازیم که بعداً برای انجام این کار از آن استفاده خواهیم کرد و با توضیح دقیق هر بخش آن را تجزیه می کنیم:

#!/bin/bash

# Check if the script is run as root
if [[ “$(id -u)” -ne 0 ]]; then
echo “You must run the script as root” >&2
exit 1
fi

# Check if a filename is provided
if [[ -z “$1” ]]; then
echo “Usage: $0 ” >&2
exit 1
fi

# File paths
LOG_FILE=”/var/log/user_management.log”
PASSWORD_FILE=”/var/secure/user_passwords.csv”

# Ensure /var/secure storage for passwords
mkdir -p /var/secure
touch $PASSWORD_FILE
chown root:root /var/secure
chmod 700 /var/secure
chmod 600 $PASSWORD_FILE

# Function to log actions
log_action() {
echo “$(date ‘+%Y-%m-%d %H:%M:%S’) – $1” | tee -a $LOG_FILE
}

# Function to generate a random password
generate_password() {
tr -dc ‘A-Za-z0-9!@#$%^&*()_+=-[]{}|;:,.?/~’ /urandom | head -c 16
}

# Function to hash passwords
hash_password() {
echo “$1″ | openssl passwd -6 -stdin
}

# Read the input file line by line
while IFS=”;” read -r username groups; do
# Trim whitespace
username=$(echo “$username” | xargs)
groups=$(echo “$groups” | xargs)

# Skip empty lines
if [[ -z “$username” ]]; then
continue
fi

# Check if user already exists
if id “$username” &>/dev/null; then
log_action “User $username already exists!”
continue
fi

# Create personal group
if groupadd “$username”; then
log_action “Group $username created successfully.”
else
log_action “Failed to create group $username.”
continue
fi

# Create user with a home directory and personal group
if useradd -m -s /bin/bash -g “$username” “$username”; then
log_action “User $username created successfully.”
else
log_action “Failed to create user $username.”
continue
fi

# Create groups and add user to them
IFS=’,’ read -ra group_array “$groups”
for group in “${group_array[@]}”; do
group=$(echo “$group” | xargs)
if ! getent group “$group” >/dev/null 2>&1; then
if groupadd “$group”; then
log_action “Group $group created.”
else
log_action “Failed to create group $group.”
continue
fi
fi
if usermod -aG “$group” “$username”; then
log_action “User $username added to group $group.”
else
log_action “Failed to add user $username to group $group.”
fi
done

# Generate random password
password=$(generate_password)
hashed_password=$(hash_password “$password”)
if usermod –password “$hashed_password” “$username”; then
echo “$username,$password” >> $PASSWORD_FILE
log_action “Password set for user $username.”
else
log_action “Failed to set password for user $username.”
fi

# Set home directory permissions
if mkdir -p “/home/$username” && chown -R “$username:$username” “/home/$username” && chmod 755 “/home/$username”; then
log_action “Home directory permissions set for user $username.”
else
log_action “Failed to set home directory permissions for user $username.”
fi

done “$1”

log_action “User creation process completed. Check $LOG_FILE for details.”

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

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

شکستن اسکریپت

1. امتیازات ریشه را بررسی کنید

if [[ “$(id -u)” -ne 0 ]]; then
echo “You must run the script as root” >&2
exit 1
fi

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

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

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

2. Argument نام فایل را بررسی کنید

if [[ -z “$1” ]]; then
echo “Usage: $0 ” >&2
exit 1
fi

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

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

این بخش بررسی می کند که آیا کاربر هنگام اجرای اسکریپت یک نام فایل را به عنوان آرگومان ارائه کرده است. اگر نام فایلی پیدا نشد، پیام استفاده را چاپ می کند و خارج می شود.

3. مسیرهای فایل را تعریف کنید

LOG_FILE=”/var/log/user_management.log”
PASSWORD_FILE=”/var/secure/user_passwords.csv”

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

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

این خطوط مسیرهای فایل را برای ثبت اقدامات و ذخیره رمزهای عبور تعریف می کنند.

4. از ذخیره سازی ایمن برای رمزهای عبور اطمینان حاصل کنید

mkdir -p /var/secure
touch $PASSWORD_FILE
chown root:root /var/secure
chmod 700 /var/secure
chmod 600 $PASSWORD_FILE

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

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

این بخش از اسکریپت تضمین می کند که /var/secure دایرکتوری و فایل رمز عبور با مجوزهای مناسب برای ذخیره سازی امن وجود دارد. mkdir -p دایرکتوری را در صورتی که وجود نداشته باشد ایجاد می کند، touch فایل رمز عبور را ایجاد می کند و chmod و chown مجوزها را طوری تنظیم کنید که فقط کاربر اصلی بتواند روی آن بخواند و بنویسد.

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

log_action() {
echo “$(date ‘+%Y-%m-%d %H:%M:%S’) – $1” | tee -a $LOG_FILE
}

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

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

این log_action وظیفه تابع این است که پیام‌هایی را با مهر زمانی در فایل گزارش ثبت کند. از آن استفاده می کند date دستور اضافه کردن یک مهر زمانی به هر ورودی گزارش و tee برای الحاق پیام به فایل log.

6. تابع تولید رمز عبور

generate_password() {
tr -dc ‘A-Za-z0-9!@#$%^&*()_+=-[]{}|;:,.?/~’ /urandom | head -c 16
}

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

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

این generate_password تابع یک رمز عبور تصادفی تولید می کند. tr برای فیلتر کردن کاراکترها استفاده می شود /dev/urandom (یک مولد اعداد تصادفی)، و head -c 16 اطمینان حاصل می کند که رمز عبور 16 کاراکتر است.

7. رمز عبور تابع هش

hash_password() {
echo “$1″ | openssl passwd -6 -stdin
}

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

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

این hash_password تابع رمز عبور تولید شده را با استفاده از هش می کند openssl دستور با رمزگذاری SHA-512. این باعث می شود رمز عبور قبل از ذخیره آن ایمن شود.

8. خواندن و پردازش فایل ورودی

while IFS=”;” read -r username groups; do
# Trim whitespace
username=$(echo “$username” | xargs)
groups=$(echo “$groups” | xargs)

# Skip empty lines
if [[ -z “$username” ]]; then
continue
fi

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

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

این قسمت فایل ورودی را خط به خط می خواند و نام کاربری و گروه ها را با نقطه ویرگول از هم جدا می کند (;). همچنین فضای خالی اطراف نام کاربری و گروه‌ها را کاهش می‌دهد و از هر خط خالی می‌گذرد.

9. کاربر موجود را بررسی کنید

if id “$username” &>/dev/null; then
log_action “User $username already exists!”
continue
fi

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

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

این بررسی می کند که آیا کاربر از قبل وجود دارد یا خیر. در این صورت، اقدام را ثبت می‌کند و به کاربر بعدی می‌رود.

10. ایجاد گروه شخصی

if groupadd “$username”; then
log_action “Group $username created successfully.”
else
log_action “Failed to create group $username.”
continue
fi

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

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

این یک گروه شخصی با نام کاربری مشابه ایجاد می کند.

11. ایجاد کاربر

if useradd -m -s /bin/bash -g “$username” “$username”; then
log_action “User $username created successfully.”
else
log_action “Failed to create user $username.”
continue
fi

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

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

این کاربر را با یک فهرست اصلی ایجاد می کند و گروه شخصی را به عنوان گروه اصلی اختصاص می دهد.

12. ایجاد و اختصاص گروه ها

Copy code
IFS=’,’ read -ra group_array “$groups”
for group in “${group_array[@]}”; do
group=$(echo

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

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

چگونه از اسکریپت استفاده کنیم؟

اسکریپت را به عنوان create_users.sh در فهرست دلخواه خود ذخیره کنید.
یک فایل متنی (users_and_groups.txt) با یک نام کاربری در هر خط و به دنبال آن گروه هایی که با کاما از هم جدا شده اند، آماده کنید. به عنوان مثال: light;sudo,dev,www-data idimma;sudo mayowa;dev,www-data
اسکریپت را با chmod +x create_users.sh قابل اجرا کنید.
اسکریپت را با مسیر فایل متنی خود به عنوان آرگومان اجرا کنید: ./create_users.sh users_and_groups.txt.

نتیجه

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

تصدیق

این اسکریپت به عنوان بخشی از مسیر HNG Internship DevOps توسعه داده شده است. برای جزئیات بیشتر در مورد این برنامه، به وب سایت کارآموزی HNG مراجعه کنید.

در اینجا و اینجا می توانید درباره برنامه کارآموزی HNG بیشتر بدانید.

ممنون که خواندید.

یک اسکریپت کاربردی برای مهندسین SysOps

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

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

پيش نياز:

  • محیط پوسته Bash.
  • ویرایشگر متن برای ویرایش اسکریپت و تهیه فایل ورودی.

بیایید نگاهی به اسکریپت خود بیندازیم که بعداً برای انجام این کار از آن استفاده خواهیم کرد و با توضیح دقیق هر بخش آن را تجزیه می کنیم:

#!/bin/bash

# Check if the script is run as root
if [[ "$(id -u)" -ne 0 ]]; then
    echo "You must run the script as root" >&2
    exit 1
fi

# Check if a filename is provided
if [[ -z "$1" ]]; then
    echo "Usage: $0 " >&2
    exit 1
fi

# File paths
LOG_FILE="/var/log/user_management.log"
PASSWORD_FILE="/var/secure/user_passwords.csv"

# Ensure /var/secure storage for passwords
mkdir -p /var/secure
touch $PASSWORD_FILE
chown root:root /var/secure
chmod 700 /var/secure
chmod 600 $PASSWORD_FILE

# Function to log actions
log_action() {
    echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" | tee -a $LOG_FILE
}

# Function to generate a random password
generate_password() {
    tr -dc 'A-Za-z0-9!@#$%^&*()_+=-[]{}|;:,.?/~' /urandom | head -c 16
}

# Function to hash passwords
hash_password() {
    echo "$1" | openssl passwd -6 -stdin
}

# Read the input file line by line
while IFS=";" read -r username groups; do
    # Trim whitespace
    username=$(echo "$username" | xargs)
    groups=$(echo "$groups" | xargs)

    # Skip empty lines
    if [[ -z "$username" ]]; then
        continue
    fi

    # Check if user already exists
    if id "$username" &>/dev/null; then
        log_action "User $username already exists!"
        continue
    fi

    # Create personal group
    if groupadd "$username"; then
        log_action "Group $username created successfully."
    else
        log_action "Failed to create group $username."
        continue
    fi

    # Create user with a home directory and personal group
    if useradd -m -s /bin/bash -g "$username" "$username"; then
        log_action "User $username created successfully."
    else
        log_action "Failed to create user $username."
        continue
    fi

    # Create groups and add user to them
    IFS=',' read -ra group_array  "$groups"
    for group in "${group_array[@]}"; do
        group=$(echo "$group" | xargs)
        if ! getent group "$group" >/dev/null 2>&1; then
            if groupadd "$group"; then
                log_action "Group $group created."
            else
                log_action "Failed to create group $group."
                continue
            fi
        fi
        if usermod -aG "$group" "$username"; then
            log_action "User $username added to group $group."
        else
            log_action "Failed to add user $username to group $group."
        fi
    done

    # Generate random password
    password=$(generate_password)
    hashed_password=$(hash_password "$password")
    if usermod --password "$hashed_password" "$username"; then
        echo "$username,$password" >> $PASSWORD_FILE
        log_action "Password set for user $username."
    else
        log_action "Failed to set password for user $username."
    fi

    # Set home directory permissions
    if mkdir -p "/home/$username" && chown -R "$username:$username" "/home/$username" && chmod 755 "/home/$username"; then
        log_action "Home directory permissions set for user $username."
    else
        log_action "Failed to set home directory permissions for user $username."
    fi

done "$1"

log_action "User creation process completed. Check $LOG_FILE for details."
وارد حالت تمام صفحه شوید

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

شکستن اسکریپت

1. امتیازات ریشه را بررسی کنید

if [[ "$(id -u)" -ne 0 ]]; then
    echo "You must run the script as root" >&2
    exit 1
fi
وارد حالت تمام صفحه شوید

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

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

2. Argument نام فایل را بررسی کنید

if [[ -z "$1" ]]; then
    echo "Usage: $0 " >&2
    exit 1
fi
وارد حالت تمام صفحه شوید

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

این بخش بررسی می کند که آیا کاربر هنگام اجرای اسکریپت یک نام فایل را به عنوان آرگومان ارائه کرده است. اگر نام فایلی پیدا نشد، پیام استفاده را چاپ می کند و خارج می شود.

3. مسیرهای فایل را تعریف کنید

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

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

این خطوط مسیرهای فایل را برای ثبت اقدامات و ذخیره رمزهای عبور تعریف می کنند.

4. از ذخیره سازی ایمن برای رمزهای عبور اطمینان حاصل کنید

mkdir -p /var/secure
touch $PASSWORD_FILE
chown root:root /var/secure
chmod 700 /var/secure
chmod 600 $PASSWORD_FILE
وارد حالت تمام صفحه شوید

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

این بخش از اسکریپت تضمین می کند که /var/secure دایرکتوری و فایل رمز عبور با مجوزهای مناسب برای ذخیره سازی امن وجود دارد. mkdir -p دایرکتوری را در صورتی که وجود نداشته باشد ایجاد می کند، touch فایل رمز عبور را ایجاد می کند و chmod و chown مجوزها را طوری تنظیم کنید که فقط کاربر اصلی بتواند روی آن بخواند و بنویسد.

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

log_action() {
    echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" | tee -a $LOG_FILE
}
وارد حالت تمام صفحه شوید

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

این log_action وظیفه تابع این است که پیام‌هایی را با مهر زمانی در فایل گزارش ثبت کند. از آن استفاده می کند date دستور اضافه کردن یک مهر زمانی به هر ورودی گزارش و tee برای الحاق پیام به فایل log.

6. تابع تولید رمز عبور

generate_password() {
    tr -dc 'A-Za-z0-9!@#$%^&*()_+=-[]{}|;:,.?/~' /urandom | head -c 16
}
وارد حالت تمام صفحه شوید

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

این generate_password تابع یک رمز عبور تصادفی تولید می کند. tr برای فیلتر کردن کاراکترها استفاده می شود /dev/urandom (یک مولد اعداد تصادفی)، و head -c 16 اطمینان حاصل می کند که رمز عبور 16 کاراکتر است.

7. رمز عبور تابع هش

hash_password() {
    echo "$1" | openssl passwd -6 -stdin
}
وارد حالت تمام صفحه شوید

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

این hash_password تابع رمز عبور تولید شده را با استفاده از هش می کند openssl دستور با رمزگذاری SHA-512. این باعث می شود رمز عبور قبل از ذخیره آن ایمن شود.

8. خواندن و پردازش فایل ورودی

while IFS=";" read -r username groups; do
    # Trim whitespace
    username=$(echo "$username" | xargs)
    groups=$(echo "$groups" | xargs)

    # Skip empty lines
    if [[ -z "$username" ]]; then
        continue
    fi
وارد حالت تمام صفحه شوید

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

این قسمت فایل ورودی را خط به خط می خواند و نام کاربری و گروه ها را با نقطه ویرگول از هم جدا می کند (;). همچنین فضای خالی اطراف نام کاربری و گروه‌ها را کاهش می‌دهد و از هر خط خالی می‌گذرد.

9. کاربر موجود را بررسی کنید

if id "$username" &>/dev/null; then
    log_action "User $username already exists!"
    continue
fi
وارد حالت تمام صفحه شوید

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

این بررسی می کند که آیا کاربر از قبل وجود دارد یا خیر. در این صورت، اقدام را ثبت می‌کند و به کاربر بعدی می‌رود.

10. ایجاد گروه شخصی

if groupadd "$username"; then
    log_action "Group $username created successfully."
else
    log_action "Failed to create group $username."
    continue
fi
وارد حالت تمام صفحه شوید

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

این یک گروه شخصی با نام کاربری مشابه ایجاد می کند.

11. ایجاد کاربر

if useradd -m -s /bin/bash -g "$username" "$username"; then
    log_action "User $username created successfully."
else
    log_action "Failed to create user $username."
    continue
fi
وارد حالت تمام صفحه شوید

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

این کاربر را با یک فهرست اصلی ایجاد می کند و گروه شخصی را به عنوان گروه اصلی اختصاص می دهد.

12. ایجاد و اختصاص گروه ها

Copy code
IFS=',' read -ra group_array  "$groups"
for group in "${group_array[@]}"; do
    group=$(echo
وارد حالت تمام صفحه شوید

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

چگونه از اسکریپت استفاده کنیم؟

  1. اسکریپت را به عنوان create_users.sh در فهرست دلخواه خود ذخیره کنید.

  2. یک فایل متنی (users_and_groups.txt) با یک نام کاربری در هر خط و به دنبال آن گروه هایی که با کاما از هم جدا شده اند، آماده کنید. به عنوان مثال: light;sudo,dev,www-data idimma;sudo mayowa;dev,www-data

  3. اسکریپت را با chmod +x create_users.sh قابل اجرا کنید.

  4. اسکریپت را با مسیر فایل متنی خود به عنوان آرگومان اجرا کنید: ./create_users.sh users_and_groups.txt.

نتیجه

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

تصدیق

این اسکریپت به عنوان بخشی از مسیر HNG Internship DevOps توسعه داده شده است. برای جزئیات بیشتر در مورد این برنامه، به وب سایت کارآموزی HNG مراجعه کنید.

در اینجا و اینجا می توانید درباره برنامه کارآموزی HNG بیشتر بدانید.

ممنون که خواندید.

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

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

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

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