You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 07:55:01