Linux嵌套引号下echo字符串及Node.js SSH命令执行问题求助
解决SSH远程执行命令时的引号转义问题
问题根源
你当前的命令因为多层引号嵌套和转义处理不当,导致远程shell解析后无法生成单引号包裹的JSON输出。原命令中的转义字符在传输到远程主机后被提前解析,破坏了预期的引号结构。
解决方案
方案1:调整SSH命令的引号嵌套方式
通过单引号嵌套转义的方式,让远程主机执行echo '{"active":"os1","os1":"3.1.0-r5"}':
ssh user@1.1.1.1 'echo '\''{"active":"os1","os1":"3.1.0-r5"}'\'''
原理:'\''是shell中在单引号字符串里插入单引号的技巧——先结束当前单引号串,用反斜杠转义一个单引号,再重新开启单引号串。
在Node.js的exec中使用时,直接用模板字符串即可:
const { exec } = require('child_process'); exec(`ssh user@1.1.1.1 'echo '\''{"active":"os1","os1":"3.1.0-r5"}'\'''`, (err, stdout) => { if (err) { console.error(err); return; } console.log(stdout.trim()); });
方案2:使用ANSI-C风格引用
借助shell的ANSI-C引用($'...')来简化转义:
ssh user@1.1.1.1 $'echo \'{"active":"os1","os1":"3.1.0-r5"}\''
在Node.js中需要把反斜杠转义一次(因为Node字符串中反斜杠本身需要转义):
const { exec } = require('child_process'); exec(`ssh user@1.1.1.1 $'echo \\\'{"active":"os1","os1":"3.1.0-r5"}\\\''`, (err, stdout) => { if (err) { console.error(err); return; } console.log(stdout.trim()); });
方案3:使用execFile避免转义混乱
如果不想处理复杂的引号转义,推荐用execFile拆分命令和参数,这样不需要手动转义:
const { execFile } = require('child_process'); execFile('ssh', [ 'user@1.1.1.1', 'echo \'{"active":"os1","os1":"3.1.0-r5"}\'' ], (err, stdout) => { if (err) { console.error(err); return; } console.log(stdout.trim()); });
验证效果
执行上述任意方案后,远程输出都会是:
echo '{"active":"os1","os1":"3.1.0-r5"}'
内容的提问来源于stack exchange,提问作者Kevin Tony
相关产品推荐
相关产品推荐

