#!/usr/bin/env bash # B2' 步:47 → 106 直推生产 dataRoot(tar-over-ssh;只用命令执行,绕开 rsync 协议问题) # · tar --numeric-owner 保 uid/gid(否则 106 上属主错 ⇒ 实例 EACCES) # · 排除 dshs.db*(权威源=47 的 PG)与 secret.key(主密钥不外扩 —— R5 最小面) set -uo pipefail KEY=/root/.ssh/dshworker_ed25519 DST=root@106.54.21.172 SSHO="-i $KEY -o BatchMode=yes -o StrictHostKeyChecking=accept-new" echo "=== 1) 目标端准备(ssh -n 防抢 stdin) ===" ssh -n $SSHO "$DST" 'mkdir -p /var/lib/dshs && echo " ready: $(ls -ld /var/lib/dshs)"' echo "=== 2) 推送(tar → ssh → tar --numeric-owner -x) ===" cd /var/lib/dshs tar --numeric-owner -cf - \ --exclude=./dshs.db --exclude=./dshs.db-shm --exclude=./dshs.db-wal --exclude=./secret.key \ . | ssh $SSHO "$DST" 'tar -C /var/lib/dshs --numeric-owner -xf -' rc=$? echo " 管道 rc=$rc" echo "=== 3) 目标端核对 ===" ssh -n $SSHO "$DST" 'bash -c " echo \" 顶层: \$(ls /var/lib/dshs | tr \"\n\" \" \")\" echo \" 总量: \$(du -sh /var/lib/dshs | cut -f1)\" echo \" users 目录数: \$(ls /var/lib/dshs/users | wc -l)\" echo \" --- 属主抽样(应与 47 的 uid 一致) ---\" for d in /var/lib/dshs/users/*/; do printf \" %-38s uid=%s\n\" \"\$(basename \$d)\" \"\$(stat -c %u \$d)\"; done echo \" bundled-skills=\$(ls /var/lib/dshs/bundled-skills | wc -l) business-plugins=\$(ls /var/lib/dshs/business-plugins | wc -l)\" echo \" ⛔ 不该有 dshs.db/secret.key: \$(ls /var/lib/dshs/dshs.db /var/lib/dshs/secret.key 2>/dev/null | wc -l) 个(应 0)\" "'