我有以下代码:
var sshPromise=require('ssh2-promise');
var x={
host:'host',
username:'username',
password:'mypassword'
};
var ssh=new sshPromise(x);
ssh.connect().then(()=>{
console.log('connected...');
});
//Get a shell session
ssh.shell().then((socket) => {
socket.on('data', (data) => {
console.log(data.toString());
})
//Can write to socket
//console.log('here<--');
socket.write('my password');// <----sending password to enter the server
});
这里试图做的是在连接到服务器后创建一个 shell 会话。连接后,它会询问我密码以访问服务器,我想发送密码,但它什么也没做。
我通过添加console.log('here<--')
做了一些调试,并意识到它在数据到达之前在开始时打印出来,这意味着socket.write('my password')
在数据到达之前执行。
我不知道如何解决这个问题。谁能帮帮我。
编辑:
const socket = await ssh.shell();
const data = await new Promise(resolve => socket.on('data', resolve));
socket.write('my passwordn');
//to fetch next shell output
const data_1= await new Promise(resolve => socket.on('data', resolve));
有没有办法多次调用使用数据,而不是每次需要从 shell 获取输出时创建一个新承诺?
使用async
/await
您可以使用Promise
等待 "data" 事件触发:
const socket = await ssh.shell();
const data = await new Promise(resolve => socket.on('data', resolve));
socket.write('my password');
这样,只有在您data
之后才会调用socket.write
。
如果需要多次使用,可以定义一个函数:
const waitForDataAsync = socket => new Promise(resolve => socket.on('data', resolve));
然后像这样使用:
const socket = await ssh.shell();
const data = await waitForDataAsync(socket);
socket.write('my passwordn');
//to fetch next shell output
const data_1 = await waitForDataAsync(socket);