Skip to content

用户类型

  • root用户:超级管理员,UID=0
  • 系统用户:运行系统服务的用户,UID范围(CentOS 1-999,Ubuntu 1-999)
  • 普通用户:手动创建的用户,UID范围(CentOS 1000+,Ubuntu 1000+)

用户管理文件

  • /etc/passwd:存储用户基本信息(用户名、UID、GID、家目录等)
  • /etc/shadow:存储用户密码及密码策略(加密密码、过期时间等)

组管理文件

  • /etc/group:存储组信息(组名、GID、组成员)
  • /etc/gshadow:存储组密码及管理员信息

sourcebash的区别

  • source.:在当前Shell环境中执行脚本,变量和函数会保留。
  • bash./script.sh:启动子Shell执行脚本,变量和函数不会影响父Shell。

Shell脚本特殊参数

参数作用
$n脚本第n个参数($1$2...)
$0当前脚本文件名
$*所有参数(作为一个整体字符串)
$@所有参数(作为独立字符串)
$#参数个数
$$当前进程的PID

检测脚本语法错误

bash -n script.sh  # 只检查语法不执行

分步执行脚本

bash -x script.sh  # 打印每条命令及其参数

文件判断符号

符号作用
-d判断是否为目录
-f判断是否为普通文件
-e判断文件/目录是否存在

比较运算符

符号作用示例
-gt大于[ $a -gt $b ]
-lt小于[ $a -lt $b ]
-eq等于[ $a -eq $b ]
-ge大于等于[ $a -ge $b ]
-le小于等于[ $a -le $b ]
-ne不等于[ $a -ne $b ]

批量分发密钥脚本

shell
#!/bin/bash

ssh-keygen -t rsa -f $HOME/.ssh/id_rsa -P "" -C "批量主机免密登录"
while read -r line; do
  IP=$(echo $line | awk '{print $1}')
  USER=$(echo $line | awk '{print $2}')
  PWD=$(echo $line | awk '{print $3}')
  if ! ping -c 2 "$IP";then
      echo "$IP 不可达"
      continue
  fi
  sshpass -p "$PWD" ssh-copy-id -i $HOME/.ssh/id_rsa.pub -o StrickHostKeyChecking=no "$USER"@"$IP"
done < ip.txt

数据实时备份脚本

shell
#!/bin/bash

inotifywait -mrq --format '%w%f' -e create,move /data --excludi '\.(swp|swx|bak)' | while read -r line; do
	rsync -avz /data root@192.168.1.10::data --password-file=/etc/rsyncd.passwd
done

批量创建用户

shell
#!/bin/bash

if [[ $EUID -ne 0 ]]; then
   echo "错误:此脚本必须以 root 身份运行" 
   exit 1
fi

read -rp "请输入用户名前缀:" PIX
read -rp "请输入账号数:" NUMBER

if ! [[ "$NUMBER" =~ ^[0-9]+$ ]]; then
    echo "错误:账号数必须是正整数"
    exit 1
fi

for ((i=1; i<=NUMBER; i++)); do
    user="$PIX$i"
    if id "$user" &>/dev/null; then
        echo "用户 $user 已存在,跳过"
        continue
    fi
    PWD=$(tr -dc A-Za-z0-9 < /dev/urandom | head -c 8)
    useradd "$user" || { echo "创建用户 $user 失败"; continue; }
    echo "$user:$PWD" | chpasswd || { echo "设置密码失败"; continue; }
    echo "$user:$PWD" >> userlist.txt
    echo "已创建用户 $user"
done

获取CPU使用率

shell
#!/bin/bash
vmstat 1 3 | tail -1 | awk '{print $13+$14}'

查看内存脚本

shell
#!/bin/bash
free -h | grep "Mem" | awk '{print "Free Memory: " $4}'

检测硬盘使用情况

shell
#!/bin/bash
df -h | grep -v "tmpfs" | awk '{print $1 " Usage: " $5}'