前端自动化部署之ssh2和ssh2-sftp-client

ssh2-sftp-client 本身是一个专门用于处理 SFTP文件操作的库,它不直接提供执行远程命令的功能。但是可以通过它的底层依赖库 ssh2 实现执行命令的功能。

以下是实现方法和示例代码:


方法一:使用 ssh2 执行远程命令

ssh2ssh2-sftp-client 的底层库,它支持执行远程命令。

安装依赖

如果尚未安装 ssh2,可以通过以下命令安装:

bash 复制代码
npm install ssh2
代码示例
javascript 复制代码
const { Client } = require('ssh2');

const serverOptions = {
  host: 'your-server-ip',
  port: 22,
  username: 'your-username',
  password: 'your-password', // 或者使用 privateKey
};

const command = 'ls -l /home/cuijiying/log_tools';

const conn = new Client();

conn.on('ready', () => {
  console.log('SSH 连接成功!');
  conn.exec(command, (err, stream) => {
    if (err) throw err;

    stream
      .on('close', (code, signal) => {
        console.log(`命令执行完成,退出代码:${code}`);
        conn.end();
      })
      .on('data', (data) => {
        console.log('输出:\n' + data.toString());
      })
      .stderr.on('data', (data) => {
        console.error('错误:\n' + data.toString());
      });
  });
}).connect(serverOptions);
输出解释
  • 标准输出通过 stream.on('data') 接收。
  • 错误输出通过 stream.stderr.on('data') 接收。

方法二:结合 ssh2-sftp-clientssh2

如果你同时需要执行命令和进行 SFTP 文件操作,可以同时使用 ssh2ssh2-sftp-client

代码示例
javascript 复制代码
const { Client } = require('ssh2');
const SftpClient = require('ssh2-sftp-client');

const serverOptions = {
  host: 'your-server-ip',
  port: 22,
  username: 'your-username',
  password: 'your-password',
};

const command = 'df -h'; // 示例命令:查看磁盘使用情况
const sftp = new SftpClient();
const conn = new Client();

async function executeCommand() {
  return new Promise((resolve, reject) => {
    conn.on('ready', () => {
      console.log('SSH 连接成功!');
      conn.exec(command, (err, stream) => {
        if (err) return reject(err);

        let output = '';
        stream
          .on('close', (code, signal) => {
            console.log(`命令执行完成,退出代码:${code}`);
            conn.end();
            resolve(output);
          })
          .on('data', (data) => {
            output += data.toString();
          })
          .stderr.on('data', (data) => {
            console.error('错误:\n' + data.toString());
          });
      });
    }).connect(serverOptions);
  });
}

async function main() {
  try {
    // 执行远程命令
    const commandOutput = await executeCommand();
    console.log('命令输出:\n', commandOutput);

    // 使用 SFTP 上传文件
    await sftp.connect(serverOptions);
    await sftp.put('./example.zip', '/home/cuijiying/example.zip');
    console.log('文件上传成功!');
  } catch (err) {
    console.error('操作失败:', err);
  } finally {
    sftp.end();
  }
}

main();

方法三:使用 ssh2 的高级特性(Shell 模式)

如果需要执行多个命令,可以使用 Shell 模式。

代码示例
javascript 复制代码
const { Client } = require('ssh2');

const serverOptions = {
  host: 'your-server-ip',
  port: 22,
  username: 'your-username',
  password: 'your-password',
};

const conn = new Client();

conn.on('ready', () => {
  console.log('SSH 连接成功!');
  conn.shell((err, stream) => {
    if (err) throw err;

    stream
      .on('close', () => {
        console.log('Shell 会话结束');
        conn.end();
      })
      .on('data', (data) => {
        console.log('输出:\n' + data.toString());
      });

    // 执行多个命令
    stream.write('pwd\n');
    stream.write('ls -l\n');
    stream.write('exit\n');
  });
}).connect(serverOptions);

注意事项

  1. 权限问题

    • 确保 SSH 用户具有执行命令的权限。如果是限制用户(如 chroot 环境),可能无法正常执行某些命令。
  2. 命令路径

    • 某些命令可能需要完整路径,例如 /usr/bin/ls 而非 ls
  3. 错误处理

    • 捕获所有异常,并合理处理连接超时或命令失败等问题。
  4. 谨慎使用rm 相关命令

    • 哈哈,这是一个极其危险的命令,不懂得可以自行搜索。

通过以上方法,你可以在 Node.js 环境中使用 ssh2 执行远程命令,同时结合 ssh2-sftp-client 进行文件传输,满足大多数 SSH 操作需求。

相关推荐
Light609 分钟前
性能提升 60%:前端性能优化终极指南
前端·性能优化·图片压缩·渲染优化·按需拆包·边缘缓存·ai 自动化
Jimmy13 分钟前
年终总结 - 2025 故事集
前端·后端·程序员
烛阴14 分钟前
C# 正则表达式(2):Regex 基础语法与常用 API 全解析
前端·正则表达式·c#
roman_日积跬步-终至千里21 分钟前
【人工智能导论】02-搜索-高级搜索策略探索篇:从约束满足到博弈搜索
java·前端·人工智能
GIS之路37 分钟前
GIS 数据转换:使用 GDAL 将 TXT 转换为 Shp 数据
前端
多看书少吃饭44 分钟前
从Vue到Nuxt.js
前端·javascript·vue.js
前端一小卒1 小时前
从 v5 到 v6:这次 Ant Design 升级真的香
前端·javascript
前端不太难2 小时前
《Vue 项目路由 + Layout 的最佳实践》
前端·javascript·vue.js
LYFlied2 小时前
【每日算法】 LeetCode 56. 合并区间
前端·算法·leetcode·面试·职场和发展
想学后端的前端工程师2 小时前
【Vue3组合式API实战指南:告别Options API的烦恼】
前端·javascript·vue.js