Skip to content

Tạo user và grant root permission trên linux

ShellScript này tạo một người dùng mới và thêm vào nhóm 'wheel'. Với khả năng nhập thông tin từ bàn phím như tên người dùng, mật khẩu và publickey, đơn giản hóa quá trình quản lý người dùng trên hệ thống Linux.

Full code

adduser.sh
# =========================================
# Date      : 2023-09-29 17:13:59
# Author    : Son Nguyen-Hong ([email protected])
# Link      : sonnh.net
# File      : adduser.sh
# =========================================

#!/bin/bash

USER='sonnh11' # Input your username here
PASSWD=''      # Input your password. If not, use random password
PUBLIC_KEY=$(<public_key)

# Colors
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
PLAIN='\033[0m'
PACKAGE_COMMAND=''
SECRET_FILE='secret.txt'

# check root
if [ $(/usr/bin/id -u) -ne 0 ]; then
    printf "${RED}Error: This script must be running as root${PLAIN}\n"
    exit 1
fi

OS_check() {
    if [ -f /etc/os-release ]; then
        . /etc/os-release
        case $NAME in
        "Ubuntu")
            OS_FAMILY=1 #define a variable for OS family
            PACKAGE_COMMAND="apt-get"
            ;;
        "CentOS Linux" | "Red Hat Enterprise Linux" | "Amazon Linux")
            OS_FAMILY=2
            PACKAGE_COMMAND="yum"
            ;;
        *)
            printf "${YELLOW}Error: OS not supported${PLAIN} \n"
            exit 1
            ;;
        esac
    else
        printf "${RED}Error:  Cannot check OS information${PLAIN}\n"
        exit 1
    fi

    if [ ! -e '/usr/bin/openssl' ]; then
        $PACKAGE_COMMAND -y install openssl
    fi

    # install ssh
    if [ ! -e '/usr/bin/ssh' ]; then
        $PACKAGE_COMMAND -y install openssh-server openssh-clients >/dev/null 2>&1 
        systemctl start sshd >/dev/null 2>&1 
        systemctl enable sshd >/dev/null 2>&1
    fi
}

generate_secret() {
    echo "adduser.sh help?
    ${GREEN}sudo ./adduser.sh username public_key password
    ${PLAIN}or if you fill username in scirpt and provide public key in file template
    ${GREEN} sudo ./adduser.sh ${PLAIN}
    "
    if [ -z "$1" ] && [ -z "$2" ] && [ -z "$3" ]; then
        USER=$1
        PUBLIC_KEY=$2
        PASSWD=$3
    elif [ -z "$USER" ]; then
        echo "${RED}Error: You not yet provide username${PLAIN}"
        shift 63
    fi

    if [ -z "$PASSWD" ]; then
        echo "${YELLOW}Warning: You use auto generate password${PLAIN}"
        PASSWD="$(
            echo $RANDOM | md5sum | head -c 20
            echo
        )"
        echo "Your password is:" "$PASSWD" >> $SECRET_FILE
    fi

    if [ -z "$PUBLIC_KEY" ]; then
        echo "${YELLOW}Warning: You use auto generate public key${PLAIN}"
        ssh-keygen -q -t rsa -N '' -f ~/secret <<<y >/dev/null 2>&1
        PUBLIC_KEY=$(cat ~/secret.pub)
        echo "Your secret key is below.\n" "$($cat ~/secret)" >> $SECRET_FILE
    fi
    rm -rf ~/secret secret.txt

}

addnewUser() {
    if [ ! -d "/home/$USER" ]; then
        if [[ $OS_FAMILY -eq 1 ]]; then #ubuntu
            adduser --disabled-password --gecos "" $USER
            echo $USER:$PASSWD | chpasswd
        else #centos and ret hat
            adduser -p $(openssl passwd -1 $PASSWD) $USER
        fi
    else
        printf "${RED}Error: ${PLAIN} Add user fail!\n"
    fi

    echo "$USER  ALL=(ALL) NOPASSWD:ALL" | sudo tee "/etc/sudoers.d/$USER"
    usermod -aG wheel "$USER"

    mkdir /home/$USER/.ssh
    chmod 700 /home/$USER/.ssh
    chown $USER:$USER /home/$USER/.ssh
    echo "$PUBLIC_KEY" >/home/$USER/.ssh/authorized_keys
    chmod 700 /home/$USER/.ssh/authorized_keys
    chown $USER:$USER /home/$USER/.ssh/authorized_keys

}

main() {
    OS_check
    generate_secret
    addnewUser

}

main

Explanation

Variable

  • USER: Biến chứa tên người dùng, mặc định là 'sonnh11'.

  • PASSWD: Biến chứa mật khẩu, cho phép nhập từ bàn phím hoặc nhúng vào code. Nếu không, tự tạo một chuỗi mật khẩu ngẫy nhiên

  • PUBLIC_KEY: Biến chứa public key, được đọc từ tệp public_key. Có thể nhập từ bàn phím để ghi đè nội dung trong file. Nếu cả nội dung trong file và nhập từ bàn phím đều trống, tự generate một public key

Màu Sắc:

  • RED, GREEN, YELLOW, PLAIN: Biến chứa mã màu để làm cho in ra màn hình dễ đọc.

Các Bước Kiểm Tra:

  • Kiểm tra xem script được chạy với quyền root không.

  • Kiểm tra hệ điều hành để xác định gia đình hệ điều hành (Ubuntu hoặc CentOS/RHEL) và thiết lập các biến liên quan.

  • Kiểm Tra và Cài Đặt Gói:

    • Kiểm tra xem openssl đã được cài đặt hay chưa. Nếu không, cài đặt nó.
    • Kiểm tra xem ssh đã được cài đặt hay chưa. Nếu không, cài đặt và khởi động dịch vụ SSH.

Các hàm sử dụng

Hàm generate_secret:

  • Hướng dẫn sử dụng script và các tham số cần truyền.

  • Nếu các tham số không được cung cấp, sử dụng giá trị mặc định và tạo ra mật khẩu và public key nếu chúng không được cung cấp.

Hàm addnewUser:

  • Tạo người dùng mới nếu thư mục người dùng không tồn tại.

  • Thêm người dùng vào nhóm wheel và cấp quyền sudo.

  • Tạo thư mục .ssh và đặt quyền truy cập public key.

Hàm main:

  • Gọi các hàm theo thứ tự để thực hiện các bước chính của chương trình.

Lưu ý:

  • Script kiểm tra quyền root để đảm bảo an toàn khi thực hiện các thay đổi hệ thống quan trọng.

  • Tương tác với người dùng để nhập thông tin cần thiết, như mật khẩu và khóa công khai.

  • Sử dụng biến màu sắc để cải thiện trải nghiệm người dùng khi hiển thị thông điệp.