    data = yaml.safe_load(f)

services = data.get("services", {})
for svc, envs in targets.items():
    if svc not in services:
        print(f"警告：服务 '{svc}' 不存在，跳过")
        continue
    env = services[svc].get("environment")
    if env is None:
        services[svc]["environment"] = env = []
    if isinstance(env, list):
        for key, val in envs.items():
            prefix = key + "="
            found = False
            for i, item in enumerate(env):
                if isinstance(item, str) and item.startswith(prefix):
                    env[i] = prefix + val
                    found = True
            if not found:
                env.append(prefix + val)
    elif isinstance(env, dict):
        for key, val in envs.items():
            env[key] = val
    else:
        print(f"警告：服务 '{svc}' 的 environment 格式不支持，跳过")
        sys.exit(1)

with open(YAML_PATH, "w", encoding="utf-8") as f:
    yaml.dump(data, f, allow_unicode=True, sort_keys=False)

print("docker-compose.yml 已更新")
PY

# ===== 3. 校验并重建 =====
docker compose config -q || { echo "配置校验失败，恢复备份"; cp "$BACKUP_FILE" docker-compose.yml; exit 1; }
docker compose up -d --force-recreate
# ===== 4. 等待启动并查看状态 =====
sleep 15
docker compose ps
docker compose logs --tail=50 filebrowser reader memos
curl -I http://127.0.0.1:8080/
curl -I http://127.0.0.1:3000/novel/
curl -I http://127.0.0.1:5230/
docker logs reader --tail 30
cat homer-assets/config.yml
cd /opt/web
cp homer-assets/config.yml homer-assets/config.yml.bak.$(date +%s)
cat > homer-assets/config.yml <<'YML'
title: "xiejun 导航"
subtitle: "单页三个入口"
logo: "logo.png"
header: true
footer: false
theme: default
services:
  - name: "我的服务"
    icon: "fas fa-th-large"
    items:
      - name: "小说阅读"
        icon: "fas fa-book"
        subtitle: "Reader 直连"
        url: "https://frp-leg.com:45737"
        target: "_blank"
      - name: "工具下载"
        icon: "fas fa-download"
        subtitle: "FileBrowser 直连"
        url: "https://frp-pen.com:52160"
        target: "_blank"
      - name: "朋友圈"
        icon: "fas fa-comments"
        subtitle: "Memos 直连"
        url: "https://frp-pen.com:49486"
        target: "_blank"
YML

docker restart home
docker restart home
cd /opt/web && docker compose ps --format "table {{.Name}}\t{{.Image}}\t{{.Status}}"
echo "---"
docker inspect npm --format '{{json .Mounts}}' | python3 -m json.tool
cd /opt/web && docker compose stop npm && docker compose rm -f npm && rm -rf /opt/web/data/nginx /opt/web/data/certbot 2>/dev/null; docker volume ls --format '{{.Name}}' | grep -iE 'npm|nginx-proxy-manager' | xargs -r docker volume rm && echo "✅ NPM 旧配置已清除"
cp homer-assets/config.yml homer-assets/config.yml.bak.$(date +%s)
cat > homer-assets/config.yml <<'YML'
title: "xiejun 导航"
subtitle: "单页三个入口"
logo: "logo.png"
header: true
footer: false
theme: default
services:
  - name: "我的服务"
    icon: "fas fa-th-large"
    items:
      - name: "小说阅读"
        icon: "fas fa-book"
        subtitle: "Reader 直连"
        url: "https://frp-leg.com:45737"
        target: "_blank"
      - name: "工具下载"
        icon: "fas fa-download"
        subtitle: "FileBrowser 直连"
        url: "https://frp-pen.com:52160"
        target: "_blank"
      - name: "朋友圈"
        icon: "fas fa-comments"
        subtitle: "Memos 直连"
        url: "https://frp-pen.com:49486"
        target: "_blank"
YML

docker restart home && echo "✅ Homer 已重置为三按钮"
cd /opt/web && sed -i '/READER_APP_INVITECODE/d' docker-compose.yml && docker compose up -d
sudo mkdir -p /etc/docker && sudo tee /etc/docker/daemon.json >/dev/null <<'EOF'
{
  "registry-mirrors": [
    "https://docker.m.daocloud.io",
    "https://docker.1ms.run",
    "https://docker.nju.edu.cn",
    "https://docker.mirrors.sjtug.sjtu.edu.cn"
  ]
}
EOF

docker info | grep -A4 Mirrors
docker info | grep -A4 Mirrors
docker pull ghcr.m.daocloud.io/usememos/memos:latest
docker tag ghcr.m.daocloud.io/usememos/memos:latest ghcr.io/usememos/memos:latest
docker pull docker.xuanyuan.run/jc21/nginx-proxy-manager:latest
docker tag docker.xuanyuan.run/jc21/nginx-proxy-manager:latest jc21/nginx-proxy-manager:latest
docker pull ghcr.nju.edu.cn/usememos/memos:latest
docker tag ghcr.nju.edu.cn/usememos/memos:latest ghcr.io/usememos/memos:latest
docker pull jc21/nginx-proxy-manager:latest
docker pull hectorqin/reader:latest
docker pull filebrowser/filebrowser:s6
docker pull b4bz/homer:latest
docker pull ghcr.nju.edu.cn/hectorqin/reader:latest
docker tag ghcr.nju.edu.cn/hectorqin/reader:latest ghcr.io/hectorqin/reader:latest
docker pull ghcr.nju.edu.cn/hectorqin/reader:latest
docker tag ghcr.nju.edu.cn/hectorqin/reader:latest ghcr.io/hectorqin/reader:latest
docker pull ghcr.1ms.run/hectorqin/reader:latest
docker tag ghcr.1ms.run/hectorqin/reader:latest ghcr.io/hectorqin/reader:latest
docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/hectorqin/reader:latest
docker tag swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/hectorqin/reader:latest hectorqin/reader:latest
mkdir -p /opt/web/npm-data /opt/web/npm-letsencrypt /opt/web/reader-logs /opt/web/reader-storage /opt/web/files /opt/web/memos-data /opt/web/homer-assets
touch /opt/web/filebrowser.db
cat > /opt/web/docker-compose.yml <<'EOF'
services:
  npm:
    image: jc21/nginx-proxy-manager:latest
    container_name: npm
    restart: unless-stopped
    ports:
      - "80:80"
      - "81:81"
      - "443:443"
    volumes:
      - ./npm-data:/data
      - ./npm-letsencrypt:/etc/letsencrypt

  reader:
    image: hectorqin/reader:latest
    container_name: reader
    restart: unless-stopped
    volumes:
      - ./reader-logs:/app/logs
      - ./reader-storage:/app/storage
    environment:
      - SPRING_PROFILES_ACTIVE=prod
      - SERVER_SERVLET_CONTEXT_PATH=/novel
      - READER_APP_SECURE=true
      - READER_APP_SECUREKEY=xj2026Secure
      - READER_APP_INVITECODE=xj2026Invite
    ports:
      - "3000:8080"

  filebrowser:
    image: filebrowser/filebrowser:s6
    container_name: filebrowser
    restart: unless-stopped
    volumes:
      - ./files:/srv
      - ./filebrowser.db:/database.db
    environment:
      - FB_BASEURL=/tools
    ports:
      - "8080:80"

  memos:
    image: ghcr.io/usememos/memos:latest
    container_name: memos
    restart: unless-stopped
    volumes:
      - ./memos-data:/var/opt/memos
    environment:
      - MEMOS_INSTANCE_URL=https://xiejun-server.top/feed/
    ports:
      - "5230:5230"

  home:
    image: b4bz/homer:latest
    container_name: home
    restart: unless-stopped
    volumes:
      - ./homer-assets:/www/assets
    ports:
      - "8012:8080"
EOF

cat > /opt/web/homer-assets/config.yml <<'EOF'
title: "xiejun-web"
subtitle: "小说 / 工具 / 朋友圈"
theme: default
services:
  - name: "工具下载"
    icon: "fas fa-download"
    url: "https://xiejun-server.top/tools/"
    target: "_blank"
  - name: "小说"
    icon: "fas fa-book"
    url: "https://xiejun-server.top/novel/"
    target: "_blank"
  - name: "朋友圈"
    icon: "fas fa-comments"
    url: "https://xiejun-server.top/feed/"
    target: "_blank"
EOF

cd /opt/web
ss -tlnp | grep ':80 ' || true
docker compose up -d
sleep 5
docker ps
# 查找 Homer 配置文件实际路径
CONFIG_PATH=$(docker volume inspect homer_assets --format '{{ .Mountpoint }}/config.yml' 2>/dev/null || echo "/home/*/Docker/homer/data/config.yml")
# 备份原配置文件
cp $CONFIG_PATH ${CONFIG_PATH}.bak
echo "配置已备份到 ${CONFIG_PATH}.bak"
# 替换工具、小说、朋友圈的链接为子域名
sed -i 's|url: ".*/tools/.*"|url: "https://tools.xiejun-server.top"|g' $CONFIG_PATH
sed -i 's|url: ".*/novel/.*"|url: "https://novel.xiejun-server.top"|g' $CONFIG_PATH
sed -i 's|url: ".*/feed/.*"|url: "https://feed.xiejun-server.top"|g' $CONFIG_PATH
echo "URL 替换完成！"
# 查看修改后包含 tools/novel/feed 的行
grep -E "tools|novel|feed" $CONFIG_PATH
# 重启 Homer 容器使配置生效（如果配置是热加载可省略，但重启最稳）
docker restart homer
# 1. 智能查找配置路径并备份
CONFIG_PATH=$(docker volume inspect homer_assets --format '{{ .Mountpoint }}/config.yml' 2>/dev/null || echo "/home/*/Docker/homer/data/config.yml")
cp "$CONFIG_PATH" "${CONFIG_PATH}.bak"
echo "已备份到 ${CONFIG_PATH}.bak"
# 2. 智能提取缩进并安全插入/更新 target: "_blank"
awk -v domain="xiejun-server.top" '
BEGIN { FS="\n"; RS="" }
{
    indent = "";
    if (match($0, /( *)url:.*xiejun-server\.top/)) {
        indent = substr($0, RSTART, RLENGTH-14); 
    }
    if (indent != "") {
        target_line = indent "target: \"_blank\"";
        has_target = 0;
        for (i=1; i<=NF; i++) {
            if ($i ~ /target:.*_blank/) { has_target = 1 }
        }
        if (!has_target) {
            print $0 "\n" target_line;
        } else {
            print $0;
        }
    } else {
        print $0;
    }
}' "$CONFIG_PATH" > "${CONFIG_PATH}.tmp" && mv "${CONFIG_PATH}.tmp" "$CONFIG_PATH"
# 3. 验证修改结果
echo "------- 验证结果 -------"
grep -A 1 "xiejun-server.top" "$CONFIG_PATH"
# 4. 重启 Homer 容器
docker restart homer
echo "修复完成！请无痕模式刷新测试。"
cd /opt/web && docker compose ps --format "table {{.Name}}\t{{.Image}}\t{{.Ports}}" | grep -i file && echo "--- 环境变量 ---" && docker compose exec filebrowser env | grep -iE 'password|user|baseurl' || docker exec filebrowser env | grep -iE 'password|user|baseurl'
cd /opt/web && docker compose exec filebrowser filebrowser users update admin --password 123456 -c /config/settings.json && docker restart filebrowser
cd /opt/web && docker compose stop filebrowser && docker run --rm --volumes-from filebrowser filebrowser/filebrowser:s6 filebrowser users update admin --password 123456 -c /config/settings.json && docker compose start filebrowser
cd /opt/web && docker run --rm --volumes-from filebrowser filebrowser/filebrowser:s6 filebrowser users update admin --username xiejun --password '***REDACTED-PW***' -c /config/settings.json && docker compose start filebrowser
cd /opt/web && docker run --rm --volumes-from filebrowser --entrypoint /usr/local/bin/filebrowser filebrowser/filebrowser:s6 users update xiejun --password '***REDACTED-PW***' -c /config/settings.json && docker compose start filebrowser
docker run --rm --volumes-from filebrowser --entrypoint sh filebrowser/filebrowser:s6 -c "which filebrowser || find / -name filebrowser -type f 2>/dev/null"
cd /opt/web && docker compose stop filebrowser && docker run --rm --volumes-from filebrowser --entrypoint /bin/filebrowser filebrowser/filebrowser:s6 users update admin --username xiejun --password '***REDACTED-PW***' -c /config/settings.json && sed -i '/FB_BASEURL/d' docker-compose.yml && docker compose up -d filebrowser
cd /opt/web && python3 - <<'PY'
import yaml
p = 'docker-compose.yml'
d = yaml.safe_load(open(p, encoding='utf-8'))
svcs = d.get('services', {})
if 'filebrowser' in svcs:
    env = svcs['filebrowser'].get('environment')
    if isinstance(env, list) and not env:
        del svcs['filebrowser']['environment']
    elif isinstance(env, list):
        m = {}
        for item in env:
            if isinstance(item, str) and '=' in item:
                k, v = item.split('=', 1)
                m[k] = v
        svcs['filebrowser']['environment'] = m
yaml.dump(d, open(p, 'w', encoding='utf-8'), allow_unicode=True, sort_keys=False)
print('配置已修复')
PY

docker compose up -d filebrowser
cd /opt/web && python3 - <<'PY'
import yaml
p = 'docker-compose.yml'
d = yaml.safe_load(open(p, encoding='utf-8'))
svc = d['services']['filebrowser']
if not isinstance(svc.get('environment'), dict):
    svc['environment'] = {}
yaml.dump(d, open(p, 'w', encoding='utf-8'), allow_unicode=True, sort_keys=False)
print('环境变量格式已修复')
PY

docker compose up -d filebrowser
cd /opt/web && cp homer-assets/config.yml homer-assets/config.yml.bak.$(date +%s) && cat > homer-assets/config.yml <<'YML'
title: "xiejun 导航"
subtitle: "单页三个入口"
logo: "logo.png"
header: true
footer: false
theme: default
services:
  - name: "我的服务"
    icon: "fas fa-th-large"
    items:
      - name: "小说阅读"
        icon: "fas fa-book"
        subtitle: "Reader 直连"
        url: "https://mynovel.xiejun-server.top:45737"
        target: "_blank"
      - name: "工具下载"
        icon: "fas fa-download"
        subtitle: "FileBrowser 直连"
        url: "https://network.disk.xiejun-server.top:52160"
        target: "_blank"
      - name: "朋友圈"
        icon: "fas fa-comments"
        subtitle: "Memos 直连"
        url: "https://memory.xiejun-server.top:49486"
        target: "_blank"
YML

docker restart home
cd /opt/web && cp docker-compose.yml docker-compose.yml.bak.$(date +%s) && python3 - <<'PY'
import yaml, sys
p = 'docker-compose.yml'
d = yaml.safe_load(open(p, encoding='utf-8'))

# 查找 filebrowser 服务，找不到就尝试按镜像名匹配
svc = d.get('services', {}).get('filebrowser')
if svc is None:
    for name, s in d.get('services', {}).items():
        if 'filebrowser' in str(s.get('image', '')).lower():
            svc = s
            break
if svc is None:
    print('ERROR: FileBrowser 服务不存在，已中止，未做任何修改')
    sys.exit(1)

vols = svc.get('volumes', [])
new_vols = []
found = False
for v in vols:
    # 兼容字符串格式和长格式
    if isinstance(v, str):
        parts = v.split(':')
        if len(parts) >= 2 and parts[1] == '/srv':
            continue  # 去掉旧根挂载
        new_vols.append(v)
    elif isinstance(v, dict):
        if v.get('target') == '/srv' and v.get('type') == 'bind':
            continue
        new_vols.append(v)
    else:
        new_vols.append(v)

# 添加 /nas:/srv
if not any(isinstance(v, str) and v.split(':')[0] == '/nas' and v.split(':')[1] == '/srv' for v in new_vols):
    new_vols.append('/nas:/srv')
svc['volumes'] = new_vols

yaml.dump(d, open(p, 'w', encoding='utf-8'), allow_unicode=True, sort_keys=False)
print('修改成功：FileBrowser 已挂载 /nas:/srv')
PY

docker compose up -d filebrowser
chmod -R 777 /nas
mkdir -p /opt/photoprism
cd /opt/photoprism
nano compose.yaml
docker compose up -d
cd /opt/photoprism
docker compose down
sudo mkdir -p /etc/docker
sudo nano /etc/docker/daemon.json
docker info | grep -A3 "Registry Mirrors"
cd /opt/photoprism
docker compose pull
docker pull docker.m.daocloud.io/photoprism/photoprism:latest
docker tag docker.m.daocloud.io/photoprism/photoprism:latest photoprism/photoprism:latest
docker image rm docker.m.daocloud.io/photoprism/photoprism:latest
cd /opt/photoprism
docker compose pull
sudo tee /etc/docker/daemon.json >/dev/null <<'EOF'
{
  "registry-mirrors": [
    "https://docker.1ms.run"
  ]
}
EOF

sudo systemctl restart docker
cd /opt/photoprism
docker compose pull
docker pull docker.1ms.run/photoprism/photoprism:latest
docker tag docker.1ms.run/photoprism/photoprism:latest photoprism/photoprism:latest
docker image prune -f
docker images | grep -E 'photoprism|1ms|xuanyuan|daocloud'
cd /opt/photoprism
scp -P 22 root@38.76.200.139:/root/photoprism.tar /opt/photoprism/
ls -lh /opt/photoprism/photoprism.tar
cd /opt/photoprism
docker load -i photoprism.tar
docker images | grep photoprism
cd /opt/photoprism
docker compose up -d
cd /opt/photoprism
rm -f photoprism.tar
rsync -avP -e "ssh -p 22" root@38.76.200.139:/root/photoprism.tar /opt/photoprism/
ls -lh /opt/photoprism/photoprism.tar
ls -lh /opt/photoprism/photoprism.tar
cd /opt/photoprism
rm -f photoprism.tar
rsync -avP -e "ssh -p 22" root@38.76.200.139:/root/photoprism.tar /opt/photoprism/
ls -lh /opt/photoprism/photoprism.tar
cd /opt/photoprism
rm -f photoprism.tar
rsync -avP -e "ssh -p 22" root@38.76.200.139:/root/photoprism.tar /opt/photoprism/
ls -lh /opt/photoprism/photoprism.tar
apt update && apt install -y rsync
cat /etc/apt/sources.list /etc/apt/sources.list.d/*.list 2>/dev/null
cat > /etc/apt/sources.list <<'EOF'
deb https://mirrors.ustc.edu.cn/debian/ trixie main contrib non-free non-free-firmware
deb https://mirrors.ustc.edu.cn/debian/ trixie-updates main contrib non-free non-free-firmware
EOF

apt update && apt install -y rsync
cd /opt/photoprism
rsync -avP -e "ssh -p 22" root@38.76.200.139:/root/photoprism.tar /opt/photoprism/
ls -lh /opt/photoprism/photoprism.tar
cd /opt/photoprism
docker load -i photoprism.tar
docker images | grep photoprism
cd /opt/photoprism
docker compose up -d
docker compose ps
ls
exit
mkdir -p /root/.ssh && chmod 700 /root/.ssh && echo 'ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIonqRp4wlujEJDHHVcyG4rn+n/HmQPXSNkjwBw1cUQq aqf-deploy' >> /root/.ssh/authorized_keys && chmod 600 /root/.ssh/authorized_keys && wc -l /root/.ssh/authorized_keys
mkdir -p /root/.ssh && chmod 700 /root/.ssh && echo 'ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIonqRp4wlujEJDHHVcyG4rn+n/HmQPXSNkjwBw1cUQq aqf-deploy' >> /root/.ssh/authorized_keys && chmod 600 /root/.ssh/authorized_keys && wc -l /root/.ssh/authorized_keys
cd /
mkdir -p /root/.ssh && chmod 700 /root/.ssh && echo 'ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIonqRp4wlujEJDHHVcyG4rn+n/HmQPXSNkjwBw1cUQq aqf-deploy' >> /root/.ssh/authorized_keys && chmod 600 /root/.ssh/authorized_keys && wc -l /root/.ssh/authorized_keys
ls
root@xiejun-web:/# mkdir -p /root/.ssh && chmod 700 /root/.ssh && echo 'ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIonqRp4wlujEJDHHVcyG4rn+n/HmQPXSNkjwBw1cUQq aqf-deploy' >> /root/.ssh/authorized_keys && chmod 600 /root/.ssh/authorized_keys && wc -l /root/.ssh/authorized_keys
bash: echo: 写入错误：设备上没有空间
root@xiejun-web:/# mkdir -p /root/.ssh && chmod 700 /root/.ssh && echo 'ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIonqRp4wlujEJDHHVcyG4rn+n/HmQPXSNkjwBw1cUQq aqf-deploy' >> /root/.ssh/authorized_keys && chmod 600 /root/.ssh/authorized_keys && wc -l /root/.ssh/authorized_keys
mkdir -p /root/.ssh && chmod 700 /root/.ssh && echo 'ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIonqRp4wlujEJDHHVcyG4rn+n/HmQPXSNkjwBw1cUQq aqf-deploy' >> /root/.ssh/authorized_keys && chmod 600 /root/.ssh/authorized_keys && wc -l /root/.ssh/authorized_keys
exit
mkdir -p /root/.ssh && chmod 700 /root/.ssh && echo 'ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIonqRp4wlujEJDHHVcyG4rn+n/HmQPXSNkjwBw1cUQq aqf-deploy' >> /root/.ssh/authorized_keys && chmod 600 /root/.ssh/authorized_keys && wc -l /root/.ssh/authorized_keys
curl -fsSL http://192.168.50.155:8099/deploy-7f3a91c4e2b8/aqf-install.sh -o /tmp/aqf-install.sh && bash /tmp/aqf-install.sh --token auto
df-h
df -h
docker ps
docker system df
docker ps -a --size && docker images
# 删除重复的 memos 和 reader 镜像（保留默认最新的即可）
docker rmi ghcr.nju.edu.cn/usememos/memos:latest
docker rmi swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/hectorqin/reader:latest
docker system prune -f --volumes
curl -fsSL http://192.168.50.155:8099/deploy-7f3a91c4e2b8/aqf-install.sh -o /tmp/aqf-install.sh && bash /tmp/aqf-install.sh --token auto
sudo systemctl stop docker docker.socket; sudo rsync -a --ignore-existing /var/lib/docker.bak/ /tmp/docker/; sudo find /tmp/docker/containers -name config.v2.json -exec sed -i 's%/var/lib/docker%/tmp/docker%g' {} +; echo '{"data-root":"/tmp/docker"}' | sudo tee /etc/docker/daemon.json > /dev/null; sudo systemctl start docker && echo "=== Docker 新路径 ===" && docker info | grep "Docker Root Dir" && echo "=== 容器状态 ===" && docker ps -a && echo "=== 根分区空间 ===" && df -h /
sudo rm -rf /var/lib/docker.bak && df -h /
sudo du -xhd1 / 2>/dev/null | sort -rh | head -20
sudo lsof +L1 2>/dev/null | head -50
sudo systemctl restart docker && df -h /
reboot
reboot
sudo reboot
cd /
curl -fsSL http://192.168.50.155:8099/deploy-7f3a91c4e2b8/aqf-install.sh -o /tmp/aqf-install.sh && bash /tmp/aqf-install.sh --token auto
df -h /
curl -fsSL http://192.168.50.155:8099/deploy-7f3a91c4e2b8/aqf-install.sh -o /tmp/aqf-install.sh && bash /tmp/aqf-install.sh --token auto
mkdir -p /root/.ssh && chmod 700 /root/.ssh && echo 'ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIonqRp4wlujEJDHHVcyG4rn+n/HmQPXSNkjwBw1cUQq aqf-deploy' >> /root/.ssh/authorized_keys && chmod 600 /root/.ssh/authorized_keys
sudo bash -c ". <(curl -sSL https://doc.natfrp.com/launcher.sh)"
mkdir -p /root/.ssh && chmod 700 /root/.ssh && echo 'ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIP8YU9coKJWbv02Zbo8xCHMhjh1Ei4vPPXydWnhNav2P root@xiejun-server' >> /root/.ssh/authorized_keys && chmod 600 /root/.ssh/authorized_keys && echo "✅ 完成"
