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

如何通过ssh-exec从Node.js向远程脚本传递参数?

解决ssh-exec传递参数时将参数作为字符串而非实际值的问题

我之前也踩过这个坑——直接把参数名硬写到命令字符串里,远程机器只会把它当成字面量字符串,完全不会识别成你本地变量的实际值。下面是几种实用的解决方法,覆盖不同场景:

1. 用ES6模板字符串直接插值(最简单场景)

如果你的参数是普通文本、没有特殊字符,直接用模板字符串把本地变量值插入到命令中就行:

const exec = require('ssh-exec');

// 本地定义的实际参数值
const targetDir = '/var/www/app';
const deployTag = 'v2.1.0';

// 用模板字符串拼接命令和参数,注意给参数加引号避免空格问题
exec(`./deploy.sh "${targetDir}" "${deployTag}"`, {
  host: 'your-remote-server',
  user: 'ssh-username',
  // 其他SSH配置,比如privateKey、port等
}, (err, stdout, stderr) => {
  if (err) {
    console.error('远程执行出错:', err);
    return;
  }
  console.log('脚本执行输出:', stdout);
  if (stderr) console.error('错误信息:', stderr);
});

远程机器收到的命令会是./deploy.sh "/var/www/app" "v2.1.0",能正确读取你的参数值。

2. 处理含特殊字符的参数(安全防注入)

如果参数里有空格、引号、$这类shell特殊字符,直接拼接会导致语法错误,甚至有shell注入风险。这时候用shell-escape工具来安全转义参数:

先安装依赖:

npm install shell-escape

然后在代码中使用:

const exec = require('ssh-exec');
const shellEscape = require('shell-escape');

// 带空格和特殊字符的参数
const fileName = 'my report_$2024.txt';
const backupDir = '/backup data/';

// 用数组传递命令和参数,shellEscape会自动处理转义
const command = shellEscape(['./backup.sh', fileName, backupDir]);

exec(command, { /* SSH配置 */ }, (err, stdout) => {
  // 处理执行结果
});

生成的命令会自动转义特殊字符,比如变成./backup.sh 'my report_$2024.txt' '/backup data/',既避免语法错误又保证安全。

3. 传递本地脚本并附带参数

如果你的脚本逻辑比较复杂,不想依赖远程机器上的脚本文件,可以把本地脚本内容和参数一起传给远程执行:

const exec = require('ssh-exec');
const shellEscape = require('shell-escape');

const param = 'production';
// 本地的脚本内容
const localScript = `
#!/bin/bash
echo "当前环境: $1"
# 这里可以写任意脚本逻辑,比如重启服务、修改配置等
`;

// 转义脚本里的单引号,避免破坏远程shell的引号结构
const escapedScript = localScript.replace(/'/g, "'\\''");
// 转义参数
const escapedParam = shellEscape([param]);
// 组合成完整命令
const command = `bash -c '${escapedScript}' -- ${escapedParam}`;

exec(command, { /* SSH配置 */ }, (err, stdout) => {
  // 处理结果
});

核心要点

  • 绝对不要直接写"./script.sh param"这种代码,必须通过插值把本地变量的实际值插入到命令字符串中。
  • 参数来自不可信来源(比如用户输入)时,一定要用转义工具,避免shell注入攻击。

内容的提问来源于stack exchange,提问作者Muhammad Farooq

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:04:10