请输入图片描述

⚡ 第一步:一键全自动配置脚本

通过默认用户登录,执行 sudo -i 切换到 root 权限,然后直接复制运行以下整段命令:

# ====================================================================
# 1. 终极清洗:彻底抹除密钥文件中任何包含 "Please login" 的强制拦截命令
#    原理解析:AWS 会在 /root/.ssh/authorized_keys 的公钥前加入 command 限制,
#    如果不清除,无论 SSH 怎么配,登录 root 时都会被直接执行 echo 并强行断开。
# ====================================================================
if [ -f /root/.ssh/authorized_keys ]; then
    # 暴力抹除:利用正则兼容通杀 admin, ubuntu 等所有默认用户的拦截小尾巴
    sed -i 's/no-port-forwarding,no-agent-forwarding,no-X11-forwarding,command="echo '\''Please login as the user \\"[a-zA-Z0-9]*\\" rather than the user \\"root\\".'\'';exit 1" //g' /root/.ssh/authorized_keys
    sed -i 's/command="echo.*root.*exit 1" //g' /root/.ssh/authorized_keys
fi

# ====================================================================
# 2. 配置 SSH 主文件:允许 Root 密码登录
# ====================================================================
sed -i 's/^.*PermitRootLogin.*/PermitRootLogin yes/g' /etc/ssh/sshd_config
sed -i 's/^.*PasswordAuthentication.*/PasswordAuthentication yes/g' /etc/ssh/sshd_config

# ====================================================================
# 3. 清理覆盖规则:彻底删除子目录下所有高优先级的云平台限制文件
#    原理解析:现代 SSH 会优先加载 /etc/ssh/sshd_config.d/ 目录下所有随机命名的 .conf 文件。
#    如果不直接 rm 掉,子文件里的 "PermitRootLogin no" 会直接覆盖主配置。
# ====================================================================
rm -f /etc/ssh/sshd_config.d/*.conf

# ====================================================================
# 4. 固化 cloud-init 配置:禁止云平台在后台自动还原 root 锁定
# ====================================================================
if [ -f /etc/cloud/cloud.cfg ]; then
    # 解锁 cloud-init 对 root 账户的封锁
    sed -i 's/disable_root: true/disable_root: false/g' /etc/cloud/cloud.cfg
    sed -i 's/disable_root: 1/disable_root: 0/g' /etc/cloud/cloud.cfg
    # 防止 cloud-init 在系统重启或遭遇宿主机迁移时自动抹除你的 SSH 密钥
    sed -i 's/ssh_deletekeys: true/ssh_deletekeys: false/g' /etc/cloud/cloud.cfg 2>/dev/null
fi

# ====================================================================
# 5. 强制刷新:清理 cloud-init 历史缓存,重启 SSH 服务使配置立刻生效
# ====================================================================
cloud-init clean 2>/dev/null
systemctl restart sshd || systemctl restart ssh

# ====================================================================
# 6. 设置并激活你的 Root 密码
#    ⚠️ 提示:请将下面的 "你的新密码" 替换为你实际想设置的密码
# ====================================================================
echo "root:你的新密码" | chpasswd

🔍 第二步:核心原理解析

普通的 Linux 服务器只需修改 sshd_config,但在 AWS Lightsail 上,云厂商为了安全设置了三道防线,这也是为什么过段时间就会失效的原因:

[客户端尝试 Root 登录]
         │
         ▼
 🛡️ 防线 1:密钥文件限制 (/root/.ssh/authorized_keys)
         ├── 如果含有 `command="echo 'Please login...' ; exit 1"`
         └── 🔴 直接拦截断开!(优先级别最高)
         │
         ▼
 🛡️ 防线 2:SSH 子配置目录 (/etc/ssh/sshd_config.d/*.conf)
         ├── 厂商会放入随机命名的文件(如 50-cloud-init.conf)
         └── 🔴 内含 `PermitRootLogin no`,覆盖主配置!
         │
         ▼
 🛡️ 防线 3:云初始化守护进程 (cloud-init)
         ├── 即使你前面全改好了,系统后台更新或重启时,
         └── 🔴 如果 `disable_root: true` 没改,会重新生成整套限制配置!

🧪 第三步:安全验证(非常重要)

  1. 绝对不要关闭当前已经连上的这个 SSH 窗口!(留作紧急备用通道)
  2. 打开一个新的 SSH 客户端窗口,尝试用 root 用户和你刚刚设置的密码进行登录。
  3. 如果新窗口登录成功,说明当前配置有效。接着在 root 权限下执行一次重启服务器测试:

    reboot
  4. 等待 1 分钟服务器重启完毕后,再次尝试用 root 密码登录。如果依然秒进,说明三道防线已被全线瓦解,配置完美固化!

本教程适用于将 Microsoft 365 E5 开发者订阅(MSDN)的 5TB OneDrive 空间挂载为 Linux 本地磁盘。当然也适用其他版本的空间挂载,但是需要自己根据实际情况做出修改。

请输入图片描述

一、 基础准备在开始之前,请确保你拥有 MSDN 管理员账号,并在 Linux 服务器上安装 fuse3(挂载必需依赖)。

# 1. 安装 Rclone
curl https://rclone.org/install.sh | sudo bash
# 2. 安装 FUSE 依赖
# Ubuntu / Debian:
apt update && apt install -y fuse3
# CentOS / AlmaLinux:
yum install -y fuse3
# 3. 修正 FUSE 权限配置(允许非 root 用户访问)
sed -i 's/#user_allow_other/user_allow_other/g' /etc/fuse.conf

二、 Rclone 配置步骤

执行 rclone config
按照以下逻辑操作:n) New remote: 输入名称 onedrive
Storage Type: 输入 42 (Microsoft OneDrive)
client_id/client_secret: 直接回车跳过
region: 输入 1 (global)
Edit advanced config: 输入 n
Use auto config: 输入 n (因为是远程服务器)获取
Token:在你的本地电脑

  • (Windows/Mac)下载 Rclone。
  • 在本地终端运行:rclone authorize "onedrive"
  • 浏览器弹出授权,登录 MSDN 账号并确认。
  • 将本地终端生成的 {"access_token":...} 整个 JSON 字符串复制。回到服务器粘贴。

config_type: 输入 1 (OneDrive Personal or Business)
Drive Selection: 搜索到 5TB 盘后,输入序号 0。
Confirm: 输入 y 确认,最后输入 q 退出。

三、 手动挂载测试创建挂载点并尝试手动挂载,确认没有报错:

# 创建挂载点
mkdir -p /mnt/onedrive

# 手动挂载命令(测试用)
rclone mount onedrive:/ /mnt/onedrive \
  --vfs-cache-mode writes \
  --vfs-cache-max-size 50G \
  --allow-other \
  --header "Referer:https://onedrive.live.com/" \
  --vfs-read-chunk-size 16M \
  --vfs-read-chunk-size-limit 1G \
  --buffer-size 64M \
  --daemon

使用 df -h 查看是否出现了 5TB 的磁盘。

四、 配置开机自动挂载 (Systemd)为了保证服务器重启后自动挂载,建议配置系统服务。

1. 创建服务文件

nano /etc/systemd/system/rclone.service

2. 粘贴以下内容(请确保 /usr/bin/rclone 路径正确,可用 which rclone 查看)

[Unit]
Description=Rclone OneDrive Mount
After=network-online.target

[Service]
Type=simple
# 核心挂载命令
ExecStart=/usr/bin/rclone mount onedrive:/ /mnt/onedrive \
    --vfs-cache-mode writes \
    --vfs-cache-max-size 50G \
    --vfs-cache-max-age 24h \
    --allow-other \
    --header "Referer:https://onedrive.live.com/" \
    --vfs-read-chunk-size 16M \
    --vfs-read-chunk-size-limit 1G \
    --buffer-size 64M \
    --dir-cache-time 5m \
    --low-level-retries 10
# 停止时卸载
ExecStop=/bin/fusermount3 -qzu /mnt/onedrive
Restart=on-failure
RestartSec=10
User=root

[Install]
WantedBy=multi-user.target

3. 启用服务

//先卸载之前手动挂载的路径
fusermount3 -qzu /mnt/onedrive
//启用并启动服务
systemctl daemon-reload
systemctl enable rclone
systemctl start rclone
//检查状态
systemctl status rclone

五、 常用维护指令汇总

目的                        命令

验证 5TB 容量 rclone about onedrive:
查看实时挂载日志 journalctl -u rclone -f
重启挂载服务 systemctl restart rclone
强制卸载挂载点 fusermount3 -qzu /mnt/onedrive
清空 OneDrive 回收站 建议去网页端操作,可释放 Trashed 占用的配额

请输入图片描述

本教程介绍如何在 Linux 服务器使用 Docker 部署

thenetsky/microsoft-rewards-script 自动完成 Microsoft Rewards 搜索任务。

先决条件

你需要先安装:docker + compose

安装过程

先获取脚本

git clone https://github.com/TheNetsky/Microsoft-Rewards-Script.git
cd Microsoft-Rewards-Script

添加配置和账号

· 将 src/accounts.example.json复制或重命名为 src/accounts.json 并添加您的凭证
· 复制或重命名 src/config.example.jsonsrc/config.json 并自定义你的偏好设置

accounts.json
[
    {
        "email": "微软账户",
        "password": "密码",
        "totpSecret": "",
        "recoveryEmail": "",
        "geoLocale": "CN",
        "langCode": "zh-CN",
        "proxy": {
            "proxyAxios": false,
            "url": "",
            "port": 0,
            "username": "",
            "password": ""
        },
        "saveFingerprint": {
            "mobile": true,
            "desktop": true
        }
    },
    {
        "email": "微软账户2",
        "password": "密码",
        "totpSecret": "",
        "recoveryEmail": "",
        "geoLocale": "CN",
        "langCode": "zh-CN",
        "proxy": {
            "proxyAxios": false,
            "url": "",
            "port": 0,
            "username": "",
            "password": ""
        },
        "saveFingerprint": {
            "mobile": true,
            "desktop": true
        }
    }
]
config.json
{
    "baseURL": "https://rewards.bing.com",
    "sessionPath": "sessions",
    "headless": true,
    "clusters": 1,
    "errorDiagnostics": false,
    "workers": {
        "doDailySet": true,
        "doSpecialPromotions": true,
        "doMorePromotions": true,
        "doPunchCards": true,
        "doAppPromotions": true,
        "doDesktopSearch": true,
        "doMobileSearch": true,
        "doDailyCheckIn": true,
        "doReadToEarn": true
    },
    "searchOnBingLocalQueries": false,
    "globalTimeout": "30sec",
    "searchSettings": {
        "scrollRandomResults": false,
        "clickRandomResults": false,
        "parallelSearching": true,
        "queryEngines": ["google", "wikipedia", "reddit", "local"],
        "searchResultVisitTime": "10sec",
        "searchDelay": {
            "min": "30sec",
            "max": "1min"
        },
        "readDelay": {
            "min": "30sec",
            "max": "1min"
        }
    },
    "debugLogs": false,
    "consoleLogFilter": {
        "enabled": false,
        "mode": "whitelist",
        "levels": ["error", "warn"],
        "keywords": ["starting account"],
        "regexPatterns": []
    },
    "proxy": {
        "queryEngine": true
    },
    "webhook": {
        "discord": {
            "enabled": false,
            "url": ""
        },
        "ntfy": {
            "enabled": false,
            "url": "",
            "topic": "",
            "token": "",
            "title": "Microsoft-Rewards-Script",
            "tags": ["bot", "notify"],
            "priority": 3
        },
        "webhookLogFilter": {
            "enabled": false,
            "mode": "whitelist",
            "levels": ["error"],
            "keywords": ["starting account", "select number", "collected"],
            "regexPatterns": []
        }
    }
}

重命名compose.yaml为compose.yaml1,然后nano compose.yaml

services:
  microsoft-rewards-script:
    image: ghcr.nju.edu.cn/thenetsky/microsoft-rewards-script:latest
    container_name: microsoft-rewards-script
    restart: unless-stopped
    volumes:
      - /root/Microsoft-Rewards-Script/src:/usr/src/microsoft-rewards-script/dist/config
      - /root/Microsoft-Rewards-Script/sessions:/usr/src/microsoft-rewards-script/dist/browser/sessions
      - /root/.cache/ms-playwright:/usr/src/microsoft-rewards-script/node_modules/patchright-core/.local-browsers
    environment:
      - TZ=Asia/Shanghai
      - NODE_ENV=production
      # 每天早上7点执行
      - CRON_SCHEDULE=0 7 * * *
      # 容器启动立即执行一次
      - RUN_ON_START=true
      # 是否跳过随机等待
      - SKIP_RANDOM_SLEEP=false
      # 浏览器路径
      - PATCHRIGHT_BROWSERS_PATH=/usr/src/microsoft-rewards-script/node_modules/patchright-core/.local-browsers
    healthcheck:
      test: ["CMD", "sh", "-c", "pgrep cron > /dev/null || exit 1"]
      interval: 60s
      timeout: 10s
      retries: 3
      start_period: 30s
    security_opt:
      - no-new-privileges:true
建议这三个文件都使用文章提供的

启动容器

docker compose up -d
如果可以,建议安装好Portainer -ce面板,方便查看日志
docker volume create portainer_data
    docker run -d \
        -p 9000:9000 \
        --name portainer \
        --restart=always \
        -v /var/run/docker.sock:/var/run/docker.sock \
        -v portainer_data:/data \
        portainer/portainer-ce:latest

可能出现的问题

提示未安装浏览器

Executable doesn't exist

方法一 宿主机直接安装

npmmirror:

export PLAYWRIGHT_DOWNLOAD_HOST=https://npmmirror.com/mirrors/playwright

华为云镜像:

export PLAYWRIGHT_DOWNLOAD_HOST=https://mirrors.huaweicloud.com/playwright

安装浏览器:

npx patchright install chromium

浏览器会下载到:

~/.cache/ms-playwright

查看:

ls ~/.cache/ms-playwright

正常应该看到:

chromium-xxxx
chromium_headless_shell-xxxx

Docker 会通过挂载使用该浏览器。

docker安装浏览器

一条命令搞定

docker exec -it -e PATCHRIGHT_DOWNLOAD_HOST=https://npmmirror.com/mirrors/playwright/ microsoft-rewards-script npx patchright install

如果出现Missing libraries

安装过程中可能会出现网络慢的情况,我们更新一下源就行了

docker exec -it -u root microsoft-rewards-script sh -c "sed -i 's/deb.debian.org/mirrors.aliyun.com/g' /etc/apt/sources.list.d/debian.sources && apt-get update"

docker安装方式:

docker exec -it microsoft-rewards-script npx patchright install-deps

宿主机安装方式:

docker exec -it microsoft-rewards-script npx patchright install-deps

如果没有安装nodejs那么就用这个

sudo apt-get update && sudo apt-get install -y \
    libgbm1 libasound2 libpango-1.0-0 liblibcairo2 libicu72 \
    libnss3 libxcursor1 libxss1 libxcomposite1 libxdamage1 \
    libxrandr2 libxtst6 libatk1.0-0 libatk-bridge2.0-0 \
    libgtk-3-0 libx11-xcb1 libxcb-dri3-0 libdrm2 libvpx7