Administrator
发布于 2026-11-03 / 3 阅读
0
0

手机搞定:甲骨文云 ARM 抢机脚本小白教程

适合人群:刚注册甲骨文云(Oracle Cloud)、想白嫖 2核12G ARM 服务器、但一直提示「容量不足」的小白。全程可以用手机 + Termius 完成,不需要电脑。

一、为什么需要抢机脚本

甲骨文云的永久免费额度很香:ARM 机型最高可以合计 2OCPU / 12GB 内存 / 200GB 硬盘,足够跑博客、监控、代理面板、各种自托管服务。

问题是热门区域(比如圣何塞)ARM 资源长期紧张,网页上点「创建实例」,基本都会看到:

Out of host capacity(主机容量不足)

手动一遍遍点不现实,因为别人释放资源的时间点不固定,可能是凌晨,也可能是你睡着的时候。所以思路很简单:写一个脚本,调用甲骨文的命令行工具,每隔一两分钟自动尝试创建一次,抢到就停。

脚本要放在一台 24 小时开机的服务器上跑。我用的是自己另一个区域的免费 AMD 小鸡(1GB 内存也够用),家里没电脑也无所谓。

二、开始前的准备

  1. 一个甲骨文云账号,并记住注册时选的主区域(Home Region)。免费的 ARM 机型只能开在主区域,注册后不能改。

  2. 一台能 SSH 登录的 Linux 服务器,用来跑脚本(Ubuntu 即可)。

  3. 手机上装好 Termius(或其他 SSH 工具),用来连接这台服务器。

  4. 打开甲骨文控制台时,手机浏览器建议开启「桌面版网站」,否则菜单会缺失。

关于区域的几点经验:

  • 只有一个可用性域(AD)的区域更难抢,圣何塞就是这种。

  • 有 3 个 AD 的区域(如法兰克福、伦敦、阿什本、凤凰城)相对容易,但热门区域人也多。

  • 区域选了就改不了,想换只能重新注册,而同一张卡、同一个手机号反复注册容易触发风控,不建议折腾。

  • 抢不到可以先降配:从 1核6G 开始抢,成功后再在控制台调大。

  • 新账号可以考虑升级为 PAYG(按量付费)。只要不超过免费额度就不会扣费,很多人升级后更容易抢到。

三、一步步部署

以下命令都在服务器上执行(用 Termius 连接)。

第 1 步:安装基础工具

sudo apt update && sudo apt install -y jq tmux nano curl python3-venv python3-pip

如果服务器只有 1GB 内存,先加 2G 的 swap,否则后面装命令行工具时可能被系统杀掉:

sudo fallocate -l 2G /swapfile && sudo chmod 600 /swapfile
sudo mkswap /swapfile && sudo swapon /swapfile

第 2 步:安装 OCI 命令行工具

小内存机器推荐用虚拟环境安装,省内存也不容易卡:

python3 -m venv ~/ocienv
~/ocienv/bin/pip install --no-cache-dir oci-cli
echo 'export PATH=$HOME/ocienv/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
oci --version

最后一条能显示版本号就算成功。安装过程在小机器上可能要等 5 到 10 分钟,看起来不动是正常的,耐心等。

第 3 步:获取两个 OCID

登录甲骨文控制台:

  • 右上角头像 → 我的个人资料,复制 User OCID

  • 右上角头像 → 租户,复制 Tenancy OCID

第 4 步:生成认证配置

oci setup config

按提示依次填写:

  • 配置文件位置:/root/.oci/config_sj(名字随意,用独立文件可以避免和其他账号混淆;非 root 用户换成自己的根目录)

  • User OCID、Tenancy OCID:粘贴上一步复制的

  • region:你的主区域,比如圣何塞是 us-sanjose-1

  • 是否生成新密钥:Y

  • 密钥目录:直接回车

  • 密钥名:sj_api_key

  • 密码:直接回车,不设密码"N /A"

然后让之后的命令都用这份配置,并写进 .bashrc 免得每次重设:

echo 'export OCI_CLI_CONFIG_FILE=~/.oci/config_sj' >> ~/.bashrc
echo 'export T=$(grep tenancy ~/.oci/config_sj | cut -d= -f2)' >> ~/.bashrc
source ~/.bashrc
echo $T

echo $T 应该打印出 ocid1.tenancy.oc1.. 开头的一长串,这个值后面要用。

第 5 步:把公钥上传到控制台

cat ~/.oci/sj_api_key_public.pem

复制整段输出(包含 BEGIN 和 END 两行),然后到控制台:头像 → 我的个人资料 → API 密钥 → 添加 API 密钥 → 粘贴公钥 → 添加。

测试认证是否成功:

oci iam availability-domain list --compartment-id $T

能返回类似 xxxx:US-SANJOSE-1-AD-1 的名字就说明账号和区域都对了。这个名字就是脚本里要填的可用性域。

第 6 步:准备脚本要填的参数

子网 ID:

oci network subnet list --compartment-id $T --query 'data[].{name:"display-name",id:id}'

如果返回空,说明还没有网络。去控制台:网络 → 虚拟云网络 → 启动 VCN 向导 → 创建具有互联网连接性的 VCN,全部默认,建好后再执行上面的命令。

镜像 ID(必须是 ARM 架构):

oci compute image list --compartment-id $T --operating-system "Canonical Ubuntu" --shape VM.Standard.A1.Flex --query 'data[].{n:"display-name",id:id}' --all

挑一个 Ubuntu 22.04 或 24.04 的,复制它的 id。

SSH 密钥(用来登录抢到的新机器):

ls ~/.ssh/*.pub

如果没有,就生成一对:

ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa -N ""

私钥 ~/.ssh/id_rsa 一定要备份好(可以用 Termius 的 SFTP 下载到手机),丢了就登不上新机器。

第 7 步:抢机脚本

把下面的脚本保存为 oci_arm_launch.sh。带 [改] 的地方要换成你自己的值。

#!/usr/bin/env bash
# 甲骨文云 ARM (VM.Standard.A1.Flex) 抢机脚本
# 依赖: oci-cli, jq

############ ↓↓↓ 需要修改的地方 ↓↓↓ ############

# [改] 1. 租户 OCID(第 4 步 echo $T 的结果)
COMPARTMENT_ID="ocid1.tenancy.oc1..xxxxxxxx"

# [改] 2. 可用性域名称(第 5 步查到的)
AVAILABILITY_DOMAIN="xxxx:US-SANJOSE-1-AD-1"

# [改] 3. 子网 OCID(第 6 步查到的,必须是公有子网)
SUBNET_ID="ocid1.subnet.oc1.us-sanjose-1.xxxxxxxx"

# [改] 4. 镜像 OCID(第 6 步查到的,必须是 ARM 镜像)
IMAGE_ID="ocid1.image.oc1.us-sanjose-1.xxxxxxxx"

# [改] 5. SSH 公钥路径(注意不要用 ~,用绝对路径或 $HOME)
SSH_PUBKEY_FILE="$HOME/.ssh/id_rsa.pub"

# [改] 6. 规格:免费额度上限合计 4 OCPU / 24GB,抢不到先降到 1 / 6
OCPUS=4
MEMORY_GB=24
DISK_GB=100

# [改] 7. 实例名
INSTANCE_NAME="arm-sanjose"

# [可选] 8. 重试间隔(秒),太频繁会被限流
SLEEP_MIN=60
SLEEP_MAX=120

# [可选] 9. Telegram 通知,不用就留空
TG_BOT_TOKEN=""
TG_CHAT_ID=""

############ ↑↑↑ 修改结束 ↑↑↑ ############

SHAPE="VM.Standard.A1.Flex"
SHAPE_CONFIG="{\"ocpus\":${OCPUS},\"memoryInGBs\":${MEMORY_GB}}"

notify() {
  [[ -z "$TG_BOT_TOKEN" || -z "$TG_CHAT_ID" ]] && return
  curl -s -X POST "https://api.telegram.org/bot${TG_BOT_TOKEN}/sendMessage" \
    -d chat_id="$TG_CHAT_ID" -d text="$1" >/dev/null
}

try=0
while true; do
  try=$((try+1))
  echo "[$(date '+%F %T')] 第 ${try} 次尝试..."

  out=$(oci compute instance launch \
    --compartment-id "$COMPARTMENT_ID" \
    --availability-domain "$AVAILABILITY_DOMAIN" \
    --subnet-id "$SUBNET_ID" \
    --image-id "$IMAGE_ID" \
    --shape "$SHAPE" \
    --shape-config "$SHAPE_CONFIG" \
    --boot-volume-size-in-gbs "$DISK_GB" \
    --display-name "$INSTANCE_NAME" \
    --assign-public-ip true \
    --ssh-authorized-keys-file "$SSH_PUBKEY_FILE" 2>&1)

  if echo "$out" | jq -e '.data.id' >/dev/null 2>&1; then
    id=$(echo "$out" | jq -r '.data.id')
    echo "[$(date '+%F %T')] 成功! 实例 OCID: $id"
    notify "OCI ARM 开机成功 ${INSTANCE_NAME} ${id}"
    exit 0
  fi

  if echo "$out" | grep -qi "Out of host capacity\|OutOfHostCapacity"; then
    echo "  -> 容量不足, 继续重试"
  elif echo "$out" | grep -qi "TooManyRequests\|429"; then
    echo "  -> 被限流(429), 多等一会"
    sleep 120
  elif echo "$out" | grep -qi "LimitExceeded"; then
    echo "  -> 配额超限, 请检查账号/已有实例:"
    echo "$out" | tail -n 5
    exit 1
  elif echo "$out" | grep -qi "NotAuthenticated\|NotAuthorized\|InvalidParameter\|NotFound"; then
    echo "  -> 配置有误, 请检查标注 [改] 的参数:"
    echo "$out" | tail -n 8
    exit 1
  else
    echo "  -> 其他错误:"
    echo "$out" | tail -n 5
  fi

  sleep $(( RANDOM % (SLEEP_MAX - SLEEP_MIN + 1) + SLEEP_MIN ))
done

在手机上怎么放到服务器:

  • 方法一:在服务器上执行 nano oci_arm_launch.sh,把改好的完整脚本粘贴进去,Ctrl+X → Y → 回车保存。

  • 方法二:用 Termius 的 SFTP 功能上传。

保存后先检查语法:

bash -n oci_arm_launch.sh

没有任何输出就是没问题。

第 8 步:后台运行

nohup bash oci_arm_launch.sh >> launch.log 2>&1 &

这样即使关掉 Termius,脚本也会继续跑,日志写在 launch.log 里。

注意:同一时间只跑一个脚本。 多开几个并行抢,成功时可能同时开出多台,超出免费额度。

四、日常维护

想做什么

命令

实时看日志(Ctrl+C 退出查看,不会停脚本)

tail -f launch.log

看最近 10 行

tail -n 10 launch.log

确认脚本还活着

pgrep -f oci_arm_launch.sh

已经试了多少次

grep -c "次尝试" launch.log

有没有成功

grep "成功" launch.log

停止脚本

pkill -f oci_arm_launch.sh

日志里一直刷「容量不足, 继续重试」是正常的,说明参数都对了,只是在等货。脚本每 1 到 2 分钟才试一次,所以每隔一两分钟才多一行,不是卡住。

抢到之后:

  1. 脚本会打印「成功! 实例 OCID」,然后自动退出,不会继续多开。

  2. 去控制台「计算 → 实例」找到公网 IP。

  3. 用下面的命令登录:

ssh -i ~/.ssh/id_rsa ubuntu@公网IP
  1. 如果开的是 1核6G,想升级可以在实例详情里修改配置,总量不超过 2核12G 即可。

五、注意事项汇总

  1. 区域选定后不能改,免费 ARM 只能开在主区域,选区前先看看别人的反馈。

  2. 私钥要保管好,API 私钥和 SSH 私钥都别发给任何人,SSH 私钥丢了就登不上新机器。

  3. 两种公钥别混:上传到控制台「API 密钥」里的是 API 公钥(sj_api_key_public.pem);脚本里填的是 SSH 公钥(id_rsa.pub)。

  4. 脚本里的路径不要用 ~,在引号里它不会被展开,请用绝对路径或 $HOME。

  5. 手机输入法会把直引号 " 改成弯引号 “ ”,粘贴脚本后一定先跑 bash -n 检查语法。

  6. 变量只在当前窗口有效,重连 SSH 后 $T 会消失,所以前面建议写进 .bashrc。

  7. 小内存机器装 oci-cli 很慢,加 swap 并耐心等,别手滑中断。

  8. 只跑一个脚本,避免成功时多开机器超出免费额度。

  9. 请求别太频繁,间隔建议 60 秒以上,太快会被限流(429)。

  10. 区分报错类型:「容量不足」是正常的,继续等;「配额超限」「认证失败」「参数无效」说明账号或配置有问题,抢机无效,需要检查。

  11. 新账号可能受限,如果 AMD 和 ARM 都开不出来,除了容量问题,也可能是账号风控,可以尝试升级 PAYG,或者提工单。

  12. 养成回来看看的习惯,隔一阵子去控制台看下实例列表,确认机器是否已经创建成功。

六、写在最后

抢机本质上就是「把手动点击自动化」,脚本本身不复杂,难点都在环境配置:认证、网络、镜像、密钥。只要一步步走完,剩下的就是耐心等。

挂上几天,大概率能抢到。祝各位早日开出自己的 2核12G。


评论