Javascript 返回输入而不是命令输出的ssh2
我正在尝试创建一个连接到远程主机并允许运行正常终端命令的web终端。我可以连接到远程服务器和我的理解流。写入(数据)应该是触发命令在远程服务器上运行并返回输出的东西,但是我将输入返回到前端 term.htmlJavascript 返回输入而不是命令输出的ssh2,javascript,node.js,Javascript,Node.js,我正在尝试创建一个连接到远程主机并允许运行正常终端命令的web终端。我可以连接到远程服务器和我的理解流。写入(数据)应该是触发命令在远程服务器上运行并返回输出的东西,但是我将输入返回到前端 term.html <!doctype html> <html> <head> <script src="http://code.jquery.com/jquery-latest.min.js"></script> <scr
<!doctype html>
<html>
<head>
<script src="http://code.jquery.com/jquery-latest.min.js"></script>
<script src="/socket.io/socket.io.js" type="text/javascript" charset="utf-8"></script>
<script type="text/javascript" charset="utf-8">
var socket = io.connect('http://localhost:8080', {query: 'host=IP_Address&port=22&username=user&password=password'});
// Display the resonse from the server
function add_content(str){
console.log(str);
$('div').append('<p>' + $('<div/>').text(str).html() + '</p>');
$(window).scrollTop($('body').height() - $(window).height() + 80);
}
// Backend -> Browser
socket.on('server_data', function(data) {
add_content(data);
});
// Disconnect message
socket.on('disconnect', function() {
add_content('\r\n*** Disconnected from backend***\r\n');
});
// Browser -> Backend
$(function(){
$('form').submit(function(e){
e.preventDefault();
var input = $('input');
socket.emit('client_data', input.val());
input.val('');
return false;
});
$('input').focus();
});
</script>
<style type="text/css">
body, p, input {
font-family: fixed;
font-size: 13px;
border: none;
}
p { white-space: pre; }
p, form, input { margin:0; padding:0; }
input:focus { outline: none; border: none; }
</style>
</head>
<body>
<div></div>
<form>
> <input>
</form>
</body>
</html>
@你能回答这个问题吗?你试过了吗?这就是你想要的东西吗?mcsdex-我确实探索过这个选项,但我对xterm不太满意(顺便说一下,你的例子很好)。我的希望是通过把所有的东西都带回来一步,看看socketio和ssh2自己能做些什么,来建立我对所有这些活动部件的理解。在ssh2中的shell如何实际运行命令并将输出传递回客户端方面,我似乎缺少了一些东西。任何有助于运行这个基本实现的帮助都会大大加深我的理解。谢谢您可能缺少输入/命令末尾的
\n
(模拟按下“回车”键),因为您使用的是交互式shell.shell()
。试试:stream.write(data+'\n')
就是这样!感谢您的帮助,感谢您在ssh2模块上所做的工作。@mscdex-您有机会回答这个问题吗?您试过了吗?这就是你想要的东西吗?mcsdex-我确实探索过这个选项,但我对xterm不太满意(顺便说一下,你的例子很好)。我的希望是通过把所有的东西都带回来一步,看看socketio和ssh2自己能做些什么,来建立我对所有这些活动部件的理解。在ssh2中的shell如何实际运行命令并将输出传递回客户端方面,我似乎缺少了一些东西。任何有助于运行这个基本实现的帮助都会大大加深我的理解。谢谢您可能缺少输入/命令末尾的\n
(模拟按下“回车”键),因为您使用的是交互式shell.shell()
。试试:stream.write(data+'\n')
就是这样!感谢您的帮助,也感谢您在ssh2模块上所做的工作。
var app = require('http').createServer(handler)
var io = require('socket.io')(app);
var fs = require('fs');
var SSHClient = require('ssh2').Client;
var listener = app.listen(8080);
var current_directory = null;
function handler (req, res) {
fs.readFile(__dirname + '/term.html',
function (err, data) {
if (err) {
res.writeHead(500);
return res.end('Error loading term.html');
}
res.writeHead(200);
res.end(data);
});
}
io.on('connection', function(socket) {
var conn = new SSHClient();
conn.on('ready', function() {
socket.emit('server_data', '\r\n*** SSH CONNECTION ESTABLISHED ***\r\n');
conn.shell(function(err, stream) {
if (err)
return socket.emit('server_data', '\r\n*** SSH SHELL ERROR: ' + err.message + ' ***\r\n');
socket.on('client_data', function(data) {
stream.write(data);
});
stream.on('data', function(data) {
socket.emit('server_data', data.toString('binary'));
//console.log('STDOUT: ' + data);
}).stderr.on('data', function(data){
//console.log('STDERR: ' + data);
socket.emit('server_data', data.toString('binary'));
}).on('close', function() {
conn.end();
});
});
}).on('close', function() {
socket.emit('server_data', '\r\n*** SSH CONNECTION CLOSED ***\r\n');
}).on('error', function(err) {
socket.emit('server_data', '\r\n*** SSH CONNECTION ERROR: ' + err.message + ' ***\r\n');
}).connect({
host: socket.handshake.query.host,
port: socket.handshake.query.port,
username: socket.handshake.query.username,
password: socket.handshake.query.password
});
});