操作示例:
# 检查单个容器
$ ./check_docker_permissions.sh
# 检查多个容器
$ ./check_docker_permissions.sh 1,3,nginx
# 检查所有容器
$ ./check_docker_permissions.sh all
脚本内容:
#!/bin/bash
# 彩色输出定义
RED='\033[31m'; GREEN='\033[32m'; YELLOW='\033[33m'; BLUE='\033[34m'; RESET='\033[0m'
LOG_DIR="/var/log/docker_check"
LOG_FILE="${LOG_DIR}/check_$(date +%Y%m%d%H%M%S).log"
# 初始化日志目录
mkdir -p "$LOG_DIR" && touch "$LOG_FILE"
# 交互式容器选择(支持多选)
select_containers() {
echo -e "${BLUE}正在运行的容器列表:${RESET}" | tee -a "$LOG_FILE"
mapfile -t containers < <(docker ps --format '{{.ID}}\t{{.Names}}')
# 显示带序号的容器列表
printf "%4s %-15s %s\n" "序号" "容器ID" "容器名称" | tee -a "$LOG_FILE"
for i in "${!containers[@]}"; do
IFS=$'\t' read -r id name <<< "${containers[$i]}"
printf "%4d) %-15s %s\n" $((i+1)) "$id" "$name" | tee -a "$LOG_FILE"
done
# 处理输入参数
if [[ "$1" == "all" ]]; then
selected=("${containers[@]}")
else
read -p $'\n请输入序号/ID/名称(多个用逗号分隔): ' input
IFS=',' read -ra selections <<< "$input"
for sel in "${selections[@]}"; do
if [[ "$sel" =~ ^[0-9]+$ ]]; then
index=$((sel-1))
[[ -n "${containers[$index]}" ]] && selected+=("${containers[$index]}")
else
matched=$(docker ps -q --filter="id=$sel" --filter="name=$sel")
[[ -n "$matched" ]] && selected+=("$matched")
fi
done
fi
# 去重处理
seen=()
for container in "${selected[@]}"; do
if [[ ! " ${seen[@]} " =~ " $container " ]]; then
seen+=("$container")
IFS=$'\t' read -r id name <<< "$container"
container_ids+=("$id")
fi
done
}
# 主流程
if [[ "$1" == "all" ]]; then
container_ids=($(docker ps -q))
else
select_containers "$1"
fi
for container_id in "${container_ids[@]}"; do
{
echo -e "\n${BLUE}正在检查容器:${GREEN}$(docker inspect --format '{{.Name}}' "$container_id")${RESET}" | tee -a "$LOG_FILE"
get_process_user "$container_id" | tee -a "$LOG_FILE"
check_volume_permission "$container_id" | tee -a "$LOG_FILE"
}
done
echo -e "\n检测日志已保存至:${YELLOW}$LOG_FILE${RESET}"
输出效果:
正在运行的容器列表:
序号 容器ID 容器名称
1) 3bd36c961a9c nginx
2) a1b2c3d4e5f6 mysql
请输入序号/ID/名称(多个用逗号分隔): 1,nginx
正在检查容器:/nginx
[进程用户检测]
用户: root PID: 1234 命令: nginx
容器内用户: uid=0(root) gid=0(root)
[持久化目录检测]
[映射1]
├─ 宿主机路径: /opt/cloud/Web
├─ 容器内路径: /app/data
└─ 访问状态: 可写入
检测日志已保存至:/var/log/docker_check/check_202302191430.log