alanhe421 / coding-note

note
3 stars 1 forks source link

ssh2模块 #404

Open alanhe421 opened 2 years ago

alanhe421 commented 2 years ago

SSH2-JS模块

程序这里使用SSH客户端是https://github.com/mscdex/ssh2

研究客户端实现得到以下几点

  1. SSH Server即服务器决定SSH认证方式允许哪几种,即在认证过程中可以依次尝试多种认证方式,比如密码/公私钥/键盘交互输入
  2. SSH客户端可以控制在允许认证方式范围内,认证方式使用哪一种,当然也就可以控制认证方式的执行顺序
  3. 当前SSH2模块中完整认证方式执行顺序为['none','password','publickey','agent','keyboard-interactive','hostbased']
  4. SSH2模块中在认证握手时,超时时间默认为20000毫秒,如果一直得不到响应即报超时
  5. 超时会有两种可能性,
    • 如果客户端明确了密码登录+键盘登录方式的基础上,密码登录错误,客户端会继续执行keyboard-interactive认证方式时,此时需要客户端继续输入,如果超时未输入即报错
    • 本身ssh登录连接时客户端所在网络环境有影响导致连接建立存在问题,那么也会超时

password vs keyboard-interactive

https://static.1991421.cn/2022/2022-08-21-234258.jpeg

ssh2模块调试

该线上问题虽然并非ssh2模块问题,但这里也贴下ssh2调试方式,具体如下。调试打印出来的信息与命令行方式一致。

debug: (s) => {
console.log('ssh-debug:' + s)
}
alanhe421 commented 1 year ago

执行命令

    sshClient.exec('echo123 https://1991421.cn', (err, stream) => {
      if (err) throw err;
      stream.on('close', (code, signal) => {
        // 如果正常结束,code为0,
        console.log('Stream :: close :: code: ' + code + ', signal: ' + signal);
        sshClient.end();
      }).on('data', (data) => {
        console.log('STDOUT: ' + data);
      }).stderr.on('data', (data) => {
        console.log('STDERR: ' + data);
      });
    });

stderr可以监听非0异常退出的命令错误信息