sync-device.sh 2.52 KB
#!/usr/bin/env bash
# 把 Pixel 上的运行时代码拉到本目录(只拉代码/配置,不拉 .db/日志/.env/.hermes_env.sh/缓存)。
# 手机是主版本,本目录是快照;用法: device/sync-device.sh [adb 路径]   然后 git diff / commit。
set -euo pipefail
cd "$(dirname "$0")"
ADB=${1:-../platform-tools/adb}
REMOTE=/data/local/tmp/device-sync
H=/data/data/com.termux/files/home

"$ADB" shell "su -c 'mkdir -p $REMOTE; chmod 777 $REMOTE'" 
"$ADB" shell "su -c '
export PATH=/data/data/com.termux/files/usr/bin:/system/bin:\$PATH
cd $H
{
  find pixelphone wechat-viewer dsh .dsh/profiles .dsh/skills .termux/boot -type f \
    \( -name \"*.py\" -o -name \"*.sh\" -o -name \"*.yml\" -o -name \"*.yaml\" -o -name \"*.cjs\" -o -name \"*.md\" -o -name \"*.html\" -o -name \"*.js\" -o -name \"*.css\" -o -name \"package.json\" -o -name \"start-*\" \) \
    ! -path \"*/__pycache__/*\" ! -path \"*/node_modules/*\" ! -path \"*.flock-build*\" ! -name \"*.bak*\" ! -path \"*/_stage*\" ! -path \"*/_q/*\" \
    ! -path \"*/logs/*\" ! -path \"*/cron-logs/*\" ! -path \"*/ocr_models/*\" ! -path \"*/backups/*\" ! -path \"*/digests/*\" ! -path \"*/tmp/*\" ! -path \"*/data/*\" \
    ! -name \"_reply_result*\" ! -name \"article_*\" ! -name \"config.py\" ! -name \".secrets.env\" ! -name \".env\"
  ls /data/adb/service.d/*.sh 2>/dev/null
} > $REMOTE/list.txt
tar czf $REMOTE/device.tgz -T $REMOTE/list.txt 2>/dev/null
su -g 10329 -G 3003 10329 -c \"crontab -l\" > $REMOTE/crontab.txt 2>/dev/null
chmod -R a+r $REMOTE; wc -l $REMOTE/list.txt
'"
rm -rf _extract && mkdir _extract
"$ADB" pull $REMOTE/device.tgz _extract/ >/dev/null
"$ADB" pull $REMOTE/crontab.txt crontab.txt >/dev/null
"$ADB" shell "su -c 'rm -rf $REMOTE'"
# 重新生成:先清掉旧快照再解开,避免已删文件残留
find . -mindepth 1 -maxdepth 1 ! -name sync-device.sh ! -name _extract ! -name crontab.txt ! -name README.md -exec rm -rf {} +
tar xzf _extract/device.tgz -C . 2>/dev/null || true
# service.d 脚本带绝对路径解开在 data/adb/...,挪到 service.d/
if [ -d data/adb/service.d ]; then mv data/adb/service.d service.d; rm -rf data; fi
rm -rf _extract
# 兜底:扫一遍疑似密钥,命中就报警并中止(不留在工作区)
if grep -rIlE '(sk-[A-Za-z0-9]{20,}|LTAI[A-Za-z0-9]{10,}|AccessKeySecret|api[_-]?key["'"'"' ]*[:=]["'"'"' ]*[A-Za-z0-9]{24,})' . --exclude=sync-device.sh --exclude=README.md 2>/dev/null; then
  echo "!! 上面文件疑似含密钥,请检查后再提交" >&2; exit 1
fi
echo "ok: $(find . -type f ! -name sync-device.sh | wc -l) files"