您的位置:首页 > 其它

【CSDN开源夏令营】 基于Web的SSH客户端,实现跨平台的云服务管理(三)远程登录功能的实现

2014-08-07 21:28 1031 查看

【CSDN开源夏令营】 基于Web的SSH客户端,实现跨平台的云服务管理(三)远程登录功能的实现

         时隔20多天,楼主又开始写博客了

~~这阵子学车学雅思自己天天还坚持游泳健身,搭上女朋友还不踏实,可谓每天是累到吐血。但是本着要为中国开源事业抛头颅洒热血

,不辜负陈子舜导师对我的殷殷期盼

,我还是努力在每天7小时的睡眠中硬生生挤出了2小时投身中国开源事业。希望我挤出的时间能替更多的人去节省时间。这样我就知足了。好了,废话不多说~让我们进入正题~下面我将按照我的思路来阐述我是如何实现远程登录功能的。
 
一.实现思路
我这样写可能有些啰嗦。但是我觉得我这样能让读者有更多的自我思考和自我学习的空间。所以作为一个有职业操守和职业道德的社会好青年来说,我希望有更多的人能看到并且能更看懂我的思路,自己能亲身学到一些东西。
作为一个理工男,逻辑是必不可少的。我做事情的原则就是将一个很难的问题转换为更多个简单的问题。
思路如下:



二.开发前所需的知识储备(思路中所有篮框为所需知识储备)
如果想完成该功能的实现需要下列知识储备:
1.了解基于Web的SSH客户端现有的源码tty.js和gateone的特性。
2.了解nodejs与python的特性。
3.熟悉ssh客户端的功能。
4.①了解tty.js已经实现了的功能。②熟悉大多数linux命令
5.①深入了解node.js编程、websocket编程、ssh协议②读通tty.js源码的每个功能函数的作用及其底层pty.js、term.js、socket.io的功能实现和函数接口。
6.读通tty.js源码的每个功能函数的作用及其底层pty.js、term.js、socket.io的功能实现和函数接口。
7.了解https协议
8.了解跳板机被攻击的各种可能性

下面对这8个问题一一进行介绍。

1.这个我在博客第二章内容有详细介绍。
2.nodejs与python的介绍请详见wiki介绍(由于审核问题,我就不附网址了,wiki一下即可)
3.ssh客户端的功能,玩一下ssh客户端的软件就知道了(比如putty)
4.①tty.js只实现了用linux命令远程操纵服务器主机的功能。②linux命令大全请百度一下
5.①nodejs的快速入门可以参考7天学会nodejs这本书,websocket的功能请看html5的API文档,ssh协议请看wiki。
②这里用一张图介绍一下我增加登陆远程主机前后tty.js的运行机制和底层功能(这个tty.js看的我着实有些头痛,看别人没有写注释的源码真的是一件很痛苦的事情

。。。。楼主看通这个项目源码后感觉整个人都不好了。。。。无论是底层还是它本身完全没有任何有效的注释。而且写法我觉得不是很规范(自认为),也有可能是我才疏学浅了。我认为nodejs应该是一个事件驱动为核心的后台语言,tty.js的代码结构上确体现着功能聚集型的思想)

增加功能前交互流程:



增加功能后交互流程:



底层介绍:
socket.io.js是一个集成html5websocket通讯的nodejs实现。
term.js是一个前台的模拟器界面,但他没有模拟传输ssh协议的功能。他只是一个可以显示后台传来信息的界面,如果界面在焦点状态它可以监听几乎所有按键包括组合按键的输入(如流程1)。他会将输入通过socket.io.js传输给pty.js(如流程2,3)
pty.js实现了模拟ssh传输协议,他可以将命令通过ssh协议发送给服务器的linux主机。并接受返回命令(如流程4,7)
流程介绍:
1.前台在模拟器输入按键被term.js监听
2.term.js将监听的按键信息通过socket.io.js发送
3.socket.io.js将term.js发送的信息传递给pty,js
4.pty.js通过ssh协议将信息发送给linux服务器主机的ssh服务端
5.服务器充当跳板机用ssh命令远程链接用户的linux主机
6.用户远程linux主机通过ssh协议返回信息给服务器主机
7.服务器主机将返回结果通过ssh协议发送给pty.js
8.pty.js使用socket.io.js通讯
9.socket.io.js将来自pty.js的信息传递给term.js
10.term.js收到信息将他打印在前台模拟器窗口中
其中1+2实现了跳过用户键盘输入,直接使用前台javascript通过socket.io直接向pty.js输入命令例如远程登陆命令"ssh -o StrictHostKeyChecking=nouser@ip
\r"来实现登陆
其中在流程10处通过截获筛选返回信息来保证服务器不会暴露不必要的细节给客户。
 
核心代码如下:
1+2箭头左边发送代码
var tty = new EventEmitter;
self.login("ssh -o StrictHostKeyChecking=no "+user.value+"
4000
@"+ip.value+"\r");
setTimeout(function(){ self.login(password.value+"\r");}, 3000);
Tab.prototype.login = function(data) {
        tty.socket.emit('login', this.id, data);
};

3箭头右边接受核心代码
socket.on('login', function(id, data) {
return session.handleData(id, data);
});
<p>Session.prototype.handleData = function(id, data) {
  var terms = this.terms;
  if (!terms[id]) {
    this.warning(''
      + 'Client attempting to'
      + ' write to a non-existent terminal.'
      + ' (id: %s)', id);
    return;
  }</p><p>  terms[id].write(data); //pty.js向ssh写命令
};</p>

 
流程10的核心代码如下
tty.socket.on('data', function(id, data) { ///////////////后台返回信息,可以在这里做write判断。
if (!tty.terms[id]) return;
tty.terms[id].write(data);
if(data.indexOf("Last login")>=0)
{
alert("成功登陆");
form.submit();
}
if(data.indexOf("please try again")>=0)
{
alert("密码错误");
window.location.href="/";
}

if(data.indexOf("Connection timed out")>=0)
{
alert("连接超时");
window.location.href="/";
}
if(data.indexOf("Name or service not known")>=0)
{
alert("未知的主机地址");
window.location.href="/";
}
if(data.indexOf("Invalid argument")>=0)
{
alert("请输入的正确的IP地址");
window.location.href="/";
}

});

https服务器的实现
1.openssl生成证书文件
1.1生成私钥key文件:
openssl genrsa -out privatekey.pem 1024

1.2通过私钥生成CSR证书签名
openssl req -new -key privatekey.pem -out certrequest.csr

1.3通过私钥和证书签名生成证书文件
openssl x509 -req -in certrequest.csr -signkey privatekey.pem -out certificate.pem


2.运行node.js的https服务器
var options = {
key: fs.readFileSync('./privatekey.pem'),
cert: fs.readFileSync('./certificate.pem')
};

https.createServer(options, app).listen(443, function () {
console.log('Https server listening on port ' + 443);
});


 
 
 
效果展示:
登陆前:请无视界面UI。。。。我还没有仔细做



登陆后:点击左上角的小房子可以新建会话,点击旁边的会话按钮可以切换不同的模拟器。按住alt加左键点击会话可以关掉对应的模拟器。



过几天再有时间我会报告文件树的实现方法,这里先发个截图做个预告


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐