知识沉淀 · 项目:ops · 源:hermes
ssh host 'bash -lc "..."' 嵌套引号是远程运维第一耗时黑洞:单双反斜杠三层转义,一错就是
bash: 未预期的符号 '(',调半小时才发现是引号不是逻辑。
规则(按安全度排序)
- 能传文件就不内联:
ssh host 'bash -s' < local.sh——脚本本地写、本地 lint、stdin 灌进去,零转义; - 必须内联时先本地 base64:
B=$(base64 < x.sh); ssh host "echo $B | base64 -d | bash"; - 变量只在本地端展开的用双引号外层+转义内层;远端变量(
$HOME之类)永远走单引号; - MySQL DDL 走 stdin heredoc,别
ssh host "mysql -e "ALTER ...""——括号/引号/注释在两层 shell 里必碎; - 多行远端命令写完,先本地
bash -n校验再发。
判据
远程命令失败先问「这是转义坏了还是逻辑错了」:手动登上去跑同一条命令,能通=转义问题,改投递方式而不是改内容。长任务用 nohup ... & 或 detached 会话,别占着 SSH 前台等断线重连。
评论