自学内容网 自学内容网

ssh2详细使用步骤,以及常用方法介绍

开源地址:https://github.com/mscdex/ssh2

ssh2 是一个功能强大的 Node.js 库,用于通过 SSH 协议与远程服务器交互。它支持命令执行、文件上传下载、端口转发等操作,常用于自动化脚本和远程服务器管理。

下面是 ssh2 的详细使用步骤和常用方法介绍。


一、安装

首先,安装 ssh2 模块:

npm install ssh2

二、基本使用步骤

1. 导入模块

const { Client } = require('ssh2');

2. 建立连接

const conn = new Client();

conn
  .on('ready', () => {
    console.log('SSH Connection Ready');
    // 可以在这里执行命令、上传文件等
  })
  .on('error', (err) => {
    console.error('Connection Error:', err);
  })
  .on('close', () => {
    console.log('Connection Closed');
  })
  .connect({
    host: 'your-server-ip',
    port: 22, // SSH 默认端口
    username: 'your-username',
    password: 'your-password', // 或使用 privateKey
  });

三、常用方法

1. 远程命令执行 (exec)

用于在远程服务器上运行命令。

conn.exec('ls -l', (err, stream) => {
  if (err) throw err;
  stream
    .on('close', (code, signal) => {
      console.log(`命令执行完毕: 退出码 ${code}, 信号 ${signal}`);
      conn.end(); // 关闭连接
    })
    .on('data', (data) => {
      console.log('STDOUT:', data.toString());
    })
    .stderr.on('data', (data) => {
      console.error('STDERR:', data.toString());
    });
});

2. 上传文件 (sftp)

通过 SFTP 上传文件到远程服务器。

conn.sftp((err, sftp) => {
  if (err) throw err;

  const localFile = './local-file.txt';
  const remoteFile = '/path/to/remote-file.txt';

  sftp.fastPut(localFile, remoteFile, {}, (err) => {
    if (err) {
      console.error('上传失败:', err);
    } else {
      console.log('文件上传成功');
    }
    conn.end();
  });
});

3. 下载文件 (sftp)

通过 SFTP 下载文件到本地。

conn.sftp((err, sftp) => {
  if (err) throw err;

  const remoteFile = '/path/to/remote-file.txt';
  const localFile = './local-file.txt';

  sftp.fastGet(remoteFile, localFile, {}, (err) => {
    if (err) {
      console.error('下载失败:', err);
    } else {
      console.log('文件下载成功');
    }
    conn.end();
  });
});

4. 获取远程目录内容 (sftp)

列出远程目录中的文件和子目录。

conn.sftp((err, sftp) => {
  if (err) throw err;

  const remoteDir = '/path/to/remote-dir';

  sftp.readdir(remoteDir, (err, list) => {
    if (err) {
      console.error('读取目录失败:', err);
    } else {
      console.log('目录内容:', list);
    }
    conn.end();
  });
});

5. 端口转发 (forwardIn)

将远程服务器的端口映射到本地,适用于开发和调试。

conn.on('ready', () => {
  conn.forwardIn('127.0.0.1', 8000, (err) => {
    if (err) throw err;
    console.log('端口转发成功: 远程 127.0.0.1:8000');
  });
}).connect({
  host: 'your-server-ip',
  port: 22,
  username: 'your-username',
  password: 'your-password',
});

6. 转发本地端口到远程 (forwardOut)

将本地端口数据通过 SSH 通道转发到远程服务器。

conn.on('ready', () => {
  conn.forwardOut('127.0.0.1', 8000, 'remote-server-ip', 9000, (err, stream) => {
    if (err) throw err;
    stream.write('Hello Remote Server');
    stream.end();
  });
}).connect({
  host: 'your-server-ip',
  port: 22,
  username: 'your-username',
  password: 'your-password',
});

7. 使用私钥认证

通过私钥进行连接。

conn.connect({
  host: 'your-server-ip',
  port: 22,
  username: 'your-username',
  privateKey: require('fs').readFileSync('/path/to/private-key'),
});

8. 动态代理 (createStream)

通过 ssh2 创建 SOCKS 代理,常用于科学上网。

const socks = require('socksv5');

conn
  .on('ready', () => {
    console.log('SSH ready for SOCKS proxy');
    socks.createServer((info, accept, deny) => {
      conn.forwardOut(info.srcAddr, info.srcPort, info.dstAddr, info.dstPort, (err, stream) => {
        if (err) {
          deny();
          return;
        }
        const clientSocket = accept(true);
        stream.pipe(clientSocket).pipe(stream);
      });
    }).listen(1080, '127.0.0.1', () => {
      console.log('SOCKS proxy listening on 127.0.0.1:1080');
    });
  })
  .connect({
    host: 'your-server-ip',
    port: 22,
    username: 'your-username',
    password: 'your-password',
  });

四、常见问题

  1. 连接失败

    • 检查 hostport 是否正确。
    • 确保远程服务器启用了 SSH 服务。
  2. 权限问题

    • 确保 SSH 用户有足够的权限,必要时使用 sudo(参考之前提到的 -S 方法)。
  3. 性能优化

    • 使用 SFTP 的 fastPutfastGet 替代普通 putget
    • 批量处理文件时,考虑异步调用。

官方文档

更多方法和参数详见 ssh2 官方文档


原文地址:https://blog.csdn.net/weixin_44786530/article/details/145062102

免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!