Как я могу отправить пароль для сессии ttys0 внутри сессии ssh2, используя stream.write - PullRequest
0 голосов
/ 31 октября 2019

Я пытаюсь поговорить с консольным сеансом внутри сеанса ssh2, используя поток для настройки некоторых вещей на компьютере. Я успешно могу отправить большую часть данных через stream.write, но когда он запрашивает пароль, я всегда получаю «неверный логин».

node index.js
Client :: ready
root@debian:~#
root@debian:~# virsh console testserialcomm_5d899d2b95ca
Connected to domain testserialcomm_5d899d2b95ca
Escape character is ^]


testserialcomm login:

testserialcomm login: root

Password:
994beabda2c5ffb68f0e7ddf455a559f5952

Login incorrect

Я пытался отправить все виды вариаций \ r \ n \n и \ x0D. Это как отправка новой строки перед тем, как я отправлю действительный пароль. Я также не могу успешно использовать помощник записи readline, поэтому я не уверен, поможет ли это, а не записывать данные в поток raw.

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

let loggedIn = false;//store state of logged in
let connected = false;//to know if we are connected to the virtual machine domain
let configsWritten = false;//to know if we have written configs to virtual machine yet.
let cmd1 = false;
let firstSend = false;//to know if we have sent our intial enter key
let count = 0;



var conn = new Client();
conn.on('ready', function() {
  console.log('Client :: ready')
  conn.shell(function(err, stream) {
    if (err) throw err;
    stream.setEncoding('utf-8')//utf8 helps if a multi-byte character gets split between data chunks
    var rl = readline.createInterface({input: stream})//create readline interface

    stream.on('close', function() {
      console.log('Stream :: close');
      conn.end();
    }).on('data', function(data){
      console.log(data)
    }).on('error', function(err, stream){
      throw err;
    });
    if(!loggedIn && !connected && !firstSend){
      stream.write('\n')//the first bit of data back from the ssh session doesnt have a newline which is required by readline
      //rl.write('stty -echo\n')//prevent server from echoing things back to us
      firstSend = true;
    }
    rl.on('line', (line) => {
      //process.stdout.write(`${line}\n`);
      if(!loggedIn){//begin login sequence
      //console.log('begin login sequence')
         // if(/login\sincorrect/i.test(line)){
         //   lestream.write('root\x0D')
         // }
         if(!connected && !cmd1){
           //console.log('begin get inside vm')
           stream.write('virsh console testserialcomm_5d899d2b95ca\n')//first command issued after login so we get inside the vm
           cmd1 = true;//set this so we don't come back here
         }
         if(/Escape\scharacter\s/i.test(line)){//we are connected to the virtual machine
           //console.log('send enter to get login prompt')
           //\x03\n//send ctrl+c to clear the login prompt in case it has invalid attempts and
           stream.write('\n\n')//press enter a couple times to get login prompt to show
           connected = true;
         }
         if(/login:/i.test(line) && connected){
           //console.log('type root');
           stream.write('root\n')//send container username to login prompt
         }
         if(/password:/i.test(line) && connected){
           //console.log('send container password to login prompt
           stream.write('994beabda2c5ffb68f0e7ddf455a559f5952\n')//send virtual machine password to login prompt
         }
         if((/[a-z0-9]\@[a-z0-9]/i).test(line) && connected){//make sure we are at a root prompt
           loggedIn = true;
         }
      }
    });
  });
}).connect({//initial connection
  host: 'dev.aaaaaaaaaaaaaaaa',
  port: 22,
  username: 'root',
  password: 'aaaaaaaaaaaaa',
  tryKeyboard: true
});

Я ожидаю, что смогу записать пароль впоток и иметь возможность войти в эту консоль и выполнять другие команды.

...