使用效果
- 在服务端上传备份脚本
- 在本地保存脚本
- 在moba创建macro:sh 本地脚本地址
- 执行一次macro的效果:通过ssh执行远端备份脚本,再拉取压缩包,下载完成后删除远端压缩包文件

服务器备份脚本.sh
#!/bin/sh
# [配置参考]
# 1. 提权免密 (假设脚本名为 backup.sh):
# 执行 sudo visudo,在末尾添加: 你的用户名 ALL=(ALL) NOPASSWD: /绝对路径/backup.sh
# 2. 解压命令: sudo tar -xzvf "压缩包名" -C / --overwrite
# --- 1. 自动识别环境 ---
# 如果是通过 sudo 运行的,取原用户名;否则取当前用户
if [ -n "$SUDO_USER" ]; then
CURRENT_USER="$SUDO_USER"
else
CURRENT_USER=$(whoami)
fi
# 获取脚本所在的绝对目录
SCRIPT_PATH=$(readlink -f "$0")
SCRIPT_DIR=$(dirname "$SCRIPT_PATH")
cd "$SCRIPT_DIR"
# --- 2. 定义变量 ---
# 文件名包含当前用户名和时间戳
FILE_NAME="${CURRENT_USER}_$(date +"%Y%m%d%H%M%S").tar.gz"
# 排除列表 (Trilium 专用排除,如果是纯通用备份可按需调整)
EXCLUDES="--exclude=*/trilium/data/backup --exclude=*/trilium/data/log --exclude=*.db-shm --exclude=*.db-wal"
# 打包目标 (包含脚本自身和业务目录)
TARGETS="$SCRIPT_PATH /www"
# --- 3. 执行压缩 ---
echo ">>> [User: $CURRENT_USER] Starting backup to $FILE_NAME ..."
# 使用 sudo 执行,-P 保留绝对路径
sudo tar -czvPf "$FILE_NAME" $EXCLUDES $TARGETS
# --- 4. 权限归还 (核心:通用化处理) ---
# 将生成的 root 权限文件交还给当前执行脚本的普通用户
# sudo chown "$CURRENT_USER":"$CURRENT_USER" "$FILE_NAME"
# --- 5. 显示结果 ---
FILE_SIZE=$(du -h "$FILE_NAME" | cut -f1)
echo ">>> Backup complete: $SCRIPT_DIR/$FILE_NAME"
echo ">>> File size: $FILE_SIZE"
本地moba调度脚本.sh
#!/bin/bash
# 在 MobaXterm 的 macro 录制命令:
# sh /drives/d/fileJob/1606atibm/2105oracle/instance-20210526-1342/bak/backupMobaSSHAuto.sh
# --- 配置区 ---
REMOTE_USER="xxx"
REMOTE_HOST="xxx.xxx.com"
KEY_PATH="/drives/d/xxx.rsa"
LOCAL_DEST="/drives/d/bak"
REMOTE_SH="/home/xxx/backupGhost.sh"
# 1. 运行远程备份脚本
echo ">>> 正在远程执行备份脚本..."
ssh -x -o BatchMode=yes -i "$KEY_PATH" "$REMOTE_USER@$REMOTE_HOST" "sudo $REMOTE_SH"
# 2. 获取远程最新生成的 .tar.gz
echo ">>> 正在查找生成的备份文件..."
REMOTE_FILE=$(ssh -x -o BatchMode=yes -i "$KEY_PATH" "$REMOTE_USER@$REMOTE_HOST" "cd /home/ghost && ls -1t *.tar.gz 2>/dev/null | head -n1")
if [ -z "$REMOTE_FILE" ]; then
echo "错误:未能在远程服务器找到 *.tar.gz 文件!"
exit 1
fi
FILE_BASENAME=$(basename "$REMOTE_FILE")
echo ">>> 检测到最新备份: $FILE_BASENAME"
# 3. 下载文件(修复 ProxyCommand 格式 + 引号)
rsync -avz --progress -e "ssh -i \"$KEY_PATH\" -o ProxyCommand=\"nc -X 5 -x 127.0.0.1:7890 %h %p\"" \
"$REMOTE_USER@$REMOTE_HOST:/home/xxx/$REMOTE_FILE" \
"$LOCAL_DEST/"
RSYNC_STATUS=$?
# 4. 确认下载成功
if [ $RSYNC_STATUS -eq 0 ]; then
echo ">>> 下载成功,正在清理远程临时备份..."
ssh -t -x -o BatchMode=yes -i "$KEY_PATH" "$REMOTE_USER@$REMOTE_HOST" "sudo rm -f $REMOTE_FILE"
echo ">>> [任务完成] 文件已存至: $LOCAL_DEST/$FILE_BASENAME"
else
# 修复:错误变量名
echo ">>> [错误] rsync 传输失败 (Code: $RSYNC_STATUS),未清理远程文件。"
exit 1
fi
解压
- sudo tar -xzvpf ghost20250701090751.tar.gz -C /
- -x: 解压
- -z: 处理 gzip
- -v: 显示进度
- -f: 指定文件
- -p: 关键参数!保留原始文件的权限、所有者和时间戳
- -C: 指定解压到/