适合人群:刚注册甲骨文云(Oracle Cloud)、想白嫖 2核12G ARM 服务器、但一直提示「容量不足」的小白。全程可以用手机 + Termius 完成,不需要电脑。
一、为什么需要抢机脚本
甲骨文云的永久免费额度很香:ARM 机型最高可以合计 2OCPU / 12GB 内存 / 200GB 硬盘,足够跑博客、监控、代理面板、各种自托管服务。
问题是热门区域(比如圣何塞)ARM 资源长期紧张,网页上点「创建实例」,基本都会看到:
Out of host capacity(主机容量不足)
手动一遍遍点不现实,因为别人释放资源的时间点不固定,可能是凌晨,也可能是你睡着的时候。所以思路很简单:写一个脚本,调用甲骨文的命令行工具,每隔一两分钟自动尝试创建一次,抢到就停。
脚本要放在一台 24 小时开机的服务器上跑。我用的是自己另一个区域的免费 AMD 小鸡(1GB 内存也够用),家里没电脑也无所谓。
二、开始前的准备
一个甲骨文云账号,并记住注册时选的主区域(Home Region)。免费的 ARM 机型只能开在主区域,注册后不能改。
一台能 SSH 登录的 Linux 服务器,用来跑脚本(Ubuntu 即可)。
手机上装好 Termius(或其他 SSH 工具),用来连接这台服务器。
打开甲骨文控制台时,手机浏览器建议开启「桌面版网站」,否则菜单会缺失。
关于区域的几点经验:
只有一个可用性域(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 $Techo $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 里。
注意:同一时间只跑一个脚本。 多开几个并行抢,成功时可能同时开出多台,超出免费额度。
四、日常维护
日志里一直刷「容量不足, 继续重试」是正常的,说明参数都对了,只是在等货。脚本每 1 到 2 分钟才试一次,所以每隔一两分钟才多一行,不是卡住。
抢到之后:
脚本会打印「成功! 实例 OCID」,然后自动退出,不会继续多开。
去控制台「计算 → 实例」找到公网 IP。
用下面的命令登录:
ssh -i ~/.ssh/id_rsa ubuntu@公网IP如果开的是 1核6G,想升级可以在实例详情里修改配置,总量不超过 2核12G 即可。
五、注意事项汇总
区域选定后不能改,免费 ARM 只能开在主区域,选区前先看看别人的反馈。
私钥要保管好,API 私钥和 SSH 私钥都别发给任何人,SSH 私钥丢了就登不上新机器。
两种公钥别混:上传到控制台「API 密钥」里的是 API 公钥(
sj_api_key_public.pem);脚本里填的是 SSH 公钥(id_rsa.pub)。脚本里的路径不要用
~,在引号里它不会被展开,请用绝对路径或$HOME。手机输入法会把直引号
"改成弯引号 “ ”,粘贴脚本后一定先跑bash -n检查语法。变量只在当前窗口有效,重连 SSH 后
$T会消失,所以前面建议写进.bashrc。小内存机器装 oci-cli 很慢,加 swap 并耐心等,别手滑中断。
只跑一个脚本,避免成功时多开机器超出免费额度。
请求别太频繁,间隔建议 60 秒以上,太快会被限流(429)。
区分报错类型:「容量不足」是正常的,继续等;「配额超限」「认证失败」「参数无效」说明账号或配置有问题,抢机无效,需要检查。
新账号可能受限,如果 AMD 和 ARM 都开不出来,除了容量问题,也可能是账号风控,可以尝试升级 PAYG,或者提工单。
养成回来看看的习惯,隔一阵子去控制台看下实例列表,确认机器是否已经创建成功。
六、写在最后
抢机本质上就是「把手动点击自动化」,脚本本身不复杂,难点都在环境配置:认证、网络、镜像、密钥。只要一步步走完,剩下的就是耐心等。
挂上几天,大概率能抢到。祝各位早日开出自己的 2核12G。