dsh-linux-commander 1.1.0 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -1
- package/package.json +1 -1
- package/src/ai.js +16 -12
- package/src/commands.js +83 -0
- package/src/core.js +2 -2
- package/src/nl.js +52 -12
package/README.md
CHANGED
|
@@ -70,7 +70,14 @@ Windows 用 `setx <变量名> "<值>"` 写入后重启 DSH;macOS/Linux 写入
|
|
|
70
70
|
```
|
|
71
71
|
|
|
72
72
|
- 三项齐全才启用 AI 兜底;缺任何一项时本地功能完全可用,AI 查询返回「AI 接口未配置」。
|
|
73
|
-
- 重复查询命中
|
|
73
|
+
- 重复查询命中 24 小时 LRU 缓存(最多 500 条),相同请求并发去重,减少 API 消耗。
|
|
74
|
+
|
|
75
|
+
## 速度优化
|
|
76
|
+
|
|
77
|
+
- **本地优先**:命中内置指令库的查询约 5ms 返回,完全不调 AI;指令库持续扩充以减少兜底频率。
|
|
78
|
+
- **固定关闭深度思考**:本工具只处理简单的指令解释/生成,不需要深度推理。请求固定携带 `thinking:{type:"disabled"}`,实测同一查询从约 10s 降到约 2.5s。
|
|
79
|
+
- **长缓存**:指令知识稳定,缓存 TTL 24 小时,重复查询约 50ms。
|
|
80
|
+
- 请求使用 `max_completion_tokens`(`max_tokens` 已被部分厂商废弃);不发送 `temperature`(部分服务端固定为 1,传了也无效)。
|
|
74
81
|
|
|
75
82
|
## 扩展指令库
|
|
76
83
|
|
package/package.json
CHANGED
package/src/ai.js
CHANGED
|
@@ -6,8 +6,9 @@
|
|
|
6
6
|
// in-flight dedupe.
|
|
7
7
|
|
|
8
8
|
const DEFAULT_MODEL = '';
|
|
9
|
-
|
|
10
|
-
const
|
|
9
|
+
// Command knowledge is stable; a long TTL makes repeat queries near-free.
|
|
10
|
+
const CACHE_TTL_MS = 24 * 60 * 60 * 1000;
|
|
11
|
+
const CACHE_MAX = 500;
|
|
11
12
|
|
|
12
13
|
const SYSTEM_PROMPT = [
|
|
13
14
|
'你是一个 Linux 指令助手,只输出一行 JSON,不要输出任何其他文字、解释或 Markdown 代码块。',
|
|
@@ -115,21 +116,24 @@ export function createAiAdapter(config = {}, logger) {
|
|
|
115
116
|
};
|
|
116
117
|
|
|
117
118
|
async function request(input, intent) {
|
|
119
|
+
const body = {
|
|
120
|
+
model,
|
|
121
|
+
messages: [
|
|
122
|
+
{ role: 'system', content: SYSTEM_PROMPT },
|
|
123
|
+
{ role: 'user', content: userPrompt(input, intent) },
|
|
124
|
+
],
|
|
125
|
+
stream: false,
|
|
126
|
+
max_completion_tokens: 3000,
|
|
127
|
+
// Deep thinking is permanently OFF: this tool only answers simple
|
|
128
|
+
// command questions; thinking adds seconds of latency for no benefit.
|
|
129
|
+
thinking: { type: 'disabled' },
|
|
130
|
+
};
|
|
118
131
|
let res;
|
|
119
132
|
try {
|
|
120
133
|
res = await fetch(endpoint, {
|
|
121
134
|
method: 'POST',
|
|
122
135
|
headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${apiKey}` },
|
|
123
|
-
body: JSON.stringify(
|
|
124
|
-
model,
|
|
125
|
-
messages: [
|
|
126
|
-
{ role: 'system', content: SYSTEM_PROMPT },
|
|
127
|
-
{ role: 'user', content: userPrompt(input, intent) },
|
|
128
|
-
],
|
|
129
|
-
stream: false,
|
|
130
|
-
temperature: 0.2,
|
|
131
|
-
max_tokens: 3000,
|
|
132
|
-
}),
|
|
136
|
+
body: JSON.stringify(body),
|
|
133
137
|
signal: AbortSignal.timeout(timeoutMs),
|
|
134
138
|
});
|
|
135
139
|
} catch (err) {
|
package/src/commands.js
CHANGED
|
@@ -240,6 +240,89 @@ export const COMMANDS = {
|
|
|
240
240
|
findmnt: { d: '查看已挂载的文件系统', f: { '-l': '以列表格式输出', '-t': '按文件系统类型过滤', '-T': '按路径查找挂载点' } },
|
|
241
241
|
upower: { d: '查看电池与电源信息', f: { '-i': '查看设备详情', '-e': '列出电源设备' } },
|
|
242
242
|
loginctl: { d: '管理 systemd 登录会话', f: { 'lock-session': '锁定会话(锁屏)', 'unlock-session': '解锁会话', 'list-sessions': '列出会话', 'terminate-session': '终止会话' } },
|
|
243
|
+
|
|
244
|
+
// ===== 扩展:包管理 =====
|
|
245
|
+
pacman: { d: 'Arch Linux 包管理器', f: { '-S': '安装或同步软件包', '-R': '卸载软件包', '-Q': '查询本地已装包', '-y': '刷新软件源数据库', '-u': '升级所有已装包', '-s': '搜索(配合 -S 或 -Q)' } },
|
|
246
|
+
zypper: { d: 'openSUSE 包管理器', f: { 'install': '安装软件包', 'remove': '卸载软件包', 'update': '升级软件包', 'refresh': '刷新软件源', 'search': '搜索软件包', 'info': '查看包详情' } },
|
|
247
|
+
snap: { d: 'Snap 通用软件包管理', f: { 'install': '安装 snap 包', 'remove': '卸载 snap 包', 'list': '列出已装 snap', 'refresh': '更新 snap 包', 'find': '搜索 snap 包' } },
|
|
248
|
+
flatpak: { d: 'Flatpak 沙箱应用管理', f: { 'install': '安装应用', 'uninstall': '卸载应用', 'list': '列出已装应用', 'update': '更新应用', 'run': '运行应用', 'search': '搜索应用' } },
|
|
249
|
+
npx: { d: '直接运行 npm 包中的命令', f: { '-y': '自动确认安装提示', '-p': '指定要安装的包', '--no-install': '禁止自动安装缺失的包' } },
|
|
250
|
+
yarn: { d: 'Node.js 包管理器(Yarn)', f: { 'install': '安装全部依赖', 'add': '添加依赖', 'remove': '移除依赖', 'run': '运行脚本', 'upgrade': '升级依赖', '-D': '添加为开发依赖' } },
|
|
251
|
+
pnpm: { d: '高效的 Node.js 包管理器', f: { 'install': '安装全部依赖', 'add': '添加依赖', 'remove': '移除依赖', 'run': '运行脚本', '-D': '添加为开发依赖', '-g': '全局安装' } },
|
|
252
|
+
|
|
253
|
+
// ===== 扩展:开发工具链 =====
|
|
254
|
+
java: { d: '运行 Java 程序', f: { '-jar': '运行 jar 包', '-version': '查看版本', '-cp': '指定类路径', '-Xmx': '设置最大堆内存', '-Xms': '设置初始堆内存' } },
|
|
255
|
+
javac: { d: 'Java 源码编译器', f: { '-d': '指定 class 输出目录', '-cp': '指定类路径', '-encoding': '指定源码编码', '-g': '生成调试信息', '-version': '查看版本' } },
|
|
256
|
+
'g++': { d: 'GNU C++ 编译器(参数同 gcc)', f: { '-o': '指定输出文件', '-c': '只编译不链接', '-g': '生成调试信息', '-O2': '开启二级优化', '-Wall': '开启常见警告', '-std': '指定 C++ 标准(如 c++17)' } },
|
|
257
|
+
cmake: { d: '跨平台构建系统生成器', f: { '-B': '指定构建目录', '-S': '指定源码目录', '-G': '指定生成器', '-DCMAKE_BUILD_TYPE': '设置构建类型', '--build': '执行构建', '--install': '执行安装' } },
|
|
258
|
+
cargo: { d: 'Rust 包管理与构建工具', f: { 'build': '构建项目', 'run': '编译并运行', 'test': '运行测试', 'check': '快速检查不生成产物', 'fmt': '格式化代码', '--release': '发布模式优化构建' } },
|
|
259
|
+
go: { d: 'Go 语言工具链', f: { 'build': '编译包', 'run': '编译并运行', 'test': '运行测试', 'mod': '模块管理', 'fmt': '格式化代码', 'get': '下载依赖并更新 go.mod' } },
|
|
260
|
+
rustc: { d: 'Rust 编译器', f: { '-o': '指定输出文件', '-O': '开启优化', '-g': '生成调试信息', '--edition': '指定 Rust 版本(如 2021)', '--crate-type': '指定产物类型(如 lib)' } },
|
|
261
|
+
|
|
262
|
+
// ===== 扩展:数据库客户端 =====
|
|
263
|
+
psql: { d: 'PostgreSQL 命令行客户端', f: { '-h': '指定主机', '-p': '指定端口', '-U': '指定用户', '-d': '指定数据库', '-c': '执行 SQL 后退出', '-f': '执行 SQL 文件', '-l': '列出数据库' } },
|
|
264
|
+
'redis-cli': { d: 'Redis 命令行客户端', f: { '-h': '指定主机', '-p': '指定端口', '-a': '指定密码', '-n': '指定数据库编号', '--scan': '安全遍历键', '--bigkeys': '查找大键' } },
|
|
265
|
+
mongosh: { d: 'MongoDB 交互式 Shell', f: { '--host': '指定主机', '--port': '指定端口', '-u': '指定用户名', '-p': '指定密码', '--eval': '执行表达式后退出', '--quiet': '静默模式' } },
|
|
266
|
+
sqlite3: { d: 'SQLite 数据库命令行工具', f: { '-header': '显示列名', '-csv': '以 CSV 输出', '-echo': '回显执行的 SQL', '-init': '指定初始化脚本', '.tables': '列出所有表', '.schema': '查看建表语句' } },
|
|
267
|
+
|
|
268
|
+
// ===== 扩展:网络诊断与防火墙 =====
|
|
269
|
+
mtr: { d: '结合 ping 与 traceroute 的网络诊断', f: { '-n': '不解析域名', '-r': '报告模式输出后退出', '-c': '指定发送次数', '-i': '设置发送间隔', '-T': '使用 TCP 探测', '-P': '指定目标端口' } },
|
|
270
|
+
nmap: { d: '网络扫描与端口探测', f: { '-sS': 'SYN 半开扫描', '-sT': 'TCP 连接扫描', '-sV': '探测服务版本', '-p': '指定端口范围', '-O': '探测操作系统', '-Pn': '跳过主机发现', '-A': '激进模式综合探测' } },
|
|
271
|
+
whois: { d: '查询域名注册信息', f: { '-h': '指定 whois 服务器', '-p': '指定端口', '-H': '省略法律免责声明' } },
|
|
272
|
+
telnet: { d: '远程登录或测试端口连通(明文)', f: {}, danger: '明文传输凭据,不建议用于远程登录' },
|
|
273
|
+
ftp: { d: '交互式文件传输(明文)', f: { '-n': '禁止自动登录', '-i': '关闭多文件传输的交互提示', '-v': '显示详细信息', '-p': '使用被动模式' }, danger: '明文传输凭据,建议改用 sftp' },
|
|
274
|
+
ip6tables: { d: '配置 IPv6 防火墙规则', f: { '-L': '列出规则', '-A': '追加规则', '-D': '删除规则', '-I': '插入规则', '-F': '清空规则', '-n': '以数字形式显示' }, danger: '清空或误配规则可能中断网络或远程连接' },
|
|
275
|
+
nft: { d: 'nftables 防火墙管理', f: { 'list': '查看规则', 'add': '添加规则或表', 'delete': '删除规则或表', 'flush': '清空规则集', '-f': '从文件加载规则', '-a': '显示规则句柄' }, danger: 'flush 会清空全部防火墙规则' },
|
|
276
|
+
'firewall-cmd': { d: '管理 firewalld 防火墙', f: { '--list-all': '查看当前区域规则', '--add-port': '放行端口', '--remove-port': '移除放行端口', '--permanent': '使配置永久生效', '--reload': '重载规则', '--state': '查看运行状态' }, danger: '规则配置不当可能导致无法远程登录' },
|
|
277
|
+
http: { d: 'HTTPie 人性化 HTTP 客户端', f: { '-v': '显示完整请求与响应', '-h': '只显示响应头', '-b': '只显示响应体', '-a': '指定认证(user:pass)', '-f': '以表单方式发送', '--follow': '跟随重定向', '-o': '保存到文件', '-d': '下载模式' } },
|
|
278
|
+
socat: { d: '多功能双向数据流中继', f: { '-u': '单向传输(左到右)', '-U': '单向传输(右到左)', '-v': '以文本显示传输数据', '-t': '设置关闭超时', '-d': '显示调试信息' } },
|
|
279
|
+
|
|
280
|
+
// ===== 扩展:存储与加密 =====
|
|
281
|
+
cryptsetup: { d: '管理 LUKS 加密设备', f: { 'open': '打开加密设备', 'close': '关闭加密设备', 'luksFormat': '格式化为 LUKS 加密', 'luksAddKey': '添加密钥', 'status': '查看设备状态' }, danger: 'luksFormat 会清空设备上的所有数据' },
|
|
282
|
+
lvm: { d: 'LVM 逻辑卷管理入口', f: { 'pvs': '查看物理卷', 'vgs': '查看卷组', 'lvs': '查看逻辑卷', 'pvcreate': '创建物理卷', 'vgcreate': '创建卷组', 'lvcreate': '创建逻辑卷', 'lvextend': '扩展逻辑卷' }, danger: '删除或缩减逻辑卷会丢失数据' },
|
|
283
|
+
mdadm: { d: '管理 Linux 软 RAID 阵列', f: { '--create': '创建阵列', '--detail': '查看阵列详情', '--assemble': '组装阵列', '--stop': '停止阵列', '--add': '向阵列添加磁盘', '--remove': '从阵列移除磁盘' }, danger: '误操作会破坏阵列数据' },
|
|
284
|
+
smartctl: { d: '查看磁盘 SMART 健康信息', f: { '-a': '查看全部 SMART 信息', '-H': '查看健康状态', '-i': '查看设备信息', '-t': '发起自检(如 short)', '-l': '查看日志(如 error)' } },
|
|
285
|
+
chattr: { d: '修改文件扩展属性', f: { '+i': '设为不可修改(immutable)', '-i': '取消不可修改属性', '+a': '设为仅追加', '-a': '取消仅追加属性', '-R': '递归修改' }, danger: '+i 后连 root 也无法修改或删除文件' },
|
|
286
|
+
lsattr: { d: '查看文件扩展属性', f: { '-a': '列出目录中所有文件', '-d': '只显示目录本身', '-R': '递归列出' } },
|
|
287
|
+
|
|
288
|
+
// ===== 扩展:自动化与虚拟化 =====
|
|
289
|
+
ansible: { d: '自动化运维 ad-hoc 命令执行', f: { '-m': '指定模块(如 ping、shell)', '-a': '指定模块参数', '-i': '指定主机清单', '--become': '提权执行', '-f': '指定并发数', '--check': '试运行不实际更改' } },
|
|
290
|
+
'ansible-playbook': { d: '运行 Ansible 剧本', f: { '-i': '指定主机清单', '-e': '设置额外变量', '--check': '试运行不实际更改', '--tags': '只运行指定标签', '--limit': '限制目标主机', '-v': '显示详细输出' } },
|
|
291
|
+
terraform: { d: '基础设施即代码管理', f: { 'init': '初始化工作目录', 'plan': '预览变更', 'apply': '应用变更', 'destroy': '销毁全部资源', 'fmt': '格式化配置', 'validate': '校验配置' }, danger: 'apply/destroy 会真实变更或删除云资源' },
|
|
292
|
+
helm: { d: 'Kubernetes 包管理器', f: { 'install': '安装 Chart', 'upgrade': '升级发布', 'uninstall': '卸载发布', 'list': '列出发布', 'repo': '管理 Chart 仓库', 'template': '本地渲染模板' }, danger: 'uninstall 会删除发布及其资源' },
|
|
293
|
+
'docker-compose': { d: 'Docker 多容器编排', f: { 'up': '创建并启动服务', 'down': '停止并移除容器网络', 'ps': '列出服务容器', 'logs': '查看服务日志', 'build': '构建镜像', '-d': '后台运行', '-f': '指定编排文件' }, danger: 'down 加 -v 会删除数据卷' },
|
|
294
|
+
podman: { d: '无守护进程的容器工具(兼容 Docker)', f: { 'ps': '列出容器', 'images': '列出镜像', 'run': '运行容器', 'exec': '在容器内执行命令', 'build': '构建镜像', 'logs': '查看容器日志' } },
|
|
295
|
+
'qemu-img': { d: 'QEMU 磁盘镜像管理', f: { 'info': '查看镜像信息', 'create': '创建镜像', 'convert': '转换镜像格式', 'resize': '调整镜像大小', 'snapshot': '管理快照' }, danger: '缩小镜像或覆盖转换可能损坏数据' },
|
|
296
|
+
virsh: { d: '管理 libvirt 虚拟机', f: { 'list': '列出虚拟机', 'start': '启动虚拟机', 'shutdown': '正常关机', 'destroy': '强制断电', 'console': '连接控制台', 'edit': '编辑配置' }, danger: 'destroy 相当于强制断电,可能丢失数据' },
|
|
297
|
+
|
|
298
|
+
// ===== 扩展:Shell 内置 =====
|
|
299
|
+
declare: { d: '声明变量并设置属性(Shell 内置)', f: { '-i': '声明为整数', '-a': '声明为索引数组', '-A': '声明为关联数组', '-r': '声明为只读', '-x': '导出为环境变量', '-p': '显示变量定义' } },
|
|
300
|
+
local: { d: '在函数内声明局部变量(Shell 内置)', f: { '-r': '声明为只读局部变量', '-i': '声明为整数', '-a': '声明为数组' } },
|
|
301
|
+
bind: { d: '查看或设置 Readline 键绑定(Shell 内置)', f: { '-l': '列出所有函数名', '-q': '查询按键对应的函数', '-x': '列出键序列绑定', '-f': '从文件读取绑定' } },
|
|
302
|
+
compgen: { d: '生成补全候选(Shell 内置)', f: { '-c': '列出所有命令', '-a': '列出所有别名', '-b': '列出所有内置命令', '-f': '列出文件名', '-d': '列出目录名', '-W': '按单词列表生成候选' } },
|
|
303
|
+
|
|
304
|
+
// ===== 扩展:归档与补丁 =====
|
|
305
|
+
cpio: { d: 'cpio 归档打包与解包', f: { '-o': '创建归档', '-i': '解包归档', '-t': '列出归档内容', '-v': '显示处理过程', '-d': '解包时创建所需目录' } },
|
|
306
|
+
ar: { d: '静态库归档管理', f: { '-r': '插入或替换成员', '-t': '列出成员', '-x': '提取成员', '-d': '删除成员', '-v': '显示详细过程' } },
|
|
307
|
+
patch: { d: '应用 diff 补丁文件', f: { '-p': '剥离路径前缀层级(如 -p1)', '-R': '反向应用补丁', '--dry-run': '试运行不实际修改', '-i': '指定补丁文件', '-b': '修改前备份原文件' } },
|
|
308
|
+
bzcat: { d: '直接查看 bzip2 压缩文件内容', f: {} },
|
|
309
|
+
xzcat: { d: '直接查看 xz 压缩文件内容', f: {} },
|
|
310
|
+
zstd: { d: 'Zstandard 快速压缩工具', f: { '-d': '解压', '-k': '保留原文件', '-19': '最高压缩比(1-19)', '-T0': '使用全部 CPU 线程', '-c': '输出到标准输出', '-l': '查看压缩文件信息' } },
|
|
311
|
+
unzstd: { d: '解压 zstd 文件(等价 zstd -d)', f: { '-k': '保留原压缩文件', '-c': '输出到标准输出' } },
|
|
312
|
+
'7z': { d: '7-Zip 压缩解压工具', f: { 'a': '添加到压缩包', 'x': '解压(保留目录结构)', 'e': '解压(不保留目录)', 'l': '列出压缩包内容', 't': '测试压缩包', '-p': '设置密码', '-r': '递归子目录' } },
|
|
313
|
+
rar: { d: 'RAR 压缩工具', f: { 'a': '添加到压缩包', 'x': '解压(保留目录结构)', 'e': '解压(不保留目录)', 'l': '列出压缩包内容', 't': '测试压缩包', '-p': '设置密码' } },
|
|
314
|
+
unrar: { d: '解压 RAR 压缩包', f: { 'x': '解压(保留目录结构)', 'e': '解压(不保留目录)', 'l': '列出压缩包内容', 't': '测试压缩包', '-p': '指定解压密码' } },
|
|
315
|
+
|
|
316
|
+
// ===== 扩展:JSON/YAML 处理 =====
|
|
317
|
+
jq: { d: 'JSON 查询与处理工具', f: { '-r': '输出原始字符串(去引号)', '-c': '紧凑单行输出', '-e': '按结果设置退出码', '-s': '把所有输入合并为数组', '--arg': '传入字符串变量', '--argjson': '传入 JSON 变量' } },
|
|
318
|
+
yq: { d: 'YAML 查询与处理工具', f: { '-i': '直接修改原文件', '-o': '指定输出格式(如 json)', '-P': '美化输出', '-n': '不读输入创建新文档' } },
|
|
319
|
+
|
|
320
|
+
// ===== 扩展:调试与性能 =====
|
|
321
|
+
strace: { d: '跟踪进程的系统调用与信号', f: { '-p': '附加到指定 PID', '-f': '跟踪子进程', '-e': '过滤表达式(如 trace=open)', '-o': '输出到文件', '-c': '统计系统调用汇总', '-t': '显示时间戳' } },
|
|
322
|
+
ltrace: { d: '跟踪进程的库函数调用', f: { '-p': '附加到指定 PID', '-f': '跟踪子进程', '-e': '过滤表达式', '-o': '输出到文件', '-c': '统计调用汇总', '-S': '同时显示系统调用' } },
|
|
323
|
+
perf: { d: 'Linux 性能分析工具', f: { 'top': '实时查看热点函数', 'record': '采样记录性能数据', 'report': '分析采样数据', 'stat': '统计计数器(如缓存命中)', 'list': '列出可用事件', '-p': '指定进程 PID', '-g': '记录调用图' } },
|
|
324
|
+
valgrind: { d: '内存错误与泄漏检测', f: { '--tool': '指定工具(如 memcheck)', '--leak-check': '泄漏检查级别(如 full)', '--show-leak-kinds': '显示泄漏类型', '--track-origins': '追踪未初始化值来源', '--log-file': '输出到日志文件' } },
|
|
325
|
+
gdb: { d: 'GNU 程序调试器', f: { '-p': '附加到指定 PID', '-q': '静默启动不显示版权', '-ex': '启动时执行命令', '-batch': '批处理模式', '-tui': '启用文本界面', '--args': '传递程序参数' } },
|
|
243
326
|
};
|
|
244
327
|
|
|
245
328
|
// 危险参数模式:re 为正则源码字符串(消费方以 new RegExp(re, 'i') 编译)。
|
package/src/core.js
CHANGED
|
@@ -105,7 +105,7 @@ function explainSegment(seg) {
|
|
|
105
105
|
if (rest.length === 0) return { handled: true, text: notes.join(',') };
|
|
106
106
|
let name = rest[0];
|
|
107
107
|
if (name.includes('/')) name = name.slice(name.lastIndexOf('/') + 1);
|
|
108
|
-
if (!/^[A-Za-
|
|
108
|
+
if (!/^[A-Za-z0-9_][A-Za-z0-9_.+-]*$/.test(name)) return { handled: false };
|
|
109
109
|
const entry = COMMANDS[name];
|
|
110
110
|
if (!entry) return { handled: false };
|
|
111
111
|
const flags = entry.f || {};
|
|
@@ -214,7 +214,7 @@ export function detectIntent(input) {
|
|
|
214
214
|
if (CJK.test(trimmed)) return NL_HINT.test(trimmed) ? 'natural' : 'natural';
|
|
215
215
|
if (SHELL_META.test(trimmed) || /\s--?[A-Za-z]/.test(trimmed)) return 'command';
|
|
216
216
|
if (/^\.{1,2}\//.test(trimmed) || /^~\//.test(trimmed)) return 'command';
|
|
217
|
-
if (/^[A-Za-
|
|
217
|
+
if (/^[A-Za-z0-9_][A-Za-z0-9_.+-]*$/.test(trimmed)) return 'auto';
|
|
218
218
|
return 'auto';
|
|
219
219
|
}
|
|
220
220
|
|
package/src/nl.js
CHANGED
|
@@ -19,6 +19,7 @@ export const NL_RULES = [
|
|
|
19
19
|
{ re: /(?:查看|查询|检查)\s*(?:端口|port)\s*(\d{1,5})/i, cmd: m => `ss -lntp | grep ':${m[1]}'`, note: '查看指定端口的监听进程' },
|
|
20
20
|
{ re: /(?:查看|查询)\s*(?:端口|port)\s*(\d{1,5})\s*(?:打开|占用)的?(?:文件|进程)/i, cmd: m => `lsof -i :${m[1]}`, note: '查看占用该端口的进程与文件' },
|
|
21
21
|
{ re: /(?:打开|占用)\s*(?:端口|port)\s*(\d{1,5})\s*的?(?:文件|进程)/i, cmd: m => `lsof -i :${m[1]}`, note: '查看占用该端口的进程与文件' },
|
|
22
|
+
{ re: /(?:测试|检查|探测)\s*([\w.\-]+)\s*(?:的)?\s*(?:端口|port)\s*(\d{1,5})/i, cmd: m => `nc -zv ${m[1]} ${m[2]}`, note: '测试目标主机端口是否可达' },
|
|
22
23
|
{ re: /(?:测试|检查|探测)\s*(?:端口|port)\s*(\d{1,5})\s*(?:连通|通不通|是否开放|开没开)/i, cmd: m => `nc -zv <主机> ${m[1]}`, note: '测试目标主机端口是否可达' },
|
|
23
24
|
{ re: /抓包.*?(\d{1,5})|tcpdump.*?port\s*(\d{1,5})/i, cmd: m => `sudo tcpdump -i any port ${m[1] || m[2]}`, note: '抓取指定端口的数据包' },
|
|
24
25
|
|
|
@@ -26,6 +27,7 @@ export const NL_RULES = [
|
|
|
26
27
|
{ re: /(?:查看|查询|看看|检查)\s*([a-zA-Z][\w.\-]*)\s*(?:进程|process)/i, cmd: m => `ps aux | grep ${m[1]}`, note: '按名称过滤进程' },
|
|
27
28
|
{ re: /([a-zA-Z][\w.\-]*)\s*(?:进程|process)\s*(?:的)?(?:状态|信息|占用|情况|运行)/i, cmd: m => `ps aux | grep ${m[1]}`, note: '按名称过滤进程' },
|
|
28
29
|
{ re: /进程树|pstree/i, cmd: 'pstree -p', note: '树状显示进程及 PID' },
|
|
30
|
+
{ re: /strace\s*(?:跟踪)?\s*(?:进程)?\s*(\d{1,7})?|(?:查看|跟踪)\s*(?:进程\s*)?(\d{1,7})?\s*(?:的)?系统调用/i, cmd: m => `strace -p ${m[1] || m[2] || '<PID>'}`, note: '跟踪进程的系统调用' },
|
|
29
31
|
{ re: /(?:查看|显示|列出|看看)(?:所有|全部)?(?:正在运行的)?进程(?:列表|情况)?/i, cmd: 'ps aux', note: '列出所有进程详情' },
|
|
30
32
|
{ re: /(?:查看|显示|列出|查询|看看)(?:一下)?(?:所有|全部)?(?:正在)?(?:监听|开放)?(?:的)?端口(?:占用|列表|情况)?/i, cmd: 'ss -lntp', note: '列出所有 TCP 监听端口及进程' },
|
|
31
33
|
{ re: /抓包|tcpdump/i, cmd: 'sudo tcpdump -i any', note: '抓取所有网卡的数据包' },
|
|
@@ -37,6 +39,7 @@ export const NL_RULES = [
|
|
|
37
39
|
{ re: /(?:查看|统计|看看|计算)\s*([\/~.\w][\w.\-\/~]*)\s*(?:目录|文件夹)?(?:的)?(?:大小|占用空间|占用)/i, cmd: m => `du -sh ${m[1]}`, note: '统计指定目录大小' },
|
|
38
40
|
{ re: /(?:目录|文件夹)(?:的)?(?:大小|占用|容量)/i, cmd: 'du -sh <路径>', note: '统计目录占用的磁盘空间' },
|
|
39
41
|
{ re: /(?:磁盘|硬盘|分区)(?:空间|容量|使用(?:情况|率)?|占用)|(?:磁盘|硬盘)(?:满|不足|快满)/i, cmd: 'df -h', note: '查看各分区磁盘空间使用' },
|
|
42
|
+
{ re: /(?:查看|检查|检测)\s*(?:磁盘|硬盘)\s*(?:健康|smart|状态)/i, cmd: 'sudo smartctl -a <设备>', note: '查看磁盘 SMART 健康信息' },
|
|
40
43
|
{ re: /(?:实时|动态)(?:监控|查看|显示)|(?:监控|查看)(?:系统)?资源|资源占用|^top$|^htop$/i, cmd: m => (/htop/i.test(m[0]) ? 'htop' : 'top'), note: '实时监控系统资源与进程' },
|
|
41
44
|
{ re: /(?:内存|memory|ram)(?:使用|占用|情况|大小|剩余|不足)?/i, cmd: 'free -h', note: '查看内存与交换使用' },
|
|
42
45
|
{ re: /cpu\s*温度|温度.*传感器|sensors/i, cmd: 'sensors', note: '查看温度等传感器读数' },
|
|
@@ -53,9 +56,9 @@ export const NL_RULES = [
|
|
|
53
56
|
{ re: /系统日志|journalctl(?!\s+-u)/i, cmd: 'journalctl -xe', note: '查看系统日志末尾' },
|
|
54
57
|
{ re: /锁屏|锁定屏幕|lock\s*screen/i, cmd: 'loginctl lock-session', note: '锁定当前会话' },
|
|
55
58
|
{ re: /网卡(?:流量|统计|收发包)|(?:网络|接口)(?:流量|统计)/i, cmd: 'ip -s link', note: '查看网卡收发统计' },
|
|
56
|
-
{ re:
|
|
59
|
+
{ re: /\bldd\s+(\S+)/i, cmd: m => `ldd ${m[1]}`, note: '查看共享库依赖' },
|
|
57
60
|
{ re: /(?:共享库|动态库)(?:依赖|链接)/i, cmd: 'ldd <文件>', note: '查看可执行文件的共享库依赖' },
|
|
58
|
-
{ re:
|
|
61
|
+
{ re: /\btype\s+(\S+)/i, cmd: m => `type ${m[1]}`, note: '查看命令类型' },
|
|
59
62
|
{ re: /命令类型|(?:是|属于)(?:什么|哪种)(?:命令|类型)/i, cmd: 'type <命令>', note: '区分别名、内置与可执行文件' },
|
|
60
63
|
|
|
61
64
|
// ===== 文件操作(具体在前)=====
|
|
@@ -79,7 +82,7 @@ export const NL_RULES = [
|
|
|
79
82
|
{ re: /(?:末尾|最后|结尾|尾部)\s*(\d+)\s*行/i, cmd: m => `tail -n ${m[1]} <文件>`, note: '查看文件末尾 N 行' },
|
|
80
83
|
{ re: /(?:查看|显示)?(?:文件)?(?:开头|头部|前几行)/i, cmd: 'head -n 10 <文件>', note: '查看文件开头' },
|
|
81
84
|
{ re: /(?:查看|显示)?(?:文件)?(?:末尾|结尾|最后几行)/i, cmd: 'tail -n 10 <文件>', note: '查看文件末尾' },
|
|
82
|
-
{ re: /(?:分页|翻页)(?:查看|显示)?\s*(\S+)
|
|
85
|
+
{ re: /(?:分页|翻页)(?:查看|显示)?\s*(\S+)?|\bless\s+(\S+)/i, cmd: m => `less ${m[1] || m[2] || '<文件>'}`, note: '分页查看文件' },
|
|
83
86
|
{ re: /隐藏文件|(?:含|包括|包含)隐藏/i, cmd: 'ls -la', note: '列出含隐藏文件的所有文件' },
|
|
84
87
|
{ re: /(?:查看|显示|列出|看看)(?:当前|本)?(?:目录|文件夹)(?:中|下|里)?(?:的)?(?:所有|全部)文件/i, cmd: 'ls -la', note: '列出当前目录所有文件(含隐藏)' },
|
|
85
88
|
{ re: /(?:复制|拷贝|copy|cp)\s*(\S+)\s*(?:到|至|->|→)\s*(\S+)/i, cmd: m => `cp -r ${m[1]} ${m[2]}`, note: '复制文件或目录' },
|
|
@@ -91,31 +94,33 @@ export const NL_RULES = [
|
|
|
91
94
|
{ re: /(?:递归|强制)?删除(?:文件|目录|文件夹)/i, cmd: 'rm -rf <路径>', warn: '删除后难以恢复,请确认路径' },
|
|
92
95
|
{ re: /(?:创建|新建|建立|mkdir)\s*(?:一个)?(?:多级)?(?:目录|文件夹)\s*([\/~.\w][\w.\-\/~]*)?/i, cmd: m => `mkdir -p ${m[1] || '<路径>'}`, note: '创建目录(含多级)' },
|
|
93
96
|
{ re: /(?:创建|建立|添加)?\s*(?:软链接|符号链接|快捷方式)|ln\s+-s/i, cmd: 'ln -s <目标> <链接名>', note: '创建软链接' },
|
|
94
|
-
{ re: /(?:查看|判断|识别)\s*(\S+)?\s*(?:的)
|
|
97
|
+
{ re: /(?:查看|判断|识别)\s*(\S+)?\s*(?:的)?文件类型|\bfile\s+(\S+)/i, cmd: m => `file ${m[1] || m[2] || '<文件>'}`, note: '识别文件类型' },
|
|
95
98
|
{ re: /(?:统计|计算|数)\s*(\S+)?\s*(?:的)?行数|wc\s+-l\s+(\S+)/i, cmd: m => `wc -l ${m[1] || m[2] || '<文件>'}`, note: '统计文件行数' },
|
|
96
99
|
{ re: /词频|单词频率|统计.*出现次数/i, cmd: 'sort <文件> | uniq -c | sort -rn', note: '统计词频并按次数排序' },
|
|
97
100
|
{ re: /(?:去重|去除重复|去掉重复)(?:行)?\s*(\S+)?/i, cmd: m => `sort ${m[1] || '<文件>'} | uniq`, note: '排序后去重' },
|
|
98
|
-
{ re: /(
|
|
101
|
+
{ re: /(?:排序|\bsort)\s*(\S+)?/i, cmd: m => `sort ${m[1] || '<文件>'}`, note: '对文本行排序' },
|
|
99
102
|
{ re: /(?:比较|对比|diff)\s*(\S+)\s*(?:和|与|跟|,|,)\s*(\S+)/i, cmd: m => `diff ${m[1]} ${m[2]}`, note: '比较两个文件差异' },
|
|
100
103
|
{ re: /比较文件|对比文件|^diff$/i, cmd: 'diff <文件1> <文件2>', note: '比较两个文件差异' },
|
|
101
104
|
{ re: /md5\s*(?:值|校验|摘要)?\s*(\S+)?/i, cmd: m => `md5sum ${m[1] || '<文件>'}`, note: '计算 MD5 摘要' },
|
|
102
105
|
{ re: /sha-?256\s*(?:值|校验|摘要)?\s*(\S+)?/i, cmd: m => `sha256sum ${m[1] || '<文件>'}`, note: '计算 SHA256 摘要' },
|
|
103
106
|
{ re: /base64\s*(?:解码|decode|-d)/i, cmd: 'base64 -d <文件>', note: 'Base64 解码' },
|
|
104
107
|
{ re: /base64\s*(?:编码|encode)?\s*(\S+)?/i, cmd: m => `base64 ${m[1] || '<文件>'}`, note: 'Base64 编码' },
|
|
108
|
+
{ re: /jq\s*(?:提取|查询|解析)?\s*['"]?([^'"\s]+)['"]?\s*(\S+)?|(?:提取|解析)\s*json\s*字段/i, cmd: m => `jq '${m[1] || '<路径>'}' ${m[2] || '<文件>'}`, note: '用 jq 提取 JSON 字段' },
|
|
105
109
|
{ re: /(?:随机|生成)(?:一个)?(?:密码|口令|密钥)/i, cmd: 'openssl rand -base64 16', note: '生成随机密码' },
|
|
106
110
|
{ re: /递归(?:修改|设置)?权限|chmod\s+-R/i, cmd: 'chmod -R <模式> <路径>', warn: '递归修改权限影响范围大,请谨慎' },
|
|
107
111
|
{ re: /(?:修改|设置)\s*(\S+)?\s*权限(?:为|成)\s*(\d{3,4})/i, cmd: m => `chmod ${m[2]} ${m[1] || '<文件>'}`, note: '修改文件权限' },
|
|
108
112
|
{ re: /(?:修改|更改|设置|chmod)\s*(?:权限)?\s*(\d{3,4})\s*([\/~.\w][\w.\-\/~]*)?/i, cmd: m => `chmod ${m[1]} ${m[2] || '<文件>'}`, note: '修改文件权限' },
|
|
109
113
|
{ re: /(?:查看|显示)\s*([\/~.\w][\w.\-\/~]*)?\s*(?:的)?(?:文件)?权限/i, cmd: m => `ls -l ${m[1] || '<文件>'}`, note: '查看文件权限' },
|
|
114
|
+
{ re: /(?:查看|显示)\s*([\/~.\w][\w.\-\/~]*)?\s*(?:的)?(?:文件)?(?:扩展)?属性|lsattr\s+(\S+)/i, cmd: m => `lsattr ${m[1] || m[2] || '<文件>'}`, note: '查看文件扩展属性' },
|
|
110
115
|
{ re: /(?:修改|更改|设置)\s*(\S+)?\s*(?:的)?属主|chown\s+(\S+)/i, cmd: 'chown <用户>:<组> <文件>', note: '修改文件属主与属组' },
|
|
111
|
-
{ re:
|
|
112
|
-
{ re: /(
|
|
116
|
+
{ re: /\bcat\s+(\S+)/i, cmd: m => `cat ${m[1]}`, note: '查看文件内容' },
|
|
117
|
+
{ re: /(?:查看|显示|打开|看看|\bcat)\s*(?:文件)?\s*([\/~.\w][\w.\-\/~]*)?\s*(?:的)?内容/i, cmd: m => `cat ${m[1] || '<文件>'}`, note: '查看文件内容' },
|
|
113
118
|
|
|
114
119
|
// ===== 用户 / 环境 / 历史 / 定时 / 服务 / 软件包 =====
|
|
115
120
|
{ re: /(?:当前|现在)(?:登录)?(?:用户|是谁)|我是谁|whoami/i, cmd: 'whoami', note: '查看当前用户' },
|
|
116
121
|
{ re: /(?:查看|查询)\s*(\w+)\s*的?\s*(?:id|uid|gid)/i, cmd: m => `id ${m[1]}`, note: '查看用户 ID' },
|
|
117
122
|
{ re: /用户id|^id\s+(\w+)/i, cmd: m => `id ${m[1] || '<用户名>'}`, note: '查看用户 ID' },
|
|
118
|
-
{ re: /(
|
|
123
|
+
{ re: /(?:切换|\bsu\b)\s*(?:到)?(?:用户)?\s*-?\s*(\w+)/i, cmd: m => `su - ${m[1]}`, note: '切换用户' },
|
|
119
124
|
{ re: /切换用户/i, cmd: 'su - <用户名>', note: '切换用户' },
|
|
120
125
|
{ re: /(?:修改|更改|重置|设置)\s*(\w+)?\s*(?:的)?密码|passwd\s+(\w+)/i, cmd: m => `passwd ${m[1] || m[2] || '<用户名>'}`, note: '修改用户密码' },
|
|
121
126
|
{ re: /(?:添加|新增|创建|建立)\s*(?:一个)?用户\s*(\w+)?/i, cmd: m => `useradd -m ${m[1] || '<用户名>'}`, note: '添加用户并创建家目录' },
|
|
@@ -125,8 +130,8 @@ export const NL_RULES = [
|
|
|
125
130
|
{ re: /(?:设置|导出|export)\s*(?:环境)?变量\s*([A-Za-z_]\w*)\s*(?:=|为|成)\s*(\S+)/i, cmd: m => `export ${m[1]}=${m[2]}`, note: '设置环境变量' },
|
|
126
131
|
{ re: /(?:查看|显示|输出)\s*(?:环境)?变量\s*\$?([A-Za-z_]\w*)|echo\s+\$(\w+)/i, cmd: m => `echo $${m[1] || m[2] || '<名称>'}`, note: '查看指定环境变量' },
|
|
127
132
|
{ re: /(?:查看|显示|列出)?\s*(?:所有|全部)?环境变量/i, cmd: 'env', note: '查看所有环境变量' },
|
|
128
|
-
{ re: /(?:查看|查找|查询)\s*(\S+)?\s*(?:命令)?(?:的位置|在哪|路径|安装位置)
|
|
129
|
-
{ re: /(?:查看|显示)\s*(\S+)?\s*(?:命令)?(?:的)?(?:帮助|手册|文档|用法)
|
|
133
|
+
{ re: /(?:查看|查找|查询)\s*(\S+)?\s*(?:命令)?(?:的位置|在哪|路径|安装位置)|\bwhich\s+(\S+)/i, cmd: m => `which ${m[1] || m[2] || '<命令>'}`, note: '查看命令位置' },
|
|
134
|
+
{ re: /(?:查看|显示)\s*(\S+)?\s*(?:命令)?(?:的)?(?:帮助|手册|文档|用法)|\bman\s+(\S+)/i, cmd: m => `man ${m[1] || m[2] || '<命令>'}`, note: '查看命令帮助' },
|
|
130
135
|
{ re: /(?:搜索|查找|grep)\s*(?:命令)?历史\s*(\S+)?|history\s*\|\s*grep\s+(\S+)/i, cmd: m => `history | grep ${m[1] || m[2] || '<关键词>'}`, note: '搜索历史命令' },
|
|
131
136
|
{ re: /清空(?:命令)?历史|history\s+-c/i, cmd: 'history -c', warn: '会清空命令历史' },
|
|
132
137
|
{ re: /(?:查看|显示)?\s*(?:命令)?历史(?:记录)?/i, cmd: 'history', note: '查看历史命令' },
|
|
@@ -143,6 +148,34 @@ export const NL_RULES = [
|
|
|
143
148
|
{ re: /(?:停止|关闭|stop)\s*(\w[\w.\-]*)\s*服务/i, cmd: m => `systemctl stop ${m[1]}`, warn: '停止服务会中断其功能' },
|
|
144
149
|
{ re: /(?:设置)?\s*(\w[\w.\-]*)\s*(?:服务)?(?:开机)?自启|开机自启\s*(\w[\w.\-]*)?|systemctl\s+enable\s+(\S+)/i, cmd: m => `systemctl enable ${m[1] || m[2] || m[3] || '<服务名>'}`, note: '设置开机自启' },
|
|
145
150
|
{ re: /服务状态|systemctl\s+status/i, cmd: 'systemctl status <服务名>', note: '查看服务状态' },
|
|
151
|
+
|
|
152
|
+
// ===== 扩展:编排 / 云原生 / 开发构建 / 其他包管理器 / 数据库(先于通用 apt 安装)=====
|
|
153
|
+
{ re: /docker[-\s]compose\s*(?:up|启动|运行)/i, cmd: 'docker-compose up -d', note: '后台启动编排服务' },
|
|
154
|
+
{ re: /docker[-\s]compose\s*(?:down|停止|关闭)/i, cmd: 'docker-compose down', warn: '会停止并移除容器与网络' },
|
|
155
|
+
{ re: /helm\s*(?:install|安装)\s*(\S+)?\s*(\S+)?/i, cmd: m => `helm install ${m[1] || '<名称>'} ${m[2] || '<chart>'}`, note: '安装 Helm Chart' },
|
|
156
|
+
{ re: /helm\s*(?:list|ls|列表|列出)/i, cmd: 'helm list', note: '列出 Helm 发布' },
|
|
157
|
+
{ re: /terraform\s*(?:init|初始化)/i, cmd: 'terraform init', note: '初始化工作目录' },
|
|
158
|
+
{ re: /terraform\s*(?:plan|计划|预览)/i, cmd: 'terraform plan', note: '预览变更' },
|
|
159
|
+
{ re: /terraform\s*(?:apply|应用|执行)/i, cmd: 'terraform apply', warn: '会真实变更云资源,请确认 plan 结果' },
|
|
160
|
+
{ re: /terraform\s*(?:destroy|销毁|删除)/i, cmd: 'terraform destroy', warn: '会删除全部受管云资源' },
|
|
161
|
+
{ re: /ansible\s*(?:测试)?\s*(?:连通|连接|ping)/i, cmd: 'ansible all -m ping', note: '测试所有主机连通性' },
|
|
162
|
+
{ re: /pacman\s*(?:安装|装|-S)\s*([\w.\-]+)?/i, cmd: m => `sudo pacman -S ${m[1] || '<包名>'}`, note: 'Arch 系安装软件包' },
|
|
163
|
+
{ re: /pacman\s*(?:更新|升级|同步|-Syu)/i, cmd: 'sudo pacman -Syu', note: '刷新源并升级系统' },
|
|
164
|
+
{ re: /(?:dnf|yum)\s*(?:安装|装|install)\s*([\w.\-]+)?/i, cmd: m => `sudo dnf install ${m[1] || '<包名>'}`, note: 'RHEL 系安装软件包' },
|
|
165
|
+
{ re: /\bnpm\s*(?:run|运行)\s*(?:脚本)?\s*([\w.\-]+)?|运行\s*npm\s*脚本\s*([\w.\-]+)/i, cmd: m => `npm run ${m[1] || m[2] || '<脚本>'}`, note: '运行 npm 脚本' },
|
|
166
|
+
{ re: /\bnpm\s*(?:install|安装依赖|安装)/i, cmd: 'npm install', note: '安装项目依赖' },
|
|
167
|
+
{ re: /yarn\s*(?:install|安装|装)\s*(?:依赖)?/i, cmd: 'yarn install', note: '安装项目依赖' },
|
|
168
|
+
{ re: /pnpm\s*(?:install|安装|装)\s*(?:依赖)?/i, cmd: 'pnpm install', note: '安装项目依赖' },
|
|
169
|
+
{ re: /\bgo\s*(?:run|运行)\s*(\S+)?/i, cmd: m => `go run ${m[1] || '<文件>'}`, note: '编译并运行 Go 程序' },
|
|
170
|
+
{ re: /\bgo\s*(?:build|编译|构建)/i, cmd: 'go build ./...', note: '编译当前模块' },
|
|
171
|
+
{ re: /cargo\s*(?:run|运行)/i, cmd: 'cargo run', note: '编译并运行 Rust 项目' },
|
|
172
|
+
{ re: /cargo\s*(?:build|构建|编译)/i, cmd: 'cargo build --release', note: '发布模式构建' },
|
|
173
|
+
{ re: /(?:java\s*(?:-jar|运行)?\s*|运行\s*jar\s*)(\S+\.jar)/i, cmd: m => `java -jar ${m[1]}`, note: '运行 jar 包' },
|
|
174
|
+
{ re: /运行jar(?:包)?\s*(\S+)?|java\s*-jar\s*(\S+)?/i, cmd: m => `java -jar ${m[1] || m[2] || '<文件>'}`, note: '运行 jar 包' },
|
|
175
|
+
{ re: /(?:连接|登录|进入)\s*(?:postgres|postgresql|pgsql)\s*(?:数据库)?\s*(\S+)?/i, cmd: m => `psql -h ${m[1] || '<主机>'} -U <用户> -d <库>`, note: '连接 PostgreSQL' },
|
|
176
|
+
{ re: /redis\s*(?:查看|列出|查询)?\s*(?:键|keys?)\s*(\S+)?/i, cmd: m => `redis-cli KEYS '${m[1] || '*'}'`, note: '列出匹配的键', warn: 'KEYS 可能阻塞 Redis,生产建议用 --scan' },
|
|
177
|
+
{ re: /(?:连接|登录)\s*redis\s*(\S+)?/i, cmd: m => `redis-cli -h ${m[1] || '<主机>'}`, note: '连接 Redis' },
|
|
178
|
+
|
|
146
179
|
{ re: /(?:安装|install)\s*(?:软件|包|程序)?\s*([\w.\-]+)/i, cmd: m => `sudo apt install ${m[1]}`, note: '安装软件包(apt 优先)' },
|
|
147
180
|
{ re: /(?:更新|刷新)\s*(?:软件源|源|apt)/i, cmd: 'sudo apt update', note: '刷新软件源索引' },
|
|
148
181
|
{ re: /(?:升级|更新)(?:系统|所有软件|全部软件)/i, cmd: 'sudo apt upgrade', note: '升级已安装软件包' },
|
|
@@ -192,16 +225,23 @@ export const NL_RULES = [
|
|
|
192
225
|
{ re: /下载文件|下载/i, cmd: 'curl -O <URL>', note: '下载文件(也可用 wget)' },
|
|
193
226
|
{ re: /(?:dns|解析|dig|nslookup)\s*(?:查询)?\s*([\w.\-]+\.[a-z]{2,})/i, cmd: m => `dig ${m[1]}`, note: 'DNS 查询' },
|
|
194
227
|
{ re: /dns查询|dns解析|域名解析/i, cmd: 'dig <域名>', note: 'DNS 查询' },
|
|
195
|
-
{ re: /
|
|
228
|
+
{ re: /nmap\s*(?:扫描)?\s*([\w.\-]+)?|端口扫描/i, cmd: m => `nmap -sT ${m[1] || '<主机>'}`, note: 'TCP 连接扫描目标端口' },
|
|
229
|
+
{ re: /扫描\s*([\w.\-]+)\s*(?:的)?(?:端口|服务)/i, cmd: m => `nmap -sT ${m[1]}`, note: '扫描目标主机的端口' },
|
|
230
|
+
{ re: /whois\s*(?:查询)?\s*([\w.\-]+)?|域名注册信息/i, cmd: m => `whois ${m[1] || '<域名>'}`, note: '查询域名注册信息' },
|
|
231
|
+
{ re: /(?:测试|检查|\bping)\s*(?:网络)?(?:连通|连接)?\s*(?:到)?\s*([\w.\-]+)/i, cmd: m => `ping ${m[1]}`, note: '测试网络连通' },
|
|
196
232
|
{ re: /测试网络连通|网络连通|^ping$/i, cmd: 'ping <主机>', note: '测试网络连通' },
|
|
197
233
|
{ re: /(?:跟踪|追踪)\s*路由\s*(\S+)?|traceroute\s+(\S+)/i, cmd: m => `traceroute ${m[1] || m[2] || '<主机>'}`, note: '跟踪路由' },
|
|
198
|
-
{ re: /(?:查看|显示|查询)?\s*(?:本机|本地|服务器)?\s
|
|
234
|
+
{ re: /(?:查看|显示|查询)?\s*(?:本机|本地|服务器)?\s*\bip\s*(?:地址)?|ifconfig/i, cmd: 'ip addr', note: '查看 IP 地址' },
|
|
199
235
|
{ re: /(?:查看|显示)?\s*(?:路由|网关)(?:表)?/i, cmd: 'ip route', note: '查看路由表' },
|
|
200
236
|
{ re: /防火墙(?:状态|情况)|ufw\s*status/i, cmd: 'sudo ufw status', note: '查看防火墙状态' },
|
|
201
237
|
{ re: /(?:开放|放行|允许|开启)\s*(?:端口|port)\s*(\d{1,5})|(?:开放|放行|允许|开启)\s*(\d{1,5})\s*(?:号?端口|port)/i, cmd: m => `sudo ufw allow ${m[1] || m[2]}`, note: '放行指定端口' },
|
|
202
238
|
{ re: /selinux|getenforce/i, cmd: 'getenforce', note: '查看 SELinux 状态' },
|
|
203
239
|
|
|
204
240
|
// ===== 压缩 / 挂载 / 电源 / 杂项 =====
|
|
241
|
+
{ re: /zstd\s*(?:-d|解压)\s*(\S+)?|(?:解压|解开)\s*(\S+\.zst)/i, cmd: m => `zstd -d ${m[1] || m[2] || '<文件>'}`, note: '解压 zstd 文件' },
|
|
242
|
+
{ re: /zstd\s*(?:压缩)?\s*(\S+)?|(?:压缩|打包)\s*(\S+)\s*(?:为|成)\s*zstd/i, cmd: m => `zstd -19 ${m[1] || m[2] || '<文件>'}`, note: '以最高压缩比压缩' },
|
|
243
|
+
{ re: /(?:解压|解包)\s*(\S+\.7z)|7z\s*(?:解压|x)\s*(\S+)?/i, cmd: m => `7z x ${m[1] || m[2] || '<文件>'}`, note: '解压 7z 压缩包' },
|
|
244
|
+
{ re: /7z\s*(?:压缩|打包|a)|(?:压缩|打包)(?:为|成)?\s*7z/i, cmd: '7z a <名称>.7z <路径>', note: '压缩为 7z' },
|
|
205
245
|
{ re: /(?:压缩|打包)(?:为|成)?\s*([\w.\-]+)\.tar\.gz\s*(\S+)?/i, cmd: m => `tar -czf ${m[1]}.tar.gz ${m[2] || '<路径>'}`, note: '压缩为 tar.gz' },
|
|
206
246
|
{ re: /(?:压缩|打包)(?:为|成)?\s*(?:tar\.gz|tgz|tar包)/i, cmd: 'tar -czf <名称>.tar.gz <路径>', note: '压缩为 tar.gz' },
|
|
207
247
|
{ re: /(?:压缩|打包)(?:为|成)?\s*zip/i, cmd: 'zip -r <名称>.zip <路径>', note: '压缩为 zip' },
|