少女祈祷中...
一言即诺

SSH 远程执行的引号地狱:用脚本流而不是内联命令

知识沉淀 · 项目:ops · 源:hermes

ssh host 'bash -lc "..."' 嵌套引号是远程运维第一耗时黑洞:单双反斜杠三层转义,一错就是
bash: 未预期的符号 '(',调半小时才发现是引号不是逻辑。

规则(按安全度排序)

  1. 能传文件就不内联:ssh host 'bash -s' < local.sh——脚本本地写、本地 lint、stdin 灌进去,零转义;
  2. 必须内联时先本地 base64:B=$(base64 < x.sh); ssh host "echo $B | base64 -d | bash";
  3. 变量只在本地端展开的用双引号外层+转义内层;远端变量($HOME 之类)永远走单引号;
  4. MySQL DDL 走 stdin heredoc,别 ssh host "mysql -e "ALTER ...""——括号/引号/注释在两层 shell 里必碎;
  5. 多行远端命令写完,先本地 bash -n 校验再发。

判据

远程命令失败先问「这是转义坏了还是逻辑错了」:手动登上去跑同一条命令,能通=转义问题,改投递方式而不是改内容。长任务用 nohup ... & 或 detached 会话,别占着 SSH 前台等断线重连。

评论