ssh或mysql等命令支持多行输入:mysql中长语句可分行输入,提示符变为->直至遇分号;ssh可通过分号、&&或||分隔多条命令,或传入多行脚本执行。

ssh 或 mysql 等命令接收多行输入时,
常见错误是结尾的 EOF 前有空格或 tab,导致 shell 一直等待、不执行、最后报 warning: here-document delimited by end-of-file。这不是命令没响应,而是语法没闭合。
真实场景下,比如用 ssh 批量执行远程命令:
EOF
-
sftp的每条命令必须单独成行,不能合并(如pwd; ls不生效) - 部分工具(如旧版
mysql)要求密码通过-p参数传入,不能靠 heredoc 输密码——否则会卡在 password prompt - 如果目标命令本身带交互校验(如
sudo),需提前配置免密或改用sudo -S+echo "$PASS" | sudo -S ...组合,heredoc 无法穿透多层密码提示
变量展开失控?用单引号包住结束标记最省心
默认情况下,cat 里的 $HOME、$(date) 全部会被当前 shell 展开。但如果你往 mysql 或 nginx.conf 里写内容,里面本该保留 $host、$1 这类字面量,一展开就错。
解决办法很简单:把结束标记用单引号括起来,即 。
例如生成一段 Nginx 配置:
cat /etc/nginx/conf.d/app.conf
server {
listen 80;
server_name $host;
location / {
proxy_pass http://backend;
set $myvar "hello";
}
}
CONF
这里所有 $host、$myvar 都原样写入文件,不会被替换。注意:'CONF' 中的单引号只作用于标记名,不影响 heredoc 内容里的单引号使用。
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
脚本里嵌入多行字符串到变量,别漏掉 read -r -d ''
直接用 VAR=$(cat 看似可行,但会吃掉末尾换行;更隐蔽的问题是反斜杠和未配对引号可能被 shell 误解析。
安全做法是用 read 命令配合 -r -d '' 读取整块内容:
read -r -d '' SQL_SCRIPT echo "$SQL_SCRIPT" | mysql -u root mydb
关键点:
-
-r防止反斜杠转义(否则\n变成换行,\t变成 tab) -
-d ''表示以空字符为分隔符,等效于“读到 EOF 为止” - 结尾标记仍需顶格、无空格,且推荐加单引号禁用展开
这种写法在复杂脚本中稳定性高,尤其当内容含 SQL、JSON 或正则表达式时,不容易因隐式解析翻车。










