Adguard Home 按照脚本
#!/bin/bash

# 获取当前时间并格式化日志
log() {
echo "$(date "+[%Y-%m-%d %H:%M:%S]") $1"
}

# 检查工具是否安装
check_tool() {
if ! command -v "$1" &> /dev/null; then
log "错误:$1 未安装,请先安装 $1。"
exit 1
fi
}

# 检查依赖工具
log "检查依赖工具..."
check_tool curl
check_tool jq
check_tool wget
check_tool tar

# 定义下载目录和程序目录
DOWNLOAD_DIR="/opt/program"
PROGRAM_DIR="$DOWNLOAD_DIR/AdGuardHome"

# 检查并创建目录
log "检查目录是否存在..."
if [ ! -d "$DOWNLOAD_DIR" ]; then
log "下载目录 $DOWNLOAD_DIR 不存在,正在创建..."
mkdir -p "$DOWNLOAD_DIR" || { log "创建目录 $DOWNLOAD_DIR 失败!"; exit 1; }
fi
if [ ! -d "$PROGRAM_DIR" ]; then
log "程序目录 $PROGRAM_DIR 不存在,正在创建..."
mkdir -p "$PROGRAM_DIR" || { log "创建目录 $PROGRAM_DIR 失败!"; exit 1; }
fi

# 获取最新版本号
log "获取 AdGuardHome 最新版本信息..."
latest_version=$(curl -s https://api.github.com/repos/AdguardTeam/AdGuardHome/releases/latest | jq -r .tag_name)
if [ -z "$latest_version" ]; then
log "无法获取最新版本信息,请检查网络或 GitHub API。"
exit 1
fi

# 获取当前版本号
if [ -x "$PROGRAM_DIR/AdGuardHome" ]; then
current_version=$("$PROGRAM_DIR/AdGuardHome" --version 2>/dev/null | grep -oP 'v\d+\.\d+\.\d+')
if [ -z "$current_version" ]; then
current_version="unknown"
fi
else
current_version="unknown"
fi

# 比较版本号
sorted_first=$(echo -e "$current_version\n$latest_version" | sort -V | head -n1)
log "当前版本: $current_version,最新版本: $latest_version"
if [ "$current_version" = "unknown" ] || { [ "$sorted_first" = "$current_version" ] && [ "$current_version" != "$latest_version" ]; }; then
log "需要安装或更新至 $latest_version..."
need_update=1
else
log "当前已是最新版本 $current_version,无需更新。"
need_update=0
fi

# 如果需要更新或安装
if [ $need_update -eq 1 ] || [ "$current_version" = "unknown" ]; then
# 获取下载 URL
download_url=$(curl -s https://api.github.com/repos/AdguardTeam/AdGuardHome/releases/latest | jq -r '.assets[] | select(.name | endswith("linux_amd64.tar.gz")) | .browser_download_url')
if [ -z "$download_url" ]; then
log "无法获取下载 URL,请检查 GitHub API。"
exit 1
fi

# 下载最新版本
log "正在从 $download_url 下载 AdGuardHome..."
wget -q -O "$DOWNLOAD_DIR/AdGuardHome_linux_amd64.tar.gz" "$download_url"
if [ $? -ne 0 ]; then
log "下载失败,请检查网络。"
rm -f "$DOWNLOAD_DIR/AdGuardHome_linux_amd64.tar.gz"
exit 1
fi
log "下载完成!"

# 解压并清理临时文件
log "解压安装包..."
if tar -zxvf "$DOWNLOAD_DIR/AdGuardHome_linux_amd64.tar.gz" -C "$DOWNLOAD_DIR" > /dev/null; then
log "解压成功,清理临时文件..."
rm -f "$DOWNLOAD_DIR/AdGuardHome_linux_amd64.tar.gz"
else
log "解压失败!"
rm -f "$DOWNLOAD_DIR/AdGuardHome_linux_amd64.tar.gz"
exit 1
fi

# 停止现有进程
if pgrep AdGuardHome > /dev/null; then
log "停止正在运行的 AdGuardHome 进程..."
pkill AdGuardHome || { log "停止进程失败!"; exit 1; }
else
log "没有正在运行的 AdGuardHome 进程。"
fi

# 删除旧服务文件
if [ -f /etc/systemd/system/AdGuardHome.service ]; then
log "删除旧的服务文件..."
rm -f /etc/systemd/system/AdGuardHome.service || { log "删除服务文件失败!"; exit 1; }
fi

# 安装服务
log "安装 AdGuardHome 服务..."
echo " "
"$PROGRAM_DIR/AdGuardHome" -s install || { log "服务安装失败!"; exit 1; }
echo " "

# 检查服务状态
if systemctl is-active --quiet AdGuardHome; then
log "AdGuardHome 已成功安装并启动!"
else
log "AdGuardHome 服务启动失败!"
exit 1
fi
else
log "无需更新,脚本退出。"
fi

log "脚本执行完毕。"

配置校验脚本
#!/bin/bash

# 定义常量
SSHD_CONFIG="/etc/ssh/sshd_config"
BACKUP_SSHD_CONFIG="${SSHD_CONFIG}.bak"
LOG_FILE="/var/log/ssh_config_script.log"
restart_needed=false

# 日志函数,输出到终端和文件
log() {
local level="$1"
shift
local message="$(date "+[%Y-%m-%d %H:%M:%S]") [$level] $*"
echo "$message" >&2
echo "$message" >> "$LOG_FILE"
}

# 备份配置文件
backup_config() {
log INFO "正在备份配置文件..."
if ! sudo cp "$SSHD_CONFIG" "$BACKUP_SSHD_CONFIG"; then
log ERROR "备份配置文件失败"
exit 1
fi
log INFO "已备份到 $BACKUP_SSHD_CONFIG"
}

# 检查和更新监听地址
update_listen_address() {
log INFO "正在检查监听地址..."
if grep -Fx "ListenAddress 0.0.0.0" "$SSHD_CONFIG" >/dev/null && \
grep -Fx "ListenAddress ::" "$SSHD_CONFIG" >/dev/null; then
log INFO "监听地址未改动,无需修改。"
return 0
fi

log INFO "监听地址需要更新"
backup_config

# 使用临时文件确保修改的原子性
local temp_config
temp_config=$(mktemp)
if ! sed '/^ListenAddress/d' "$SSHD_CONFIG" > "$temp_config"; then
log ERROR "无法处理配置文件。"
rm -f "$temp_config"
exit 1
fi
if ! echo -e "ListenAddress 0.0.0.0\nListenAddress ::" >> "$temp_config"; then
log ERROR "无法写入新监听地址。"
rm -f "$temp_config"
exit 1
fi
if ! sudo mv "$temp_config" "$SSHD_CONFIG"; then
log ERROR "无法更新配置文件。"
rm -f "$temp_config"
exit 1
fi
log INFO "已更新监听地址为 0.0.0.0 和 ::"
restart_needed=true
}

# 验证配置文件语法
check_config() {
log INFO "正在检查 SSH 配置文件语法..."
if ! sudo sshd -t >/dev/null 2>&1; then
log ERROR "SSH 配置文件语法错误,请检查 $SSHD_CONFIG"
# 恢复备份
if [[ -f "$BACKUP_SSHD_CONFIG" ]]; then
log INFO "恢复备份配置文件"
sudo mv "$BACKUP_SSHD_CONFIG" "$SSHD_CONFIG"
fi
exit 1
fi
log INFO "SSH 配置文件语法检查通过"
}

# 重新加载 SSH 服务
reload_service() {
log INFO "正在重新加载 SSH 服务..."
if ! systemctl is-active --quiet sshd; then
log ERROR "SSH 服务未运行,请检查服务状态"
exit 1
fi
if ! sudo systemctl reload sshd; then
log ERROR "重新加载 SSH 服务失败,恢复备份"
if [[ -f "$BACKUP_SSHD_CONFIG" ]]; then
sudo mv "$BACKUP_SSHD_CONFIG" "$SSHD_CONFIG"
fi
exit 1
fi
log INFO "已重新加载 SSH 服务。"
}

# 主逻辑
main() {
# 检查 root 权限
if [[ $EUID -ne 0 ]]; then
log ERROR "此脚本需要以 root 权限运行,请使用 sudo 或切换到 root 用户。"
exit 1
fi

# 检查配置文件存在
if [[ ! -f "$SSHD_CONFIG" ]]; then
log ERROR "SSH 配置文件 $SSHD_CONFIG 不存在。"
exit 1
fi

log INFO "开始执行脚本..."

# 检查和更新监听地址
update_listen_address

# 如果需要重启,验证配置并重新加载服务
if $restart_needed; then
check_config
reload_service
fi

log INFO "脚本执行完成。"
}

# 执行主函数
main
文件云备脚本
#!/bin/bash

# 设置环境变量来保护配置文件密码
export RCLONE_CONFIG_PASS="XXXXXXXX"

# 定义本地和远程目录数组
declare -A directories=(
["/tmp/zfsv3/sata1/data/备份中心/相册存储"]="onedrive@INKSS:/备份/异地云备/相册存储"
["/tmp/zfsv3/sata1/data/备份中心/手机备份"]="onedrive@INKSS:/备份/异地云备/手机备份"
# 添加更多的目录对
)

# 获取当前时间并格式化
current_time() {
date "+[%Y-%m-%d %H:%M:%S]"
}

# 记录开始时间
echo "$(current_time) 备份开始"

# 循环同步每个目录对
for local_dir in "${!directories[@]}"; do
remote_dir=${directories[$local_dir]}
echo "$(current_time) 同步 $local_dir$remote_dir..."

# 同步操作,并捕获错误
if rclone sync "$local_dir" "$remote_dir" --progress; then
echo "$(current_time) 完成 $local_dir 同步"
else
echo "$(current_time) 失败 $local_dir 同步"
exit 1
fi
done

# 输出备份完成消息并记录结束时间
echo "$(current_time) 所有备份已完成!"
echo "$(current_time) 备份结束"

# 取消设置环境变量
unset RCLONE_CONFIG_PASS
镜像备份脚本
#!/bin/bash

# 定义需要同步的目录对
declare -a directories=(
"/tmp/zfsv3/nvme12/data/相册存储:/tmp/zfsv3/sata1/data/备份中心/相册存储"
)

# 获取当前时间并格式化
current_time() {
date "+[%Y-%m-%d %H:%M:%S]"
}

# 记录开始时间
echo -e "$(current_time) 同步开始"

# 同步函数
sync_directories() {
local source_dir="$1"
local target_dir="$2"

# 检查源目录是否存在
if [ ! -d "$source_dir" ]; then
echo -e "$(current_time) 源目录 $source_dir 不存在。"
exit 1
fi

# 检查目标目录是否存在,如果不存在则创建
if [ ! -d "$target_dir" ]; then
echo -e "$(current_time) 警告:目标目录 $target_dir 不存在,正在创建..."
mkdir -p "$target_dir"
if [ $? -ne 0 ]; then
echo -e "$(current_time) 创建目标目录 $target_dir 失败。"
exit 1
fi
fi

echo "$(current_time) 同步 $source$target..."
# 使用 rsync 进行同步,并记录详细日志
rsync -av --delete "$source_dir/" "$target_dir/" | while read line; do
echo "$(current_time) $line"
done

# 检查 rsync 命令是否成功
if [ $? -eq 0 ]; then
echo "$(current_time) 同步成功!已将 $source_dir 下的文件同步到 $target_dir。"
else
echo "$(current_time) 同步失败!请检查问题并重新尝试。"
exit 1
fi
}



# 遍历数组并调用同步函数
for pair in "${directories[@]}"; do
IFS=":" read -r source target <<< "$pair"
sync_directories "$source" "$target"
done

echo -e "$(current_time) 同步完成"