Nodejs 实现ssh交互,求助

Nodejs 实现ssh交互,求助

现在有一个需求,远程执行一个ssh脚本,该脚本是需要交互的,脚本 echo -n "是否继续运行(y/n): " read ty for ii in $ty do case $ii in yes|y) echo "请稍等,测试接口中
当出现 是否继续运行(y/n): 输入y继续执行,然后通过node判断日志是否执行成功。

现状:使用ssh2 进行执行,能发起,也能将data输出,但到 是否继续运行(y/n): 就停止执行了,y 无法输入和继续返回日志。

有谁知道怎么实现吗?请指教


4 回复

当然可以!在 Node.js 中实现 SSH 交互式会话可以通过 ssh2 模块来完成。ssh2 模块提供了丰富的 API 来处理 SSH 连接和命令执行。为了实现与交互式脚本的对话,我们需要监听数据流并手动处理用户输入。

以下是一个简单的示例代码,展示了如何使用 ssh2 模块实现与 SSH 服务器的交互:

  1. 首先,确保你已经安装了 ssh2 模块:

    npm install ssh2
    
  2. 然后,编写 Node.js 脚本来连接到 SSH 服务器并执行交互式脚本:

    const Client = require('ssh2').Client;
    
    const conn = new Client();
    conn.on('ready', () => {
      console.log('SSH connection established');
      
      // 执行交互式脚本
      conn.exec('sh /path/to/your/script.sh', (err, stream) => {
        if (err) throw err;
        
        let response = '';
        let userInput = 'y'; // 用户输入,这里设置为 'y' 作为示例
    
        stream.on('close', (code, signal) => {
          console.log(`Stream closed with code ${code} and signal ${signal}`);
          conn.end();
        }).on('data', (data) => {
          console.log(`STDOUT: ${data}`);
          response += data;
    
          // 检查是否需要用户输入
          if (response.includes('是否继续运行(y/n):')) {
            stream.write(userInput + '\n'); // 发送用户输入
          }
        }).stderr.on('data', (data) => {
          console.log(`STDERR: ${data}`);
        });
      });
    }).connect({
      host: 'your_ssh_host',
      port: 22,
      username: 'your_username',
      password: 'your_password'
    });
    

解释

  1. 连接到 SSH 服务器:我们创建了一个新的 Client 对象,并使用 .connect() 方法连接到 SSH 服务器。

  2. 执行命令:一旦连接建立,我们使用 .exec() 方法执行远程脚本。stream 对象用于捕获命令的输出。

  3. 处理输出和输入:我们监听 streamdata 事件来捕获标准输出(STDOUT)和标准错误输出(STDERR)。当检测到需要用户输入的地方时,我们向 stream 写入用户的输入(在这个例子中,我们预设用户输入为 'y')。

  4. 关闭连接:当 stream 关闭时,我们结束 SSH 连接。

通过这种方式,你可以实现与 SSH 服务器的交互式对话。你可以根据实际需求调整用户输入的逻辑。


用 expect?? 这是个 shell 命令。

1L正解!用shell+expect来跑!让node来执行shell

要实现与SSH脚本的交互(例如输入y来继续执行),可以使用ssh2模块结合readline模块来处理交互式的输入。以下是一个简单的示例代码,展示如何使用ssh2连接到远程服务器并执行一个需要交互的SSH脚本。

示例代码

首先,确保你已经安装了ssh2模块:

npm install ssh2

然后,你可以使用以下代码来实现SSH交互:

const Client = require('ssh2').Client;
const readline = require('readline');

const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout
});

const conn = new Client();
conn.on('ready', () => {
  console.log('SSH connection established');
  
  // 执行SSH命令
  conn.exec('bash /path/to/your/script.sh', (err, stream) => {
    if (err) throw err;
    
    stream.on('close', (code, signal) => {
      console.log(`Stream closed with code ${code} and signal ${signal}`);
      conn.end();
    }).on('data', (data) => {
      console.log(`STDOUT: ${data}`);
      
      // 检测是否需要用户输入
      if (data.includes("是否继续运行(y/n):")) {
        rl.question("请输入 y 或 n: ", answer => {
          stream.write(answer + '\n');
        });
      }
    }).stderr.on('data', (data) => {
      console.error(`STDERR: ${data}`);
    });
  });
}).connect({
  host: 'your.server.com',
  port: 22,
  username: 'your_username',
  password: 'your_password'
});

解释

  1. 创建SSH客户端:使用ssh2模块创建一个SSH客户端实例。
  2. 连接到服务器:通过调用connect方法连接到远程服务器。
  3. 执行命令:使用exec方法执行远程命令。
  4. 读取输出:监听streamdata事件来读取命令的输出。
  5. 处理交互式输入:当检测到需要交互的地方(如是否继续运行(y/n):)时,使用readline模块来提示用户输入,并将用户的输入写入到命令的输入流中。

以上代码展示了如何实现SSH脚本的交互操作。根据你的具体需求,可能还需要进行一些调整。希望这可以帮助你解决问题!

回到顶部