使用自定義Shell腳本快速配置Linux用戶賬戶
在學校實驗室管理Linux服務器,或者公司小團隊管理服務器時,大家需要一個能隔離自己服務,但是自己又需要對服務器的完整權限的情形。創建和配置用戶賬戶是一項常見但繁瑣的任務。特別是當你需要頻繁為新團隊成員設置賬戶,或在多臺服務器上保持一致的用戶配置時,linux本身用戶指令已經很完善,手動添加也方便,但是我偶爾碰到這種添加用戶的需求,還是感覺繁瑣和麻煩,所以還是想寫個腳本快速創建用戶,分配root,docker權限。
今天,我要分享一個名為hello
的自定義腳本,希望它能幫助你一鍵完成用戶創建、權限設置、Docker組管理等操作,簡化你系統管理的工作。
腳本功能概述
hello
腳本提供以下功能:
- 創建新用戶并設置密碼
- 配置sudo權限(無需密碼)
- 自動添加用戶到Docker組(如果存在)
- 創建友好的
.bashrc
配置和系統信息顯示 - 生成包含賬戶信息的README文件
- 檢測Docker服務狀態并提供相關提示
安裝和使用方法
步驟1:創建腳本文件
首先,使用你喜歡的文本編輯器創建腳本文件:
sudo vim /usr/local/bin/hello
步驟2:粘貼以下代碼
將下面的代碼復制到編輯器中:
#!/bin/bash# 獲取腳本的基本名稱,而不是完整路徑
SCRIPT_NAME=$(basename "$0")if [ $# -ne 1 ]; thenecho "用法: $SCRIPT_NAME 用戶名" # 使用基本名稱而不是完整路徑echo "例如: $SCRIPT_NAME ck" # 使用基本名稱而不是完整路徑exit 1
fiUSERNAME=$1# 檢查是否以root權限運行
if [ "$(id -u)" -ne 0 ]; thenecho "錯誤: 請使用root權限運行此腳本"exit 2
fi# 檢查docker服務是否安裝和運行
if ! command -v docker &> /dev/null; thenecho "警告: Docker未安裝"docker_installed=false
elif ! systemctl is-active --quiet docker 2>/dev/null; thenecho "警告: Docker服務未運行"docker_installed=truedocker_running=false
elseecho "確認: Docker服務正在運行"docker_installed=truedocker_running=true
fi# 檢查用戶是否已存在
if id "$USERNAME" &>/dev/null; thenecho "用戶 $USERNAME 已存在,將更新配置..."user_existed=true
elseecho "創建新用戶 $USERNAME..."useradd -m -s /bin/bash $USERNAME# 設置密碼為單個空格echo -e " \n " | passwd $USERNAME 2>/dev/null || \{ echo " " | passwd --stdin $USERNAME 2>/dev/null; } || \{ echo "$USERNAME: " | chpasswd 2>/dev/null; } || \{ echo "警告: 無法設置空格密碼,使用用戶名作為臨時密碼"; echo "$USERNAME:$USERNAME" | chpasswd; }user_existed=false
fiUSER_HOME=$(eval echo ~$USERNAME)# 創建.bashrc或添加自定義配置(保留有用的shell配置)
if [ "$user_existed" = false ] || [ ! -f "$USER_HOME/.bashrc" ]; then# 如果是新用戶或沒有.bashrc,創建一個新的cp /etc/skel/.bashrc "$USER_HOME/.bashrc"
fi# 添加一些有用的別名和環境變量到.bashrc
if ! grep -q "# User custom aliases and functions" "$USER_HOME/.bashrc"; thencat >> "$USER_HOME/.bashrc" << 'EOF'# User custom aliases and functions
alias ll='ls -la'
alias la='ls -A'
alias l='ls -CF'
alias ..='cd ..'
alias ...='cd ../..'# 顯示系統信息
if [ "$TERM" != "dumb" ]; thenecho "歡迎, $(whoami)@$(hostname)"dateecho ""echo "系統負載: $(cat /proc/loadavg)"echo "內存使用: $(free -h | grep Mem | awk '{print $3 " / " $2}')"echo "磁盤使用: $(df -h / | grep / | awk '{print $3 " / " $2 " (" $5 ")"}')"echo ""
fi
EOF
fi# 創建簡單的README文件
cat > "$USER_HOME/README.txt" << EOF
歡迎使用服務器賬戶:$USERNAME賬戶特權:
- 具有sudo權限(無需密碼)
$(if getent group docker > /dev/null && groups "$USERNAME" | grep -q "\bdocker\b"; thenecho "- 可直接使用docker命令(已加入docker組)"
fi)使用提示:
- 請根據個人習慣創建和組織目錄結構
- 請定期清理不必要的文件以節省磁盤空間如有任何問題請聯系系統管理員。
EOF# 確保所有文件屬于用戶
chown -R $USERNAME:$USERNAME "$USER_HOME"# 檢查docker組是否存在并處理
if getent group docker > /dev/null; then# 檢查用戶是否已在docker組中if groups "$USERNAME" | grep -q "\bdocker\b"; thenecho "用戶 $USERNAME 已在docker組中"elseecho "將 $USERNAME 添加到docker組..."usermod -aG docker $USERNAMEfi
elseecho "警告: docker組不存在,無法將用戶添加到docker組"if [ "$docker_installed" = true ]; thenecho "Docker已安裝但docker組不存在,這可能是配置問題"fi
fi# 確保用戶有sudo權限(無需密碼)
if [ -f "/etc/sudoers.d/$USERNAME" ]; thenecho "用戶 $USERNAME 的sudo配置已存在,確保權限正確..."
elseecho "設置 $USERNAME 的sudo權限..."
fi
echo "$USERNAME ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/$USERNAME
chmod 0440 /etc/sudoers.d/$USERNAME# 輸出操作總結
echo "----------------------------------------"
echo "操作完成!"
if [ "$user_existed" = true ]; thenecho "- 已更新用戶 $USERNAME 的配置"
elseecho "- 已創建用戶 $USERNAME (密碼為空格)"
fi
echo "- 已設置自定義.bashrc配置"
echo "- 已確保sudo權限(無需密碼)"# docker相關狀態
if getent group docker > /dev/null; thenif groups "$USERNAME" | grep -q "\bdocker\b"; thenecho "- 已確保用戶在docker組中"fi
elseecho "- 未添加到docker組(組不存在)"
fi# 輸出docker狀態總結
echo "----------------------------------------"
echo "Docker狀態:"
if [ "$docker_installed" = false ]; thenecho "- Docker未安裝,如需使用,請先安裝Docker:"echo " sudo apt update && sudo apt install docker.io -y"echo " 或參考Docker官方安裝指南"
elif [ "$docker_running" = false ]; thenecho "- Docker已安裝但未運行,可使用以下命令啟動:"echo " sudo systemctl start docker"echo " sudo systemctl enable docker # 設置開機自啟"
elseecho "- Docker服務正常運行中"
fi# 如果用戶已創建但docker組不存在,提供重新運行的提示
if [ "$user_existed" = true ] && ! getent group docker > /dev/null && [ "$docker_installed" = true ]; thenecho "----------------------------------------"echo "提示: 安裝Docker后,請重新運行此腳本將用戶 $USERNAME 添加到docker組"
fiecho "----------------------------------------"
echo "用戶 $USERNAME 的主目錄: $USER_HOME"
echo "可通過以下命令登錄用戶: su - $USERNAME"
步驟3:設置執行權限
保存文件后,為腳本添加執行權限:
sudo chmod 775 /usr/local/bin/hello # 讓同組用戶也可直接執行,編輯
### 使用方法現在,你可以通過簡單的命令創建或更新用戶:```bash
sudo hello username
例如,創建名為"baijs"的用戶:
sudo hello baijs
腳本代碼部分注釋
1. 用戶創建和密碼設置
腳本首先檢查用戶是否已存在,如果不存在,則創建用戶并設置密碼。為了便于新用戶第一次登錄,腳本嘗試設置一個簡單的密碼(空格字符):
# 設置密碼為單個空格
echo -e " \n " | passwd $USERNAME 2>/dev/null || \
{ echo " " | passwd --stdin $USERNAME 2>/dev/null; } || \
{ echo "$USERNAME: " | chpasswd 2>/dev/null; } || \
{ echo "警告: 無法設置空格密碼,使用用戶名作為臨時密碼"; echo "$USERNAME:$USERNAME" | chpasswd; }
這段代碼嘗試多種方法設置空格密碼,確保在不同的Linux發行版上都能正常工作。如果所有方法都失敗,將回退到使用用戶名作為密碼。
2. 自定義Shell環境
腳本為新用戶配置了一個友好的Shell環境:
- 實用的別名(
ll
,la
,..
, 等) - 登錄時顯示系統狀態信息
- 定制的
.bashrc
配置
當用戶登錄時,他們會看到類似這樣的信息:
歡迎, username@hostname
Wed Mar 26 15:30:45 CST 2025系統負載: 0.15 0.05 0.01 1/292 3021
內存使用: 1.2G / 8.0G
磁盤使用: 12G / 50G (25%)
3. 權限和組管理
腳本自動處理以下權限相關配置:
- 配置sudo權限(無需密碼)
- 檢測并添加用戶到Docker組(如果存在)
- 確保所有主目錄文件的所有權正確
4. 便捷的用戶文檔
腳本在用戶主目錄創建README.txt文件,包含使用指南和賬戶特權信息,這里可以修改成你實驗室的一些須知信息或者其他:
歡迎使用服務器賬戶:username賬戶特權:
- 具有sudo權限(無需密碼)
- 可直接使用docker命令(已加入docker組)使用提示:
- 請根據個人習慣創建和組織目錄結構
- 請定期清理不必要的文件以節省磁盤空間如有任何問題請聯系系統管理員。
自定義腳本
你可以根據自己的需求修改腳本。以下是一些常見的自定義點:
調整安全設置
如果你需要更嚴格的安全策略,可以修改sudo權限部分:
# 限制sudo權限到特定命令
echo "$USERNAME ALL=(ALL) NOPASSWD: /usr/bin/docker, /usr/bin/apt" > /etc/sudoers.d/$USERNAME
常見問題排查
如果腳本執行遇到問題,請檢查以下幾點:
腳本找不到或無法執行
遇到"command not found"或"Permission denied"錯誤時:
# 檢查腳本權限
ls -la /usr/local/bin/hello# 修復權限
sudo chmod +x /usr/local/bin/hello# 確保腳本在PATH中
sudo ln -sf /usr/local/bin/hello /usr/bin/hello