kssh 完整使用手册
kssh 完整使用手册#
7 个 SSH 子命令 + 60 个宝塔子命令的完整 API 参考 + 实战 playbook
一、SSH 子命令 (7 个)#
kssh exec <target> -- <cmd>#
远程执行命令。target 格式 user@host,-- 后是要跑的 shell 命令(可多次)。
# 单条命令
kssh exec root@139.224.208.63 -- df -h
# 复杂命令 (bash -c 包裹)
kssh exec root@139 -- bash -c 'cd /tmp && tar xzf app.tgz && ./install.sh'
# 多条命令
kssh exec root@139 -- bash -c "systemctl restart nginx && curl localhost"
注意: shell 走 bash 解释, 引号用 \" 转义, 或者用 cat > /tmp/script.sh && kssh put 上传脚本后再 bash /tmp/script.sh。
kssh put <target> <local> <remote>#
上传文件或目录。
kssh put root@139 /tmp/app.tgz /www/wwwroot/app/app.tgz # 单文件
kssh put root@139 ./dist/ /var/www/html/ # 递归目录
kssh put root@139 /tmp/x /tmp/x --preserve # 保留 mtime
kssh get <target> <remote> <local>#
下载文件或目录。
kssh get root@139 /etc/nginx/nginx.conf ./nginx.conf
kssh get root@139 /var/log/nginx/ ./logs/ # 递归
kssh get root@139 /tmp/x.tgz ./x.tgz --preserve # 保留 mtime
kssh ls <target> <path>#
列远程目录, 类 ls -la。
kssh ls root@139 /www/wwwroot/
kssh ls root@139 /var/log/ --depth=3
kssh cp <target> <src> <dst>#
远程拷贝, 走 SFTP 协议。
kssh cp root@139 /tmp/a.log /var/log/b.log
kssh cp root@139 /etc/nginx/ /etc/nginx.bak/ # 整目录
kssh which <target> <bin>#
查远程命令路径, 走 which/type -a/command -v。
kssh which root@139 python3
# → /www/server/python_manager/versions/3.9.25/bin/python3
# → /usr/bin/python3
kssh ping <target>#
快速测连 + 主机信息(OS / 内核 / uptime / 内存 / CPU)。
kssh ping root@139.224.208.63
二、宝塔子命令 (60 个, 9 大类)#
1. 系统总览 (7)#
| 子命令 | 端点 | 作用 |
|---|---|---|
system | /system?action=GetSystemTotal | 系统/版本/启动时间 |
disk | /system?action=GetDiskInfo | 磁盘分区表 |
cpu | /system?action=GetCpuInfo | CPU 型号/核数/频率 |
mem | /system?action=GetMemInfo | 内存详情 |
boot | /system?action=GetAllInfo | 启动时间 + 综合信息(兜底用) |
net | /system?action=GetNetWork | 实时网卡流量 |
load | /system?action=GetLoadAverage | 1/5/15 分钟负载 |
2. 软件 / 服务 (5)#
| 子命令 | 用法 |
|---|---|
soft-list | 列出已装服务 (nginx/redis/mysql...) |
service <name> <action> | 控制服务: kssh bt ... service nginx reload |
re-web | 重载 nginx/ap(httpd) |
install-lib <lib> --version=<v> | 装服务: install-lib lib=redis version=7.0 |
uninstall-lib <lib> | 卸服务 |
3. 站点 (19)#
| 子命令 | 端点 / 用法 | ||
|---|---|---|---|
sites [--search=foo] [--limit=50] | 站点列表 (走 /data?table=sites) | ||
site-add <webname> <path> [--kind=Python] [--php-ver=00] [--ps=desc] | 建站, kind 决定项目类型 | ||
site-del <id> <webname> [--ftp] [--database] [--path] | 删站 | ||
site-cmd <webname> <action> | 启/停/重载 (action=start\ | stop\ | reload) |
site-ssl <webname> | 站点证书状态 | ||
site-php <webname> --version=00 | 改 PHP 版本 | ||
site-301 <webname> <target> | 301 重定向 | ||
site-limit <webname> --perserver=10 --limit=100 | 流量限制 (KB/s) | ||
proxy-list <webname> | 反向代理列表 | ||
backup <webname> | 创建备份 | ||
backup-list <webname> | 备份列表 | ||
run-path <webname> <path> | 站点运行目录 | ||
conf-get <webname> | 读 nginx conf | ||
conf-set <webname> --file <path> | 写 nginx conf | ||
rewrite-list | 预定义伪静态 | ||
rewrite-get <webname> | 读伪静态 | ||
php-ver | 已装 PHP 版本列表 |
4. 数据库 (4)#
| 子命令 | 端点 | 说明 |
|---|---|---|
db-list | /data?table=databases | 数据库列表 |
db-add <name> <user> <pass> [--charset=utf8mb4] | /database?action=AddDatabase | 创建 |
db-del <name> | /database?action=DeleteDatabase | 删除 |
db-root-pwd | /database?action=GetPassword | 查 root 密码 |
5. FTP (4)#
| 子命令 | 说明 |
|---|---|
ftp-list (/data?table=ftps) | FTP 账号列表 |
ftp-add <user> <pass> <path> | 创建 |
ftp-del <user> | 删除 |
ftp-status <user> <status> | 启/停 |
6. SSL 证书 (5)#
| 子命令 | 端点 / 说明 |
|---|---|
cert-list (/ssl?action=GetCertList) | 证书列表 |
cert-save --cert=<pem> --key=<pem> | 上传证书 |
cert-del <id> | 删证书 |
lets-encrypt <domain> --method=http | 申请 LE (走 /acme?action=apply_cert_api) |
cert-to-site <id> <webname> | 部署证书到站点 |
7. 防火墙 / SSH (6)#
| 子命令 | 说明 | |
|---|---|---|
fw-list (/data?table=firewall) | 端口列表 | |
fw-add <port> [--protocol=tcp] [--ps=desc] | 开放端口 | |
fw-del <port> | 关闭端口(自动查 id) | |
| `fw-status <on\ | off>` | 防火墙总开关 |
ssh-info | SSH 端口/状态 | |
ssh-port <new_port> | 改 SSH 端口 (要重启 sshd) |
8. 文件 / Shell (15)#
| 子命令 | 用法 |
|---|---|
file-get <path> | 读文件 |
file-set <path> --file <local> | 写文件 (本地 → 远程) |
file-ls <path> | 列目录 |
file-mk <path> | 建文件 |
file-mkdir <path> | 建目录 |
file-rm <path> | 删文件 |
file-rmdir <path> | 删目录 |
file-mv <src> <dst> | 重命名/移动 |
file-cp <src> <dst> | 复制 |
file-zip <src> --out=<out> | 压缩 |
file-unzip <zip> <dst> | 解压 |
file-chmod <path> <mode> | 改权限 |
shell <cmd> | 远程 shell (1 行 1 返) |
9. 计划任务 (3)#
| 子命令 | 用法 |
|---|---|
cron-list (/crontab?action=GetCrontab&p=1) | 列表 |
cron-add <name> --expr='0 3 *' --cmd='/bin/df -h' | 新增 |
cron-del <id> | 删除 |
10. 通用 raw#
# 任何 BT API 都能用
kssh bt $PANEL raw /site 'action=GetSiteDomains&webname=api.z.h3hu.com'
kssh bt $PANEL raw /files 'action=GetFileBody&path=/etc/nginx/nginx.conf'
raw 走 form POST, k=v 形式拼到 ?action= 后。
三、部署实战 playbook#
场景 1: 部署一个 Python 项目 (FastAPI/Django/Flask)#
PANEL=http://139.224.208.63:23010
PROJ=kus-fastapi
PORT=8765
# 1. 建站 (静态类型即可, 我们用 systemd)
kssh bt $PANEL site-add $PROJ.z.h3hu.com /www/wwwroot/$PROJ.z.h3hu.com --kind=Python --php-ver=00 --ps=老六FastAPI
# 2. 防火墙放行
kssh bt $PANEL fw-add $PORT --ps=$PROJ
# 3. 推代码 (排除 venv, 77MB 别传)
cd /home/projects/my-fastapi
tar czf /tmp/$PROJ.tgz --exclude=venv --exclude=__pycache__ --exclude=.env .
kssh put root@139 /tmp/$PROJ.tgz /www/wwwroot/$PROJ.z.h3hu.com/$PROJ.tgz
# 4. 远程装
kssh exec root@139 -- bash -c "cd /www/wwwroot/$PROJ.z.h3hu.com && tar xzf $PROJ.tgz && python3 -m venv venv && venv/bin/pip install -r requirements.txt"
# 5. systemd 守护
kssh put root@139 /tmp/$PROJ.service /etc/systemd/system/$PROJ.service
kssh exec root@139 -- bash -c "systemctl daemon-reload && systemctl enable --now $PROJ"
# 6. 配反代 (走宝塔 conf-set)
cat > /tmp/$PROJ.conf <<EOF
server { listen 80; listen 443 ssl http2; server_name $PROJ.z.h3hu.com;
ssl_certificate /www/server/panel/vhost/cert/$PROJ.z.h3hu.com/fullchain.pem;
ssl_certificate_key /www/server/panel/vhost/cert/$PROJ.z.h3hu.com/privkey.pem;
location / { proxy_pass http://127.0.0.1:$PORT; proxy_set_header Host \$host; }
location ~ \\.well-known { allow all; }
include /www/server/panel/vhost/nginx/well-known/$PROJ.z.h3hu.com.conf;
}
EOF
kssh put root@139 /tmp/$PROJ.conf /tmp/$PROJ.conf
kssh bt $PANEL conf-set $PROJ.z.h3hu.com --file /tmp/$PROJ.conf
kssh bt $PANEL re-web
# 7. 申请 SSL
kssh bt $PANEL lets-encrypt $PROJ.z.h3hu.com --method=http
# 把 cert 拷贝到宝塔 cert 目录
kssh exec root@139 -- python3 -c "import shutil,os; s='/www/server/panel/vhost/letsencrypt/$PROJ.z.h3hu.com'; d='/www/server/panel/vhost/cert/$PROJ.z.h3hu.com'; os.makedirs(d,exist_ok=True); [shutil.copy(f'{s}/{f}',d) for f in ['privkey.pem','fullchain.pem']]"
# 重启 nginx
kssh exec root@139 -- bash -c "nginx -s reload"
场景 2: 整站下线 (清干净)#
PANEL=http://139.224.208.63:23010
SITE=kus-fastapi.z.h3hu.com
# 1. 拿站点 id
SITE_ID=$(kssh exec root@139 -- /usr/local/bin/kssh bt $PANEL sites 2>/dev/null | grep -oP "$SITE\K.*?(?= )" | head -1)
# (或者看 sites 输出)
# 2. 删站点 (含 ftp/database/path)
kssh bt $PANEL site-del $SITE_ID $SITE --ftp --database --path
# 3. 删开放过的端口
kssh bt $PANEL fw-del 8765
场景 3: 一键看 139 全状态#
PANEL=http://139.224.208.63:23010
echo "=== 系统 ==="
kssh bt $PANEL system
kssh bt $PANEL disk
kssh bt $PANEL load
echo "=== 站点 ==="
kssh bt $PANEL sites
echo "=== 端口 ==="
kssh bt $PANEL fw-list
echo "=== 任务 ==="
kssh bt $PANEL cron-list
四、认证 / 签名 / 凭据#
签名算法#
request_token = md5( request_time + md5(api_sk) )
request_time: 当前 unix 秒api_sk:/www/server/panel/config/api.json的token_crypt字段(不是key!)md5: 16 进制小写
凭据存放#
# 文件路径: ~/.config/kssh/bt/{host}.key
# {host} 规则: 冒号 : 换下划线 _, 点 . 保留
# 例: http://139.224.208.63:23010 → 139.224.208.63_23010.key
echo 'dRxPn1piHEICNBC6r11Kocbh9caCzZtA' > ~/.config/kssh/bt/139.224.208.63_23010.key
chmod 600 ~/.config/kssh/bt/139.224.208.63_23010.key
IP 白名单#
/www/server/panel/config/api.json 的 limit_addr 数组(支持 IP 或域名)。宝塔 11.8 必需配置才能用 API。
Cookie 持久化#
首次调用会 POST 登录拿 Set-Cookie, 存到 ~/.config/kssh/bt/{host}.cookie。后续自动带, 免重签。
五、踩坑清单#
| 坑 | 症状 | 修法 |
|---|---|---|
api_sk 错用 key 字段 | 签名不过 | 用 token_crypt |
SiteStart/Stop/DelAcceptPort 报 404 | 没传 id | kssh 自动查, 你只传 name |
防火墙 GetList 报"参数无效" | defs 列表迷惑你 | 走 /data?table=firewall |
| conf-set 含 SSL 路径但证书不在 | "保存失败,配置错误" | 先去掉 listen 443 ssl, 申请成功再加 |
| 80 重定向不生效 | 宝塔 re-web 只重启 panel | 直接 nginx -s reload |
current_exe (deleted) | execv 失败 | 用 run_upgrade 返的 target 路径 |
| ETXTBSY 覆盖 binary | os error 26 | target.with_extension(".new") + rename |
| clap 字段名跨子命令重复 type | compile error | firewall port → p, 改名 |
| mod bt; 没在 main.rs 顶上 | 增量编译静默跳过 | 顶上 mod bt; 显式声明 |
| ESM 不能用 require | ReferenceError | 全部 import |
bash -c "kssh bt http://..." 引号炸 | 拆成 help | 用 ' "..." ' 嵌套或脚本上传 |
六、源码 + 部署#
- 源码:
/home/projects/kssh/ - Cargo 依赖: russh 0.44 / russh-sftp 2.3 / clap 4 / tokio / reqwest (rustls) / md5
- 编译:
cargo build --release(7.1MB binary) - 安装:
cp target/release/kssh /usr/local/bin/kssh - 版本: 0.1.0
- 总命令数: 7 (SSH) + 60 (BT) = 67