Appearance
用户类型
- 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
:存储组密码及管理员信息
source
和bash
的区别
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}'