61 lines
2.8 KiB
Bash
61 lines
2.8 KiB
Bash
|
|
#!/usr/bin/with-contenv bash
|
|||
|
|
# linuxserver 启动钩子(/custom-cont-init.d,root 身份,每次启动、在各服务起来之前执行)。
|
|||
|
|
#
|
|||
|
|
# 目的:给每个实例一个【唯一且持久】的设备身份,避免所有实例共用镜像里烤死的同一个 machine-id。
|
|||
|
|
#
|
|||
|
|
# 背景(P0):Debian/基础镜像把 machine-id 固化在镜像层里,于是全世界每个 wechat-on-cloud
|
|||
|
|
# 实例的 /etc/machine-id 都相同。machine-id 是 Linux 上最接近"设备指纹"的标识,微信会读它做
|
|||
|
|
# 风控;成千上万个账号共用同一个 machine-id = 典型"设备农场"特征 → 被腾讯批量判风险 → 登录即
|
|||
|
|
# 被强制退出、反复循环。
|
|||
|
|
#
|
|||
|
|
# 解法:
|
|||
|
|
# 1) 在数据卷(/config,随实例持久)里存一个本实例专属的随机 machine-id;
|
|||
|
|
# 2) 每次启动把它写回 /etc/machine-id 与 /var/lib/dbus/machine-id。
|
|||
|
|
# 这样:实例之间互不相同(破掉设备农场特征),且重启 / 升级 / 重建容器都保持不变("设备老在变"
|
|||
|
|
# 同样可疑)。仅在卷里尚无该文件时才生成,故老实例首启会拿到一个新的唯一 id(之后恒定)。
|
|||
|
|
set -e
|
|||
|
|
|
|||
|
|
ID_FILE=/config/.woc-machine-id
|
|||
|
|
|
|||
|
|
# 生成 32 位小写十六进制(systemd machine-id 格式):优先用内核 uuid 源,去掉连字符。
|
|||
|
|
if [ ! -s "$ID_FILE" ]; then
|
|||
|
|
if [ -r /proc/sys/kernel/random/uuid ]; then
|
|||
|
|
tr -d '-' < /proc/sys/kernel/random/uuid | tr 'A-F' 'a-f' > "$ID_FILE"
|
|||
|
|
else
|
|||
|
|
head -c16 /dev/urandom | od -An -tx1 | tr -d ' \n' > "$ID_FILE"
|
|||
|
|
fi
|
|||
|
|
fi
|
|||
|
|
|
|||
|
|
MID="$(tr -dc 'a-f0-9' < "$ID_FILE" | head -c 32)"
|
|||
|
|
# 兜底:若文件内容异常(长度不足 32),重新生成
|
|||
|
|
if [ "${#MID}" -ne 32 ]; then
|
|||
|
|
MID="$(tr -d '-' < /proc/sys/kernel/random/uuid | tr 'A-F' 'a-f' | head -c 32)"
|
|||
|
|
printf '%s\n' "$MID" > "$ID_FILE"
|
|||
|
|
fi
|
|||
|
|
|
|||
|
|
printf '%s\n' "$MID" > /etc/machine-id 2>/dev/null || true
|
|||
|
|
mkdir -p /var/lib/dbus
|
|||
|
|
printf '%s\n' "$MID" > /var/lib/dbus/machine-id 2>/dev/null || true
|
|||
|
|
|
|||
|
|
# 抹掉最明显的容器标记(微信可能据此判定非真实桌面)。/.dockerenv 由 docker 注入,删掉无副作用。
|
|||
|
|
rm -f /.dockerenv 2>/dev/null || true
|
|||
|
|
|
|||
|
|
# 设备伪装:把 /etc/os-release 改成 deepin(微信官方支持的发行版;Deepin 本就基于 Debian,
|
|||
|
|
# 与本镜像的 Debian 用户态一致,不自相矛盾)。面板按 WOC_SPOOF_OS 控制(默认开,=0 关)。
|
|||
|
|
# /etc/os-release 是指向 /usr/lib/os-release 的软链,重定向会写穿到目标,故直接写它即可。
|
|||
|
|
if [ "${WOC_SPOOF_OS:-1}" = "1" ]; then
|
|||
|
|
cat > /etc/os-release <<'OSEOF'
|
|||
|
|
PRETTY_NAME="deepin 23"
|
|||
|
|
NAME="deepin"
|
|||
|
|
VERSION_ID="23"
|
|||
|
|
VERSION="23"
|
|||
|
|
VERSION_CODENAME=beige
|
|||
|
|
ID=deepin
|
|||
|
|
ID_LIKE=debian
|
|||
|
|
HOME_URL="https://www.deepin.org/"
|
|||
|
|
BUG_REPORT_URL="https://bbs.deepin.org/"
|
|||
|
|
OSEOF
|
|||
|
|
fi
|
|||
|
|
|
|||
|
|
echo "[woc-identity] machine-id 已设为本实例专属(持久化于数据卷);os 伪装=${WOC_SPOOF_OS:-1}"
|