目录
兼容性
概念
连接符
wait vs sleep
PID = Process ID:进程ID
echo ≈ print
#! vs #
cp vs rsync
cp -r 的“增量合并”指的只是:结构上的合并
rsync 的“增量传输”指的则是:数据块层面的省 IO
-n:模拟
diff:检验
合并参数:删除为例
目录
常用
举例
实时日志
未知环境运行脚本
1. 免疫“无执行权限”报错(最常见的原因)
2. 强行纠正“环境盲区”(防止用错解释器)
3. 忽略脚本第一行的路径报错
caddy
屏蔽报错:2>/dev/null
检查服务死活:curl -I url
替换
🔍 为什么这么写?(简短拆解)
🛡️ 安全稳妥版(推荐,带自动备份)
写入末尾:EOF
全目录搜索(隐藏)文件/目录:find
环境参数、变量:多环境本地开发配置
终端:Gateway(网关)服务
/stop入栈网关:curl
兼容性
| 终端环境 | 兼容性 | 说明 |
|---|---|---|
| Linux(bash/sh/zsh) | ✅ 完全适用 | 标准 Shell 环境 |
| macOS(zsh/bash) | ✅ 大部分适用 | 部分命令参数略有差异(如sed -i需要备份后缀) |
| Windows (CMD) | ❌ 不适用 | 使用完全不同的命令(dirvsls) |
| Windows (PowerShell) | ⚠️ 部分适用 | 支持ls、cat等别名,但底层机制不同 |
| Windows (WSL/Git Bash) | ✅ 适用 | 模拟 Linux 环境 |
| Dockerfile | ⚠️ 有限适用 | 仅RUN/CMD内可使用,且取决于基础镜像的 Shell |
Shell 命令语言(bash/sh)主要在Unix-like 系统(Linux、macOS、WSL)中通用
Dockerfile是一种声明式配置语言,内部嵌套使用 Shell 命令
跨平台问题:写脚本时需要考虑目标环境(例如用
python而不是python3这种差异)
如果想让 Shell 脚本在不同终端都适用,建议:使用 POSIX 标准语法(避免 bash 特有特性)
或用Python等真正的跨平台语言
概念
man test查看完整文档(Linux/Mac)
连接符
| 符号 | 名称 | 执行条件 / 作用 | 示例 |
|---|---|---|---|
| 顺序/逻辑控制 | |||
;或直接换行 | 顺序执行符 | 前者结束(无论成败)则执行后者 | cmd1 ; cmd2 |
&& | 逻辑与 | 前者成功才执行后者 | make && make install |
|| | 逻辑或 | 前者失败才执行后者 | make || echo "Failed" |
| 后台/异步控制 | |||
& | 后台运行符 | 前者后台运行,不等待立即执行后者 | server & client |
| 数据流控制 | |||
| | 管道符 | 把前者的输出作为后者的输入 | cat log.txt | grep "error" |
| 其他常用 | |||
# | 注释符 | 其后的内容为注释,不执行 | # 这是注释 |
\ | 换行转义符 | 将下一行拼接为同一命令 | echo "hello \world" |
wait vs sleep
sleep time #等time秒
wait $PID # 等进程结束
PID = Process ID:进程ID
$$ # 当前 Shell 的 PID $! # 最后一个后台进程的 PID $? # 上一个命令的退出码(0=成功) ps aux | grep node # 可以看到所有进程名带node的 PID kill 12345 # 通过 PID 杀死进程 echo $! # 输出刚启动的进程 PIDecho≈ print
输出内容(默认到终端,类似console.log或print)
echo "Hello World" # 输出: Hello World
echo "错误信息" >&2 # 输出到错误流
echo -n "不换行" # -n 参数不换行
echo $VAR # 输出变量值
#! vs #
普通
#开头的行 → 注释,完全忽略第一行的
#!→ Shebang,告诉系统用哪个程序执行脚本
#!/usr/bin/env zsh #指定zsh执行cp vs rsync
cp 直接覆盖,会占用大量的磁盘 I/O 吞吐量,全新复制或者一次性cp效率更高
rsync只传有变化的内容,需要额外安装,适合大量文件频繁更新
cp -r的“增量合并”指的只是:结构上的合并
rm -rf /root/.hermes/skills/mi-docs && \
cp -r /opt/hermes/built-in-skills/mi-docs /root/.hermes/skills/
当你执行cp -r sourcedir/ destdir/时,如果destdir已经存在:
结构合并:如果源目录有
A、B文件,目标目录有B、C文件。执行后,目标目录会变成A、B、C。那个原本就有的C不会被删掉。从目录结构和结果来看,这叫“合并”或“增量”。底层 IO(关键在这里!):对于那个同名的
B文件,cp的底层绝对不是“增量传输”。不管B的内容有没有变,cp都会无脑地把源端的B重新读一遍,然后强行写过去、把旧的B完全覆盖掉。所以,它在数据传输上是全量覆盖,在目录结果上是同名覆盖、异名并存。
rsync的“增量传输”指的则是:数据块层面的省 IO
同样是处理同名的B文件:
rsync会先看两边B的体积和时间(size+mtime)。如果一样,
rsync连 1 个字节都不会读写,直接跳过!如果不一样,
rsync才会去传那个变动的文件
rsync -a --delete "${SRC}/${dir}/" "${DEST}/${dir}/"
rsync(RemoteSync远程 / 本地文件同步)--delete 会删掉目标区独有的文件,是
rsync独有的参数--checksum:算 MD5 / rolling checksum,再决定是否传输(更精确,但对大目录会慢很多,一般不加)。
-a代表Archive(归档模式)。它是一个“全能组合参数”(等价于
-rlptgoD),作用是一键完美保留文件的所有原生属性。简而言之,加了
-a,复制过去的文件会保持原样:
不退化:递归复制所有子目录和文件。
不变质:保留原文件的修改时间(mtime)、权限(rwx)。
不失真:保留文件的所有者(owner)、所属组(group)以及软链接。
它是
rsync拷贝目录时最常用、最稳健的标配参数。
# 1. 是否安装了 rsync(推荐) command -v rsync && echo "已安装" || echo "未安装" # 2. 看路径 which rsync # 3. 看版本(能输出版本号就说明可用)【通用】 rsync --version | head -1-n:模拟
测试不写盘:rsync -avn --delete ...(dry-run)
验证 --delete:在目标建源没有的文件,干跑应出现 deleting ...
-a(Archive / 归档):全能拷贝。一键完美保留文件的所有原生属性(递归、时间戳、权限等)。-v(Verbose / 详细输出):话痨模式。让rsync把正在比对、传输、删除的每一个文件名和进度都清清楚楚地打印在屏幕上。-n(Dry-Run / 空跑验证):核心免死金牌。告诉系统只做“模拟演习”,绝对不往磁盘写入任何数据,也不删除任何文件。
diff:检验
diff -rq /opt/hermes/built-in-skills/mi-docs /root/.hermes/skills/mi-docs它是用来快速肉眼验证两个文件夹是否已经完全 100% 对齐(镜像一致)的黄金命令。
其中的-rq是两个参数的组合,全称和中文示意如下:
1.-r——Recursive(递归比对)
中文示意:不仅比对当前目录下的文件,还要钻进所有的子文件夹、孙子文件夹里,把里面所有的深层文件全部揪出来逐一进行跨时空比对。
2.-q——Quiet /Brief(静默 / 仅报告差异)
中文示意:这是最关键的参数。普通的
diff会把两个文件里哪一行代码不一样、哪一个字符有错全部密密麻麻地打印出来(刷屏)。而加上-q后,它会变得极其高冷,“只告诉你结果,不废话”。
情况 A:两边完全一致(最完美的景象)
现象:终端一片寂静,什么都没有输出(返回状态码为 0)。
代表含义:恭喜你,
/opt和/root里的这两个技能目录文件一模一样,rsync --delete极其成功!
情况 B:目标区(WFS)多了源区没有的文件
现象:终端会打印:
Only in /root/.hermes/skills/mi-docs: ghost_file.js代表含义:目标区有孤儿文件,说明你的
--delete没生效或者没跑。
情况 C:两边的同名文件内容被修改了
现象:终端会打印:
Files /opt/.../index.js and /root/.../index.js differ代表含义:这两个同名文件的内容不一样,代码被动过了。
合并参数:删除为例
rm 文件 # 删一个文件
rm -r 目录 # 递归删目录(里面所有东西)
rm -f 文件 # 强制删,不确认
rm -rf 目录 # 强制递归删,最常用的组合
-r | recursive | 递归,目录和里面所有内容都删 |
-f | force | 强制,不提示确认,不存在也不报错 |
目录
| 写法 | 含义 | 什么时候用 |
|---|---|---|
~/xxx | 从家目录开始 | 不管当前在哪都能找到 |
/xxx | 从根目录开始 | 固定绝对路径 |
xxx或./xxx | 从当前目录开始 | 你已经cd进去了 |
/是根目录,整台机器的起点/root是root用户的桌面,藏在根目录下面root 是管理员账号,他的家恰好叫
/root
/ ← 根目录,一切从这里开始
├── root/ ← root用户的家(~在root身份下就是这里)
├── home/
│ ├── work/ ← work用户的家(~在work身份下就是这里)
│ └── zhangsan/ ← zhangsan的家
├── opt/ ← 装软件的
├── tmp/ ← 临时文件
└── var/ ← 日志
| 路径 | 英文标准全称 | 一句话大白话定位 | 你的项目影子 |
/opt | Optional | 第三方独立大项目安装区(代码、脚本堆放地) | /opt/hermes/(镜像里的通用代码库) |
/etc | ExtendedToolConfigurations(扩展工具配置) | 全局软件和系统的纯文本配置文件存放区 | /etc/caddy/caddy_config.json |
/bin | Binaries(二进制文件) | 系统和核心用户必用的基础命令(可执行程序) 编译好的、可以直接运行的程序 | /bin/bash(强行调用的 Bash 解释器) |
/usr/bin | UserSystemResourcesBin | 后续安装的第三方软件的命令/程序主入口 | /usr/bin/caddy(Caddy 的可执行二进制文件) |
/root | RootHome | 超级管理员 root 用户的私人专属“家目录” | /root/.hermes/(WFS 云盘挂载的个性化区) |
df命令的英文全称是disk free,查看系统磁盘空间,就像window查看C、D盘一样。
默认的单位是字节(KB),很难人类阅读。所以,在实际开发和运维中,100% 的人都会加上-h参数(human-readable)
Mounted on (挂载点):这个磁盘分区在 Linux 系统里对应的具体文件夹路径。
Filesystem … Mounted on
wfsxxx /root/.openclaw
wfs 持久化,换ip也不会丢
常用
| 命令 | 英文全称 | 中文示意 | 用法示例 | 说明 |
|---|---|---|---|---|
cat | Concatenate | 连接/查看文件 | cat file.txt | 查看文件内容或合并多个文件 |
cd | Change Directory | 切换目录 | cd /home/user | 进入指定目录 |
grep | Global Regular Expression Print | 全局正则匹配打印 | grep "text" file.txt | 在文件中搜索匹配的文本模式 |
| -An/-Bn | After/Before | 紧随前/后的 n 行(Context 上下文) | grep -A5 'DIRS=' /opt/openclaw/sh/custom.sh | 匹配到关键词后,额外展示紧随前/后的 n 行 |
ll | Long Listing (alias) | 详细列表 | ll | 列出文件详细信息(权限、大小、时间等) |
ls | List Segments/List | 列出目录内容 | ls | 显示当前目录下的文件和文件夹 |
ll -al | Long Listing - All Long | 显示所有详细列表 |
| 列出所有文件(包括隐藏文件)的详细信息 |
pwd | Print Working Directory | 打印当前工作目录 | pwd | 显示当前所在的绝对路径 |
mkdir | Make Directory | 创建目录 | mkdir a/b/c | 创建新目录,若目录已存在则报错 |
mkdir -p | Make Directory -Parents | 递归创建目录 | mkdir -p a/b/c | 自动创建路径中所有缺失的父目录,若目录已存在则静默跳过 |
cp | Copy | 复制文件 | cp file1.txt file2.txt | 复制文件,若目标已存在则覆盖(不询问) |
cp -r | Copy - Recursive | 递归复制目录 | cp -r sourcedir/ destdir/ | 复制整个目录(包含所有子文件和子文件夹)。若目标同名文件夹已存在,采用“全量覆盖写入”:同名文件无脑重写覆盖,异名文件保留并存 |
~ | Tilde | 当前登录用户的家目录 | cd ~ | 代表当前用户的home目录,如/root,/home/用户名 |
> | Redirect | 覆盖重定向 | echo "a" > file | 把输出写入文件,覆盖原内容 |
>> | Append Redirect | 追加重定向 | echo "a" >> file | 把输出追加到文件末尾,不覆盖 |
echo | Echo | 输出字符串 | echo "hello" | 打印到屏幕,配合重定向可写文件 |
| which | 命令/可执行程序的安装目录 | which git,which node | which mis |
举例
实时日志
tail -f /var/log/openclaw/out.log
tail (尾巴):Linux 的标准命令,默认用来查看一个文件的最后 10 行。
-f (Follow / 跟随):核心参数。让命令不要结束,而是变成阻塞监听状态。
只想实时看带 ERROR(报错)的日志,可以用管道符把它组合起来:
tail -f /var/log/openclaw/out.log | grep --line-buffered ERROR
未知环境运行脚本
/bin/bash /opt/hermes/scripts/custom.sh
/bin/bash :显式指定用系统里的 Bash 解释器,来强行读取并执行后面的 custom.sh 脚本
运维防御性写法,它主要用来解决以下 3 个痛点:
1. 免疫“无执行权限”报错(最常见的原因)
在 Linux 中,一个脚本要想直接通过./custom.sh运行,它必须拥有可执行权限(x权限)。
+x的英文全称是+ execute(加上执行权限)。
+:表示Add(添加 / 赋予)。
x:代表eXecute(执行 / 运行)。
如果发布代码时忘记执行
chmod +x custom.sh赋予可执行权限,直接运行就会报Permission denied(拒绝访问)错误。破局:如果前面加上了
/bin/bash,系统会认为正在运行的程序是 Bash(Bash 本身绝对有权限),custom.sh只是作为“文本参数”喂给 Bash 读取。这样哪怕custom.sh没有任何执行权限,也能完美正常运行!
2. 强行纠正“环境盲区”(防止用错解释器)
有时候系统默认的sh并不是bash(例如在 Ubuntu/Debian 里,默认的sh叫dash,功能非常阉割)。
如果直接执行,或者有些容器环境在调用时图省事用了
sh custom.sh,脚本里写的很多高级 Bash 语法(比如DIRS=("example")这种数组定义)就会在运行时疯狂报错崩溃。破局:前面死死写住
/bin/bash,就是不给系统任何瞎猜的机会,必须、只能用最纯正的 Bash 去解析。
3. 忽略脚本第一行的路径报错
脚本第一行通常写着#!/usr/bin/env bash或者#!/bin/bash(俗称 释伴 / Shebang)。 如果这个脚本是从 Windows 上编辑过再传到 Linux 上的,它的换行符会变成\r\n。这会导致 Linux 在解析第一行时,误以为你想找一个叫bash\r的解释器,从而报错Command not found。
破局:前面加上
/bin/bash后,系统会直接跳过并忽略脚本第一行的 Shebang 声明,直接从第二行正式代码开始执行,从而规避了这种隐蔽的换行符巨坑。
caddy
chmod 600:Linux 里最高级别的隐私保护权限锁之一,常用于私钥、密码文件
chmod +x /usr/bin/caddy chmod +x /etc/caddy/caddy.sh chmod 600 /etc/caddy/public.key6(4+2) = 拥有者(root):拥有读(4)+写(2)权限。第 1 个
0= 所属用户组:没有任何权限。同组同事打不开、看不了。第 2 个
0= 系统其他路人:没有任何权限。
屏蔽报错:2>/dev/null
if判断ls命令的退出码:
找到至少一个目录 → 退出码0→then执行cp
没找到任何目录 → 退出码非0→ 跳过cp
if ls claw-docker/openclaw/skills/*/ 1>/dev/null 2>&1; then \ cp -r claw-docker/openclaw/skills/* /opt/openclaw/skills/; \ fi && \ 等价于 cp -r claw-docker/openclaw/skills/* /opt/openclaw/skills/ 2>/dev/null || truefi是if的结束标志
1>/dev/null 2>&1的含义
一句话解释:把命令的所有输出(包括正常信息和错误信息)都扔进“黑洞”(/dev/null),屏幕上什么都不显示。
逐部分拆解
| 符号 | 含义 | 数字对应 |
|---|---|---|
1 | 标准输出(stdout) | 正常的命令输出 |
2 | 标准错误(stderr) | 错误提示 |
>/dev/null | 重定向到空设备(丢弃) | - |
&1 | 引用标准输出的目标 | - |
分步理解
1>/dev/null # 把标准输出(正常信息)丢进 /dev/null(屏幕看不到) 2>&1 # 把标准错误(错误信息)也重定向到标准输出的位置 # 而标准输出已经被丢进 /dev/null 了,所以错误也进了 /dev/null
最终效果:无论命令执行成功还是失败,屏幕上都干干净净。
检查服务死活:curl -I url
-I HEAD 发送HTTP HEAD请求,只拿头部信息
替换
在 Linux 终端中,最标准、高效的命令是使用sed。
你可以直接运行以下命令来完成原地修改(直接修改文件内容):
sed -i 's|https://openapi\.com|https://openapi.cn|g' .openclaw/openclaw.json🔍 为什么这么写?(简短拆解)
-i:表示In-place(原地修改)。它会直接修改openclaw.json文件本身,而不是仅仅把结果打印在屏幕上。s|旧内容|新内容|g:这是sed的替换语法。这里使用了竖线
|作为分隔符(通常用/),这样可以避免和网址里的//以及/发生冲突,免去写一堆转义反斜杠的麻烦。g(Global)代表全局替换,即如果一行里出现了多次,全部都会被改掉。
\.:在旧内容中,.(点)在正则表达式里代表任意字符,所以用\.转义了一下,确保只精准匹配点号本身。
🛡️ 安全稳妥版(推荐,带自动备份)
如果你担心改错或者想要留个后路,可以加上一个备份后缀(比如.bak)Bash
sed -i.bak 's|https://openapi\.com|https://openapi.cn|g' .openclaw/openclaw.json运行后,它会修改原文件,同时在同目录下自动生成一个openclaw.json.bak的未修改备份,确认无误后你手动删掉备份即可。
写入末尾:EOF
source /root/.hermes/.env cat >> /opt/hermes/channels/mi/.env << EOF MI_ROBOT_ID=${MI_ROBOT_ID} MI_APP_ID=${MI_APP_ID} MI_SEC_KEY=${MI_SEC_KEY} EOF这段代码的作用是“将环境变量写入配置文件”。它通过source读取系统变量,然后使用一种叫做EOF的技术,把这三个配置项精准地追加到mi插件的.env文件里。
# 设置环境变量,只在当前终端有效 export PROXY_MODE=socket # 验证 echo $PROXY_MODE # 输出 socket # 关掉终端重新打开 → 变量消失1.source /root/.hermes/.env
source(也可以写成一个点.):是 Shell 的内置命令,意思是“加载并执行指定文件中的内容”。大白话:
/root/.hermes/.env这个文件里可能写着诸如ROBOT_ID=123456这样的环境变量。这一句的作用就是把这些变量真正加载到当前的 Linux 会话中,让后面的命令能够读取到它们。
2.cat >> /opt/hermes/channels/mi/.env << EOF
这行命令包含了三个核心部分:
cat:原本是查看文件的命令,但配合后面的符号,在这里变成了“接收输入并输出”。>>(追加重定向):代表“把内容粘到文件的最末尾”。如果文件不存在它会创建;<< EOF(Here Document 技术):标记开始
3. 什么是EOF?
EOF是End Of File(文件结束)的缩写。
它其实只是一个分界符(Marker)。
在脚本里,它的作用就像是一对双引号,只不过双引号只能扩住“一行”字,而<< EOF ... EOF可以扩住“整整一大段、带换行的多行文字”。
全目录搜索(隐藏)文件/目录:find <path> -name "*.log"
1. 从当前目录开始,递归搜索所有.env文件(最常用)Bash
find . -name ".env".:代表从当前目录开始往下找。-name ".env":精准匹配文件名。因为find命令默认就会搜索隐藏文件和隐藏文件夹,所以不需要额外加特殊参数。
2. 搜索整个系统(从根目录/开始全局搜索)
如果你想在整个容器或整台服务器里彻查,需要从/开始。因为有些目录普通用户无权访问,建议加上sudo或屏蔽报错信息:
# 写法 A:使用 sudo 权限(推荐) sudo find / -name ".env" # 写法 B:如果是普通用户,屏蔽掉无权限的报错提示(将错误定向到空设备) find / -name ".env" 2>/dev/null3. 如果你想顺便看看.env文件的具体路径和详细属性
结合-ls参数,可以像ls -l一样列出文件的权限、大小、修改时间以及所属用户:Bash
find . -name ".env" -ls💡 进阶:如果你想顺便搜索.env里面的内容
如果你不仅想找到.env文件,还想顺便看看里面有没有包含某个关键词(比如MI),可以配合grep这样写:
# 找到所有 .env 文件并搜索里面包含 "MI" 的行 find . -name ".env" -exec grep -H "MI" {} \;⚡ 现代替代方案:使用fd工具(如果系统安装了的话)
如果你的系统里安装了现代化的高级搜索工具fd(通常比传统 find 快很多),由于它默认会忽略隐藏文件,你需要加上-H参数:
fd -H ".env"在 Node.js 项目中,package.json里的"scripts"对象就是一个“快捷键映射表”。
{ "main": "index.js", "scripts": { "start": "node index.js", "setup": "node setup.js", "report": "node weeklyReport.js", "sync": "npm run setup && npm run start && npm run report" },npm run start(简写为npm start)是一个快捷命令(别名)。npm 就会在后台执行真正的命令:node index.js(即运行项目根目录下的index.js文件)。
环境参数、变量:多环境本地开发配置
"scripts": { "dev:test": "cross-env BUILD_ENV=test NODE_OPTIONS=--openssl-legacy-provider webpack-dev-server --inline --progress --config build/webpack.dev.conf.js", }cross-env:这是一个跨平台的工具。因为 Windows 和 Mac/Linux 设置环境变量的语法不一样,用它能保证在所有电脑上都能成功设置后面的变量。BUILD_ENV=test / sandbox / prod:唯一的变量!运行在测试环境/沙箱环境/生产环境,调对应环境的后端接口 API。”NODE_OPTIONS=--openssl-legacy-provider:这是一个兼容性补丁。说明你的项目较老(比如 Webpack 3/4),而你电脑的 Node.js 版本较新(Node 17+),不加这一句项目会直接报错崩掉。webpack-dev-server --config ...:这是真正干活的启动命令。利用 Webpack 启动一个本地开发服务器(支持热更新,代码改了浏览器自动刷新)。
终端:Gateway(网关)服务
run.sh
.sh是 Shell 脚本(Shell Script)的标准文件扩展名。 不过需要说明的是,虽然后缀是.sh,但具体用什么 Shell 解释器执行,取决于脚本内部第一行(Shebang)。比如你这个脚本的第一行是:#!/usr/bin/env zsh这代表它实际上指定了用
zsh来执行,而不是最古老的sh或常见的bash。
#!/usr/bin/env zsh # Load nvm export NVM_DIR="$HOME/.nvm" [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # 使用子 Shell 执行,确保执行完(或中断后)回到原目录 cd ../../ && nvm use 22 && PNPM_CONFIG_BLOCK_EXOTIC_SUBDEPS=false OPENCLAW_FORCE_BUILD=1 PROJECT_MOCK_AUTH=1 node scripts/run-node.mjs gateway
[和]组合起来其实是一个判断命令(等同于test命令),如判断是否是目录/脚本
-d代表Directory(目录),-s 代表Shell(脚本)
加载环境:寻找并加载 NVM(Node Version Manager),确保终端可以使用
nvm命令。切换目录:
cd ../../让终端向上跳两级目录(去到项目的根目录)。切换 Node 版本:
nvm use 22自动把当前 Node.js 环境切换到大版本 22。注入环境变量并运行:后面那一长串是大写字母的是环境变量,用来临时改变程序的行为,最后用
node执行了核心脚本。
PNPM_CONFIG_BLOCK_EXOTIC_SUBDEPS=false:允许 pnpm 安装或使用一些非标准的依赖项。OPENCLAW_FORCE_BUILD=1:强制重新编译/构建 OpenClaw(可能涉及一些 C++ 原生模块或前端资源)。PROJECT_MOCK_AUTH=1:开启“PROJECT”服务的 Mock(模拟)身份验证,研发阶段不需要真的去走登录鉴权流程。node scripts/run-node.mjs gateway:用 Node 运行run-node.mjs脚本,并传入参数gateway,正式把网关服务跑起来。
/stop入栈网关:curl
跨域是浏览器内核特有的安全保护机制,命令行数据传输工具curl不受 CORS限制。
curl -s -X POST http://127.0.0.1:18789/api/v1/stop \
-H 'Content-Type: application/json' \
-d '{"sessionKey":"agent:main:meishi:channel:20230fc124e","reason":"security_block"}'
-s:静音模式(Silent)
关闭curl的标准错误输出(stderr)中的进度表和错误信息。
-X POST:指定请求方式(Request Method),默认GET
-H:Header
-d:Data