我有一个使用ssh2-npm模块和readline的简单的interactive ssh客户端。在每一行上,我都将数据发送到服务器流,但由于某种原因,输入的命令发送的太多
var Client = require('ssh2').Client;
var readline = require('readline')
var conn = new Client();
conn.on('ready', function() {
console.log('Client :: ready');
conn.shell(function(err, stream) {
if (err) throw err;
// create readline interface
var rl = readline.createInterface(process.stdin, process.stdout)
stream.on('close', function() {
process.stdout.write('Connection closed.')
console.log('Stream :: close');
conn.end();
}).on('data', function(data) {
// pause to prevent more data from coming in
process.stdin.pause()
process.stdout.write('DATA: ' + data)
process.stdin.resume()
}).stderr.on('data', function(data) {
process.stderr.write(data);
});
rl.on('line', function (d) {
// send data to through the client to the host
stream.write(d.trim() + 'n')
})
rl.on('SIGINT', function () {
// stop input
process.stdin.pause()
process.stdout.write('nEnding sessionn')
rl.close()
// close connection
stream.end('exitn')
})
});
}).connect({
host: 'www58.lan',
port: 22,
username: 'gorod',
password: '123qwe'
});
但是每个输入的命令都是重复的。如何做到无重复?非常感谢。
输出:
gorod@www58:~$ ls
ls
temp.sql yo sm_www94
a.out sm_dev1017 System Volume Information
dump20180801 sm_qa1017 www58_sm_2310
dumps sm_www58
gorod@www58:~$
预期输出:
gorod@www58:~$ ls
temp.sql yo sm_www94
a.out sm_dev1017 System Volume Information
dump20180801 sm_qa1017 www58_sm_2310
dumps sm_www58
gorod@www58:~$
当前ssh2
在为交互式shell会话设置伪TTY时不支持通过终端模式(例如禁用远程终端回波(,尽管ssh2-streams
已经支持它。
在将该功能添加到ssh2
之前,至少有两种可能的解决方案:
-
自动将
'stty -echon'
写入shell流一次。这将有效地执行与从一开始就禁用远程终端回显相同的操作,只是stty命令本身将被回显。 -
使用
process.stdin.setRawMode(true)
禁用本地回波,只接收远程终端回波。然而,这有两个缺点:远程终端回显可能会延迟(导致混乱(,并且您将无法通过'SIGINT'
事件处理程序捕获ctrl-c(这可能是一个潜在的功能,因为它将透明地将ctrl-c调度到远程服务器,这在某些情况下可能很有用(。