20个域名要在宝塔上建站,手动点20次添加站点还得一个个输数据库密码,有能一条命令搞定的脚本吗?
手上有10个、20个甚至50个域名要在宝塔上建站,如果按常规操作——打开宝塔面板 → 点"添加站点" → 输入域名 → 选PHP版本 → 创建数据库 → 点提交 → 等几秒 → 再重复以上步骤——一个站大概要花1-2分钟。20个站就是半小时起步。中间还不算输错数据库密码、忘选伪静态、域名填漏了www版本这些意外情况。
其实宝塔从7.5版本开始就内置了批量建站功能,而且面板还开放了完整的API接口。一旦搞清楚这两条路,10个站、50个站的建站流程可以压缩到几十秒内完成,每个站的配置都是标准化的,不存在手滑点错的问题。
宝塔一键建站的三种实现路径
| 1 | 宝塔内置批量建站:面板自带功能,不需要写代码,复制粘贴域名列表就行。适合建站格式统一的场景,比如全部是WordPress站、PHP版本都一样 |
| 2 | Shell脚本调用API:通过curl命令调宝塔API,适合Linux服务器上的自动化运维,可以集成到部署流水线里 |
| 3 | Python脚本调用API:灵活性最高,支持批量操作、错误处理、结果验证,适合需要深度定制的场景 |
一、宝塔内置批量建站:最简单,有手就行
宝塔7.5.27版本之后,网站管理页面右上角多了一个"批量创建"按钮。点进去,一个文本框,按照固定格式输入域名和路径,就能一次创建多个站点。
格式是每行一个站点:域名:网站根目录:PHP版本:FTP:数据库:数据库用户名:数据库密码。如果某项不需要,留空即可。最常用的用法是只填域名和PHP版本,让宝塔自动生成根目录和数据库。
# 批量建站格式(每行一个站)# 域名:根目录:PHP版本:FTP:数据库:数据库用户名:数据库密码# 最简用法——只指定域名和PHP版本site1.com: :74: :MySQL: : :www.site2.com: :74: :MySQL: : :# 完整用法——自定义所有参数site3.com:/www/wwwroot/site3:74:true:MySQL:site3_user:MyPass@123批量建站文本框的填写要点
· PHP版本写法:7.4写74、8.0写80、8.1写81,纯静态站点写00或不填

· 数据库密码留空:留空宝塔会自动生成随机密码。手动填容易设弱密码,反而不安全
· 域名要写完整:www和非www版本是独立的,建议两个都写上
· 根目录留空更省心:宝塔会自动在/www/wwwroot/下以域名创建目录,比手动指定更规范
· 建完后检查:到网站列表逐一检查域名绑定、PHP版本、数据库是否创建成功
内置批量建站的局限也很明显:只能按固定模板创建,不能自定义伪静态、不能自动申请SSL、不能上传网站源码。如果建完还需要手动一个一个去设置伪静态和证书,省下的时间又还回去了。
二、Shell脚本调API:先搞定签名,剩下就是curl的事了
宝塔API的调用分两步:生成签名 → 发POST请求。签名是门槛,也是最多人卡住的地方。打开宝塔面板 → 设置 → API接口,点"开启",复制接口密钥(api_sk)。然后用这个公式生成签名:
宝塔API签名生成公式(v11+版本)
· request_token = SHA256( request_time + request_rand + api_sk )
· request_time:当前Unix时间戳(秒)
· request_rand:随机字符串,建议用uuid或随机8位字母数字。服务器时间和宝塔面板时间必须同步,误差超过30秒签名会失效
创建站点的API接口是 /site?action=AddSite,参数包括域名、路径、PHP版本、端口、伪静态等。下面是完整的Shell批量建站脚本:
#!/bin/bash# 宝塔API一键建站脚本BT_URL="http://你的服务器IP:8888"API_SK="你的接口密钥"DOMAINS=("site1.com" "site2.com" "site3.com")for DOMAIN in "${DOMAINS[@]}"; do# 每次请求重新生成签名REQUEST_TIME=$(date +%s)REQUEST_RAND=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | head -c 8)REQUEST_TOKEN=$(echo -n "${REQUEST_TIME}${REQUEST_RAND}${API_SK}" | sha256sum | awk '{print $1}')echo "正在创建: ${DOMAIN}"RESPONSE=$(curl -s -X POST "${BT_URL}/site?action=AddSite" -d "request_time=${REQUEST_TIME}" -d "request_rand=${REQUEST_RAND}" -d "request_token=${REQUEST_TOKEN}" -d "webname={"domain":"${DOMAIN}","domainlist":[],"count":0}" -d "path=/www/wwwroot/${DOMAIN}" -d "type=PHP" -d "version=74" -d "port=80" -d "ps=wordpress" -d "ftp=false" -d "sql=true" -d "codeing=utf8")echo "结果: ${RESPONSE}"echo "---"sleep 1doneecho "全部站点创建完成"Shell脚本调API容易出错的三个地方
· 签名每次都要重新生成:很多人以为算一次就够了,实际上每个请求的request_time和request_rand都不同,token必须重新算。循环里没重算签名是最高频的错误
· webname参数格式:不是直接传域名字符串,要传JSON对象。传错了返回"域名格式错误"
· IP白名单:宝塔API密钥默认只允许127.0.0.1。如果在另一台机器上远程调用,记得把调用方IP加到白名单
三、Python脚本调API:加了错误处理和结果验证,批量跑更稳
Shell适合快速验证,但如果要建50个站、要检查每个站的结果、要处理失败重试,Python是更合适的选择。核心逻辑一样——签名+POST,但多了结构化数据处理和异常处理。
#!/usr/bin/env python3import hashlib, time, uuid, requests, json, random, stringBT_URL = "http://你的服务器IP:8888"API_SK = "你的接口密钥"def get_sign():rt = str(int(time.time()))rr = str(uuid.uuid4())token = hashlib.sha256((rt + rr + API_SK).encode()).hexdigest()return rt, rr, tokendef create_site(domain, php_version="74", ps_rule="wordpress"):rt, rr, token = get_sign()db_pass = ''.join(random.choices(string.ascii_letters + string.digits, k=16))data = {"request_time": rt, "request_rand": rr, "request_token": token,"webname": json.dumps({"domain": domain, "domainlist": [], "count": 0}),"path": f"/www/wwwroot/{domain}","type": "PHP", "version": php_version, "port": "80","ps": ps_rule, "ftp": "false", "sql": "true", "codeing": "utf8",}try:resp = requests.post(f"{BT_URL}/site?action=AddSite", data=data, timeout=30)result = resp.json()return {"domain": domain, "db_pass": db_pass,"status": "ok" if result.get("status") else "fail","msg": result.get("msg", ""),}except Exception as e:return {"domain": domain, "status": "error", "msg": str(e)}def batch_create(domains):results = []for i, domain in enumerate(domains, 1):print(f"[{i}/{len(domains)}] {domain} ...", end=" ")r = create_site(domain)print(f"{'OK' if r['status']=='ok' else 'FAIL'} {r['msg']}")results.append(r)time.sleep(1)ok = sum(1 for r in results if r["status"] == "ok")print(f"总计 {len(domains)} | 成功 {ok} | 失败 {len(domains)-ok}")with open("bt_sites_result.json", "w", encoding="utf-8") as f:json.dump(results, f, ensure_ascii=False, indent=2)print("结果已保存至 bt_sites_result.json")return resultsif __name__ == "__main__":batch_create(["site1.com", "site2.com", "site3.com"])Python版本比Shell多做了几件事:自动生成数据库密码、结构化记录每个站的创建结果(成功/失败/密码全保存到JSON)、try-except兜底异常(网络超时不会中断整个流程)。这些在批量操作里都是刚需。
Python脚本可以扩展的能力
· 建站+SSL一步到位:建站成功后调 /site?action=SetSSL 批量申请Let's Encrypt证书

· 建站+上传源码:建站完成后自动解压WordPress或网站源码到对应目录
· 建站+DNS解析:域名托管在阿里云或腾讯云的,建站后自动添加A记录解析
· 多服务器并行:3台服务器各建20个站,多线程同时调3个BT_URL,速度翻三倍
四、三种方案怎么选?看站数和定制需求
| 对比维度 | 内置批量建站 | Shell脚本 | Python脚本 |
|---|---|---|---|
| 上手难度 | 零门槛 | 需要Linux基础 | 需要Python基础 |
| 单次建站数量 | 10个以内最合适 | 10-50个 | 50+也没问题 |
| 自定义程度 | 只能设PHP版本和数据库 | 可自定义API全部参数 | 完全自由,可扩展 |
| 错误处理 | 手动逐一检查 | 需自己写日志 | 自动记录、可重试 |
| SSL证书 | 需手动逐个申请 | 可追加API调用 | 一键集成 |
| 多服务器 | 需分别登录 | 需分别SSH | 多线程并行调用 |
选内置批量建站
一次建3-5个站 / 所有站配置一样 / 不想写代码 / 建完还需要手动设置伪静态和SSL
选Shell脚本
服务器上跑 / 需要自定义数据库参数 / 想集成到CI/CD / 熟悉Linux命令行
选Python脚本
站多(20+)/ 需要建站+SSL+上传一条龙 / 多服务器并行 / 需要结构化结果记录
五、建完站之后别忘了这些步骤
一键建站只是把站点框架搭好了,离"能用"还差几步。下面这几个操作,不管用哪种方式建站,都建议在脚本里一并处理掉。
设置伪静态规则
WordPress站必须设置伪静态,否则文章页全部404。API参数 ps=wordpress 可以在建站时同步设置,忘了就调 /site?action=SetPsr 补上
申请SSL证书
调 /site?action=SetSSL 申请Let's Encrypt免费证书。域名必须先解析到服务器IP,否则证书验证会失败
开放防火墙端口
宝塔默认开放80和443端口,但如果服务器有额外的云服务商安全组,需要手动放行。这个API管不到
上传网站源码
建站API只创建框架,不部署程序。站群管理可以用UC建站系统的源码模板功能,把标准化的WordPress配置打包成模板,建站后自动部署
六、站群场景下的建站效率差距
做站群的话,10个站、20个站甚至更多,手动建站和脚本建站的效率差距不是几倍,是数量级的差距。
| 操作环节 | 手动操作(单个站) | 脚本批量(20个站总计) |
|---|---|---|
| 创建站点 | 约2分钟 | 约25秒 |
| 设置伪静态 | 约30秒 | 建站时同步完成 |
| 申请SSL | 约1分钟 | 约30秒(并行) |
| 上传源码 | 约5分钟 | 模板部署约1分钟 |
| 安装WordPress | 约3分钟 | 预设配置自动完成 |
| 20个站总耗时 | 约230分钟(近4小时) | 约2分钟 |
这个对比还没算上手动容易出错的情况——数据库密码输错、域名少绑www版本、伪静态忘设置导致全站404、SSL漏申请导致浏览器报不安全。这些错误在手动操作20个站的过程中几乎必然出现,脚本不会。
持续扩展站群的系统化方案
如果每周都有新域名要建站、每批站配置要求相同——手动或临时写脚本会很快跟不上节奏。UC建站系统把建站流程固化成了产品能力:站点模板预设好WordPress版本、PHP版本、伪静态、插件列表、主题配置,新站一键套用;建站完成后自动触发百度API推送和IndexNow通知;多站看板上能统一查看每个站点的部署状态和运行情况
关键是独立部署——每个站独立IP、独立数据库、独立模板配色,建站脚本可以统一调度但输出结果是完全隔离的
宝塔面板+API的组合,已经足够覆盖90%以上的批量建站场景了。内置批量建站适合起步阶段,Shell脚本适合日常运维,Python脚本适合深度定制。选哪个方案取决于你当前站的数量和定制需求——但不管是哪个方案,告别手动一个个点"添加站点"的重复劳动,这个转变越早做越划算。
