如何使用 ssh2-promise 模块节点 js 将命令传递给服务器?



我有以下代码:

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);