那阵子在给七亿批量远程管理工具里的「SSH 运维 AI 助手」补东西。这助手的干活方式叫「逐步执行」:AI 每次只给一条命令,客户端把它丢到服务器上真跑,再把真实回显喂回去,AI 看着结果决定下一条。
有天连着撞上两条怪毛病。第一,让 AI 用 heredoc 往服务器写配置,回回只写进去一半,文件末尾报错;第二,让它用 if……fi 包一段判断,直接 syntax error near unexpected token。同一个模型,同样的命令,我手敲进终端里跑,一次过。
我第一反应是模型在乱生成。扒了好几条它给的命令出来看,cat <<'EOF' > /etc/3proxy.cfg … 一直写到收尾的 EOF,规规矩矩,换个手敲都没事。这就怪了:命令对,场景也对,那问题只能在「怎么送下去」这一小段。
回头看,那会儿我调命令发送这一段,脑子里的默认是——AI 给的那段东西,一行就是一条命令。ls、df -h、systemctl status xxx,哪个不是一行一条?于是七亿批量远程管理工具里那段命令发送逻辑写得也直白:把一个代码块按行拆开,一行一条,挨个发下去。
平时这逻辑不出事,因为 AI 平时就是一板一眼地一条一行。可 heredoc、if……fi、行尾加反斜杠的续行,这些天生就跨行。你把 cat <<'EOF' > … 单独发下去,服务器那边等它的正文和收尾的 EOF,等不到,自然把后面几行当成新命令乱解一气;if 那半句孤零零落下去,bash 也照样翻脸。
说白了,AI 说「一条命令」,我心里装的是「一行」,这俩压根不是一回事。
修起来倒不复杂,一句话:一个 sh 代码块 = 一条命令,整块原样发,别再按行切。多行、heredoc、续行,全交给服务器自己去读。改完把之前那两条命令重试了一遍,配置写进去了,if 判断也正常。
顺手还确认了一件事:AI 输出里同一段东西经常出现两次——先给你看一条命令、再一条真正敲进终端执行的,那是它 UI 的固有形式,不是重复。我原来按行切,还顺带把这两条搅在一起过,现在整块发就清爽了。
回看这一段,坑不深,就一个概念的错位:我拿「行」去量「命令」。日常那些单行命令把这事盖得严严实实,直到 heredoc 一脚踩进来才露出来。要是早把「一段等于一条」当默认,能省我小半天。
跟这块相关的还有两篇早先记的:逐步执行为什么不写历史会丢上下文 和 SSH 终端接上 AI 面板。想看七亿批量远程管理工具本身的教程,那边整理得比我这明白。
评论