sync-device.sh
3.08 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#!/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 \"HOME=$H /data/data/com.termux/files/usr/bin/crontab -l\" > $REMOTE/crontab.txt 2>/dev/null # su 切用户会重置 PATH,必须绝对路径 + HOME(否则静默得到空文件)
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
# 重新生成:先清掉旧快照再解开,避免已删文件残留
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
# 微信库密钥:只同步到本地,不入库(.gitignore 的 .wechat_key_*)
"$ADB" shell "su -c 'mkdir -p $REMOTE; cp $H/wechat-viewer/.wechat_key_* $REMOTE/ && chmod -R a+r $REMOTE'" 2>/dev/null || true
mkdir -p wechat-viewer
for k in $("$ADB" shell "su -c 'ls -a $REMOTE'" 2>/dev/null | tr -d '\r' | grep '^\.wechat_key_'); do
"$ADB" pull "$REMOTE/$k" "wechat-viewer/$k" >/dev/null && chmod 600 "wechat-viewer/$k"
done
"$ADB" shell "su -c 'rm -rf $REMOTE'"
# 兜底:扫一遍疑似密钥,命中就报警并中止(不留在工作区)
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"