steelbrain / node-ssh

SSH2 with Promises
MIT License
948 stars 94 forks source link

how can i input the password use keyboard-interactive #385

Open BruinK opened 3 years ago

BruinK commented 3 years ago

env

i want to connet to the different host, some of them no config the no password login,so i need to try to connect the host no password firstly, if faild ,i'll use prompts ask the user to input the password to retry.

ssh2

when i use ssh2 to achieve it, the code like this:

conn.on('ready', () => {
 // some code
}).connect({
    host,
    port: 22,
    username,
    tryKeyboard: true,
    authHandler: (methodsLeft, partialSuccess, callback) => {
      prompts([{
        type: 'password',
        name: 'newPassword',
        message: `input the password of ${hostItem}:`,
      }]).then(({newPassword}) => {
        callback({type: 'password', username, password: newPassword})
      })
    },
 })

the code workd very well

node-ssh

the ssh2 hard to exec the multiple command on one connect. but the node-ssh is easy to do that.
when i try to connect , the problem was happen,

 Error: All configured authentication methods failed
    at doNextAuth (E:\workSpace\my-project-name\node_modules\node-ssh\node_modules\ssh2\lib\client.js:413:17)
    at tryNextAuth (E:\workSpace\my-project-name\node_modules\node-ssh\node_modules\ssh2\lib\client.js:484:5)
    at SSH2Stream.onUSERAUTH_FAILURE (E:\workSpace\my-project-name\node_modules\node-ssh\node_modules\ssh2\lib\client.js:597:5)
    at SSH2Stream.emit (events.js:310:20)
    at parsePacket (E:\workSpace\my-project-name\node_modules\ssh2-streams\lib\ssh.js:3682:10)
    at SSH2Stream._transform (E:\workSpace\my-project-name\node_modules\ssh2-streams\lib\ssh.js:701:13)
    at SSH2Stream.Transform._read (_stream_transform.js:191:10)
    at SSH2Stream._read (E:\workSpace\my-project-name\node_modules\ssh2-streams\lib\ssh.js:253:15)
    at SSH2Stream.Transform._write (_stream_transform.js:179:12)
    at doWrite (_stream_writable.js:442:12) {
  level: 'client-authentication'
}

from other issus i knew the authHandler not support so i tyied the onKeyboardInteractive, but obviously,it not be called ,because i can't see the console mark. my code are following:

ssh.connect({
    host,
    username,
    port: 22,
    tryKeyboard: true,
    debug: console.log(),
    onKeyboardInteractive(name, instructions, instructionsLang, prompts, finish) {
      console.log('🔊🚀🚀🚀🔊 ~ RollbackCommand ~', prompts)
      if (prompts.length > 0 && prompts[0].prompt.toLowerCase().includes('password')) {
        prompts([{
          type: 'password',
          name: 'newPassword',
          message: `input the password of ${hostItem}:`,
        }]).then(({newPassword}) => {
          finish([newPassword])
        })
      }
    },
    })

i'm a newcoming ,so i'm not sure it's my code error or i use this API in wrong way. i need some help, thx

SelvakumarDhavaseelan commented 1 year ago

@BruinK Did you get any solution for this ?