使用效果
- 在服务端上传备份脚本
- 在本地保存脚本
- 在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="ghost"
REMOTE_HOST="ssh.atibm.com"
# 私钥路径
KEY_PATH="/drives/d/fileJob/1606atibm/2105oracle/instance-20210526-1342/ssh.key.20250215.oracle.ghost/oracle-rsa-ghost-nopsw"
# 本地存放目录
LOCAL_DEST="/drives/d/fileJob/1606atibm/2105oracle/instance-20210526-1342/bak"
# 远程脚本绝对路径
REMOTE_SH="/home/ghost/backupGhost.sh"
# 1. 运行远程备份脚本
echo ">>> 正在远程执行备份脚本..."
# 使用 -t 分配伪终端以支持 sudo 环境
ssh -i "$KEY_PATH" -t $REMOTE_USER@$REMOTE_HOST "sudo $REMOTE_SH"
# 2. 获取远程最新生成的 .tar.gz 完整路径
echo ">>> 正在查找生成的备份文件..."
# 注意:这里直接获取完整路径,方便后续 rsync 使用
REMOTE_FILE=$(ssh -i "$KEY_PATH" $REMOTE_USER@$REMOTE_HOST "ls -t /home/ghost/*.tar.gz 2>/dev/null | head -1")
# 检查是否获取到了文件名
if [ -z "$REMOTE_FILE" ]; then
echo "错误:未能在远程服务器找到 ghost*.tar.gz 文件!"
exit 1
fi
FILE_BASENAME=$(basename "$REMOTE_FILE")
echo ">>> 检测到最新备份: $FILE_BASENAME"
# 3. 下载文件到本地 (使用 rsync 显示进度)
echo ">>> 正在启动安全传输 (rsync)..."
# -a: 归档, -v: 详细, -z: 压缩传输, --progress: 显示进度条
# --remove-source-files: (可选) 如果你想下载完自动删除远程文件,可以加这个参数,但为了保险我们还是手动删
rsync -avz --progress -e "ssh -i $KEY_PATH" \
"$REMOTE_USER@$REMOTE_HOST:$REMOTE_FILE" \
"$LOCAL_DEST/"
# 4. 确认下载成功后删除远程文件
if [ $? -eq 0 ]; then
echo ">>> 下载成功,正在清理远程临时备份..."
ssh -i "$KEY_PATH" $REMOTE_USER@$REMOTE_HOST "rm -f $REMOTE_FILE"
echo ">>> [任务完成] 文件已存至: $LOCAL_DEST/$FILE_BASENAME"
else
echo ">>> [错误] 传输过程中出现问题,未清理远程文件。"
exit 1
fi