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=GetCpuInfoCPU 型号/核数/频率
mem/system?action=GetMemInfo内存详情
boot/system?action=GetAllInfo启动时间 + 综合信息(兜底用)
net/system?action=GetNetWork实时网卡流量
load/system?action=GetLoadAverage1/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-infoSSH 端口/状态
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.jsontoken_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.jsonlimit_addr 数组(支持 IP 或域名)。宝塔 11.8 必需配置才能用 API。

首次调用会 POST 登录拿 Set-Cookie, 存到 ~/.config/kssh/bt/{host}.cookie。后续自动带, 免重签。


五、踩坑清单#

症状修法
api_sk 错用 key 字段签名不过token_crypt
SiteStart/Stop/DelAcceptPort 报 404没传 idkssh 自动查, 你只传 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 覆盖 binaryos error 26target.with_extension(".new") + rename
clap 字段名跨子命令重复 typecompile errorfirewall port → p, 改名
mod bt; 没在 main.rs 顶上增量编译静默跳过顶上 mod bt; 显式声明
ESM 不能用 requireReferenceError全部 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