SSH基本原理和免密码登录

SSH 为 Secure Shell 的缩写,由 IETF 的网络工作小组(Network Working Group)所制定;SSH 为建立在应用层和传输层基础上的安全协议。SSH 是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用SSH 协议可以有效防止远程管理过程中的信息泄露问题。SSH最初是UNIX系统上的一个程序,后来又迅速扩展到其他操作平台。SSH在正确使用时可弥补网络中的漏洞。SSH客户端适用于多种平台。

从客户端来看,SSH提供两种级别的安全验证:

第一种级别是基于口令的安全验证

只要你知道自己帐号和口令,就可以登录到远程主机。所有传输的数据都会被加密, 但是不能保证你正在连接的服务器就是你想连接的服务器。这个过程如下:

(1)远程主机收到用户的登录请求,把自己的公钥发给用户。

(2)用户使用这个公钥,将登录密码加密后,发送回来。

(3)远程主机用自己的私钥,解密登录密码,如果密码正确,就同意用户登录。这种方式可能会有别的服务器在冒充真正的服务器,将公钥发送给客户端,客户端就会将密码加密后发送给冒充的服务器,冒充的服务器就可以拿自己的私钥获取到密码,也就是受到“中间人”这种方式的攻击。

值得一说的是当第一次链接远程主机时,会提示您当前主机的”公钥指纹”,询问您是否继续,如果选择继续后就可以输入密码进行登录了,当远程的主机接受以后,该台服务器的公钥就会保存到~/.ssh/known_hosts文件中。

第二种级别是基于密匙的安全验证

需要依靠密匙,也就是你必须为自己创建一对密匙,并把公用密匙放在需要访问的服务器上。如果你要连接到SSH服务器上,客户端软件就会向服务器发出请求,请求用你的密匙进行安全验证。服务器收到请求之后,先在该服务器上你的主目录下寻找你的公用密匙,然后把它和你发送过来的公用密匙进行比较。如果两个密匙一致,服务器就用公用密匙加密“质询”并把它发送给客户端软件。客户端软件收到“质询”之后就可以用你的私人密匙解密再把它发送给服务器。用这种方式,你必须知道自己密匙的口令。但是,与第一种级别相比,第二种级别不需要在网络上传送口令。第二种级别不仅加密所有传送的数据,而且“中间人”这种攻击方式也是不可能的(因为他没有你的私人密匙)。但是整个登录的过程可能需要10秒,但是相比输入密码的方式来说10秒也不长。

那么如何生成自己的一对密钥呢?打开终端执行ssh-keygen,该命令会在~/.ssh/目录下创建id_rsa、id_rsa.pub两个文件,分别为您的公钥和私钥。

将公钥拷贝到服务器的~/.ssh/authorized_keys文件中就可以了。拷贝方法有如下几种:

将公钥通过scp拷贝到服务器上,然后追加到~/.ssh/authorized_keys文件中,这种方式比较麻烦。scp -P 22 ~/.ssh/id_rsa.pub user@host:~/。

通过ssh-copyid程序,ssh-copyid user@host即可,但是这种方式不支持更改端口号(我没找到)。该程序ubuntu系统自带无需安装,其实该程序为一个脚本。

可以通过cat ~/.ssh/id_rsa.pub | ssh -p 22 user@host ‘cat >> ~/.ssh/authorized_keys’,这个也是我比较常用的方法,因为可以更改端口号。

当然还有其他的一些我不知道的方法,只要好用就是好方法。

如果是普通账号,需要在远程账户目录下保证 authorized_keys 为 600 或 644
chmod 600 /home/www/.ssh/authorized_keys

测试

如果你有远程的linux服务器,可以自己尝试一下,如果没有也没关系,可以尝试登录自己的电脑,执行:ssh localhost。当然如果你没有搭建服务器的话会提示错误,执行sudo apt-get install openssh-server安装一个ssh-server,然后就可以使用ssh进行登录了。

27
Jan 2015
AUTHOR WiFeng
CATEGORY Asset
COMMENTS No Comments

artTemplate模板引擎不支持全局函数的解决方案

这几天在使用artTemplate模板引擎,但是发现在定义模板中不能使用全局函数,有点不可思议。经过研读相关文档与源码发现:如果想在模板中使用全局函数,需要在 template.helper 中重新定义一次,自我感觉有些设计缺陷。 

不过找到了修复这个缺陷的解决方案:

第一:修改源代码

// ============================
} else if (helpers[name]) {
	value = "$helpers." + name;
// 全局函数,这里只处理函数,不处理变量,因为有可能全局变量与data中的变量冲突,导致结果出错
} else if (typeof window[name] == "function") {
	// value = "window." + name;
	value = '';
} else {
	value = "$data." + name;
}
// 全局函数不需要重新声明
if (value) {
	headerCode += name + "=" + value + ",";
}
uniq[name] = true;
// ============================

第二:在data参数中定义要使用的函数,这个方法与上面提到的template.helper中重新定义是同一种思路

// ============================
var data = {},html;
function myfun(isAdmin,show){
	return (isAdmin ? "ok" : "no") + show;
}
data.myfun = window.myfun;
html = template('test', data);
document.getElementById('content').innerHTML = html;
// ============================

参考来自:
https://github.com/aui/artTemplate/
https://github.com/aui/artTemplate/wiki/syntax:native

同时也希望作者把这个问题得到更加完善的优化~~

12
Oct 2014
AUTHOR WiFeng
CATEGORY Web
COMMENTS No Comments

Discuz! 自由风格插件

让你的站点个性起来吧。门户、空间、论坛、应用等等每个模块,每个页面都可以使用独有风格。

详情:http://addon.discuz.com/?@tplstyle.plugin


28
Jul 2014
AUTHOR WiFeng
CATEGORY Asset
COMMENTS 2 Comments

简析Javascript变量作用域链

Javascript语言与服务端编程语言有一些不同,比如事件驱动、函数内定义新函数、函数即类、作用域链等等,这些特性促使这门语言相当奇葩。这一小节就来看看这个作用域链。

彻底搞明白作用域链原理,可以让你的程序少一些bug,也会节省一些开发调试时间。下面开始一段简单的代码:

<html>
<head></head>

<body>
<input id="test" type="text" />
</body>

<script>
function $(id) {
	return document.getElementById(id);
}

function fun1() {
	var a= 1;
	function inner() {
	    a++;
	    alert(a);
	}
	$("test").onclick = inner;
}
fun1(); 
</script>

</html>

这是一个非常容易读懂的事件绑定代码,先推测一下每次点击 input 会提示什么内容,然后拿这代码亲自执行一遍,看看你的推测对不对。如果是对,非常恭喜你,如果不对,那就接着往下看吧。

函数 inner 中的 a 没有使用 var 定义,所以执行时会使用当前函数外层的作用域,逐层向外查找,此时发现有定义 var a= 1,就停止查找,此时变量 a  的作用域就是fun1函数内部。此时变量 a 虽然在 函数 fun1 中,但是不会被垃圾回收机制回收掉,这是为什么,请关注 Javascript 变量生命周期。

相关概念:
函数运行在其定义的作用域,而不是执行的作用域。这个与作用域链是一个意思,只是表达方式不同。

24
Mar 2014
AUTHOR WiFeng
CATEGORY Web
COMMENTS No Comments

【转载】MySQL 数据库性能优化之缓存参数优化

在平时被问及最多的问题就是关于 MySQL 数据库性能优化方面的问题,所以最近打算写一个MySQL数据库性能优化方面的系列文章,希望对初中级 MySQL DBA 以及其他对 MySQL 性能优化感兴趣的朋友们有所帮助。

数据库属于 IO 密集型的应用程序,其主要职责就是数据的管理及存储工作。而我们知道,从内存中读取一个数据库的时间是微秒级别,而从一块普通硬盘上读取一个IO是在毫秒级别,二者相差3个数量级。所以,要优化数据库,首先第一步需要优化的就是 IO,尽可能将磁盘IO转化为内存IO。本文先从 MySQL 数据库IO相关参数(缓存参数)的角度来看看可以通过哪些参数进行IO优化:

阅读剩余部分...

19
Jan 2014
AUTHOR WiFeng
CATEGORY Web,DataX
COMMENTS No Comments

如何使用C++开发PHP扩展(下)

上文中介绍了使用C++编写简单PHP扩展的方法,但是更多的情况是业务中已经有独立的 api 库,形式为 libxxx.a / libxxx.so,PHP程序中需要调用这些 api,所以这时就要编写PHP扩展来实现。这时是使用静态库 libxxx.a ,还是使用 libxxx.so 呢 ?常见的做法是使用静态库 libxxx.a ,下面一步一步介绍:

阅读剩余部分...

18
Jan 2014
AUTHOR WiFeng
CATEGORY C/C++,Web
COMMENTS 5 Comments

如何使用C++开发PHP扩展(上)

目前,PHP编程语言也是相当成熟,各种文档,各种问题,只要Google一下,总有你想要的答案。当然“如何开发PHP扩展”的文章也不少,但是很少有专门来介绍使用C++开发PHP扩展的介绍。C++编程语言功能的强大,促使好多公司后台程序选择使用它,因此碰到的大多数情况是需要我们用C++来扩展 PHP。PHP源码中的扩展骨架工具,默认生成的是支持 C 语言,如果要使用C++开发,有些参数需要另行配置。下面将用一个简单的示例来说明。

阅读剩余部分...

16
Jan 2014
AUTHOR WiFeng
CATEGORY C/C++,Web
COMMENTS No Comments

C++动态库和静态库

静态库、动态库均指可复用、可独立功能程序代码的集合。静态库是在链接阶段把库代码包含入可执行文件的方式,动态库是在执行阶段把库代码引入可执行文件的方式。

静态库只需保证在开发者的计算机有正确的库文件,生成的可执行文件体积较大。当初正是为了避免此问题,才开发了动态库技术。各有各的长处,各有各的短肋。针对不同的情况,选择不同的方式吧。

阅读剩余部分...

15
Jan 2014
AUTHOR WiFeng
CATEGORY C/C++
COMMENTS No Comments

编译PHP扩展的两种方式

编译的两种方式其实很简单,这里记录只是为了以后遇到这种情况时不加思索地运用上,而不是花费一些时间去回忆。

C/C++程序编译有两种方式:动态编译、静态编译。PHP 是使用 C/C++程序开发的一门脚本语言,其扩展编译也就脱离不了前面提到的两种,动态、静态。站在PHP程序的角度,动态编译就是扩展生成一个 .so 文件,然后在 php.ini 中加载这个 .so 文件,此时即可调用其中的函数或者是类方法;静态编译就是在安装 PHP 时把其扩展文件内容编译到 PHP 内部,然后不需要做任何事情,就可以直接调用其中的函数或者还是类方法。这二者有什么优缺点呢?采用静态编译方式,程序在调用其函数/类方法时要快一些;采用动态编译方式,在有新扩展需要添加到PHP中时不需要重新编译PHP,只需要编译该扩展下的文件,然后把 .so 文件引入即可。二者均有利弊,使用时视情况而定是最好的方法。下面用Linux 平台下的操作来说明其编译过程。

阅读剩余部分...

8
Dec 2013
AUTHOR WiFeng
CATEGORY C/C++,Web
COMMENTS No Comments

Solr安装与启动

Solr 是一个基于 Lucene 的企业级搜索应用,下面介绍其安装于部署过程,操作系统为:Red Hat 4.1.2-46

阅读剩余部分...

1
Dec 2013
AUTHOR WiFeng
CATEGORY Asset
COMMENTS No Comments