From 7b6bed439b01427c6601db51d1bba0233549782c Mon Sep 17 00:00:00 2001 From: mango Date: Sun, 22 Feb 2026 07:20:42 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=5Fssh=5Fwrap=E7=BB=9F=E4=B8=80=E7=AE=A1?= =?UTF-8?q?=E7=90=86SSH=E5=8F=82=E6=95=B0=EF=BC=8C=E4=BF=AE=E5=A4=8Drsync?= =?UTF-8?q?=E5=8F=8C-e=E5=AF=BC=E8=87=B4key=E8=AE=A4=E8=AF=81=E5=A4=B1?= =?UTF-8?q?=E8=B4=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- vps-snapshot.sh | 45 +++++++++++++++------------------------------ 1 file changed, 15 insertions(+), 30 deletions(-) diff --git a/vps-snapshot.sh b/vps-snapshot.sh index e83b133..2853487 100755 --- a/vps-snapshot.sh +++ b/vps-snapshot.sh @@ -631,8 +631,7 @@ cleanup_remote() { local remote_path="${REMOTE_DIR:-/backup}/${VPS_NAME:-$(hostname)}" log "🧹 清理远程旧快照 (保留${days}天)..." - _ssh_wrap ssh -o StrictHostKeyChecking=no \ - -p "${REMOTE_PORT:-22}" "${REMOTE_USER:-root}@$REMOTE_IP" \ + _ssh_wrap ssh "${REMOTE_USER:-root}@$REMOTE_IP" \ "find $remote_path -name '*.tar.gz' -mtime +$days -delete 2>/dev/null" || true } @@ -883,8 +882,7 @@ do_restore_config_remote() { echo "" # 获取远程快照列表 - local snap_list=$(_ssh_wrap ssh -o StrictHostKeyChecking=no \ - -p "${REMOTE_PORT:-22}" "${REMOTE_USER:-root}@$REMOTE_IP" \ + local snap_list=$(_ssh_wrap ssh "${REMOTE_USER:-root}@$REMOTE_IP" \ "ls -t $remote_path/*.tar.gz 2>/dev/null") [ -z "$snap_list" ] && { error "无远程快照"; return 1; } @@ -895,8 +893,7 @@ do_restore_config_remote() { local snaps=() while read -r snap; do local name=$(basename "$snap") - local size=$(_ssh_wrap ssh -o StrictHostKeyChecking=no \ - -p "${REMOTE_PORT:-22}" "${REMOTE_USER:-root}@$REMOTE_IP" \ + local size=$(_ssh_wrap ssh "${REMOTE_USER:-root}@$REMOTE_IP" \ "ls -lh '$snap' 2>/dev/null | awk '{print \$5}'" 2>/dev/null) echo " $i) $name ($size)" snaps+=("$snap") @@ -916,8 +913,7 @@ do_restore_config_remote() { log "下载快照: $(basename "$selected")" local local_file="/tmp/remote_snapshot_$$.tar.gz" - _ssh_wrap scp -o StrictHostKeyChecking=no \ - -P "${REMOTE_PORT:-22}" "${REMOTE_USER:-root}@$REMOTE_IP:$selected" "$local_file" + _ssh_wrap scp "${REMOTE_USER:-root}@$REMOTE_IP:$selected" "$local_file" [ ! -f "$local_file" ] && { error "下载失败"; return 1; } @@ -1012,13 +1008,11 @@ do_sync_remote() { log "📤 同步到远程: $REMOTE_IP:$remote_path" # 创建远程目录(以VPS名称命名) - _ssh_wrap ssh -o StrictHostKeyChecking=no \ - -p "${REMOTE_PORT:-22}" "${REMOTE_USER:-root}@$REMOTE_IP" \ + _ssh_wrap ssh "${REMOTE_USER:-root}@$REMOTE_IP" \ "mkdir -p $remote_path" # 同步到VPS专属目录 _ssh_wrap rsync -avz --progress \ - -e "ssh -o StrictHostKeyChecking=no -p ${REMOTE_PORT:-22}" \ "$latest" "${REMOTE_USER:-root}@$REMOTE_IP:$remote_path/" # 清理远程旧快照 @@ -1144,25 +1138,16 @@ load_config() { _ssh_wrap() { local mode="$1"; shift local key="${REMOTE_KEY:-}" pass="${REMOTE_PASS:-}" - if [ -n "$key" ] && [ -f "$key" ]; then - case "$mode" in - ssh) ssh -i "$key" "$@" ;; - scp) scp -i "$key" "$@" ;; - rsync) rsync -e "ssh -i $key" "$@" ;; - esac - elif [ -n "$pass" ]; then - case "$mode" in - ssh) sshpass -p "$pass" ssh "$@" ;; - scp) sshpass -p "$pass" scp "$@" ;; - rsync) sshpass -p "$pass" rsync "$@" ;; - esac - else - case "$mode" in - ssh) ssh "$@" ;; - scp) scp "$@" ;; - rsync) rsync "$@" ;; - esac - fi + local ssh_opts="-o StrictHostKeyChecking=no -p ${REMOTE_PORT:-22}" + [ -n "$key" ] && [ -f "$key" ] && ssh_opts="$ssh_opts -i $key" + local ssh_cmd="ssh $ssh_opts" + local prefix="" + [ -z "$key" ] || [ ! -f "$key" ] && [ -n "$pass" ] && prefix="sshpass -p $pass" + case "$mode" in + ssh) $prefix $ssh_cmd "$@" ;; + scp) $prefix scp -o StrictHostKeyChecking=no ${key:+-i "$key"} -P "${REMOTE_PORT:-22}" "$@" ;; + rsync) $prefix rsync -e "$ssh_cmd" "$@" ;; + esac } save_config() {