经常碰到一个概念SSH。下面就通过实际的应用,将SSH的基本概念,基本使用说明清楚。

SSH应用场景

下面就是我碰到的几种情况:

SSH是什么

SSH为Secure Shell的缩写,由IETF的网络工作小组(Network Working Group)所制定;SSH为创建在应用层和传输层基础上的安全协议。传统的网络服务程序,如FTP、POP和Telnet其本质上都是不安全的;而SSH是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。SSH之另一项优点为其传输的数据是经过压缩的,所以可以加快传输的速度。SSH有很多功能,它既可以代替Telnet,又可以为FTP、POP、甚至为PPP提供一个安全的“通道”。

在客户端来看,SSH提供两种级别的安全验证。 第一种级别(基于密码的安全验证),知道帐号和密码,就可以登录到远程主机,并且所有传输的数据都会被加密。但是,可能会有别的服务器在冒充真正的服务器,无法避免被“中间人”攻击。 第二种级别(基于密匙的安全验证),需要依靠密匙,也就是你必须为自己创建一对密匙,并把公有密匙放在需要访问的服务器上。

(摘自《维基百科》)

SSH远程登录服务器

在搭建自己的网站,博客的时候,可能你想远程登录到服务器上,向管理自己电脑上的文件一样管理服务器上的文件(增删该)。可能你还想把其它地方的文件(例如自己本地电脑上,或者其它服务器上)拷贝到服务器上,或者把服务器上的文件拷贝下来。这个时候,你就可以使用SSH。

如何判定服务器是否支持SSH呢?如果在服务器的说明中没有看到,那还是直接问服务器提供者吧。可以肯定,Media Temple是支持SSH的,但是默认情况下是没有启动的。所以必须设置启动。例如我的设置就在网站管理->虚拟主机设置。将“通过SSH访问服务器“的禁用改为其它的,例如改为/bin/bash(chrooted)。同时记得设定一个用户名和密码。

在确定服务器支持SSH,并且服务器已经允许通过SSH访问的情况下,就可以登录服务器了。

[ny@localhost ~]$ ssh 用户名@nienet.com
[ny@localhost ~]$ ssh 用户名@72.10.38.50
......
bash-3.2$ pwd
/
bash-3.2$ ls
anon_ftp  cgi-bin  dev         etc       lib    pd       statistics  tmp  var
bin       conf     error_docs  httpdocs  lib64  private  subdomains  usr  web_users

使用ssh远程登录服务器,@前面的为开启Media Temple支持SSH功能时设定的用户名,@后面的为服务器的IP地址,或者对应的域名(如果已经将域名解析到该IP地址上的话)。 登录之后,使用pwd看看登录之后的位置,ls看看当前位置下的内容,可以看到已经登录到服务器的目录下了。使用exit命令可以退出登录。 下面就可以像操作本地文件一样操作服务器上的文件啦,当然前提是你熟悉linux的基本命令行操作。

如何将本地的文件传送到主机上呢?由于使用SSH,我们需要用到scp命令对本地计算机和SSH服务器上的文件进行交流。

scp <本地文件名> <用户名>@<ssh服务器地址>:<上传保存路径即文件名>
例如:
[ny@localhost ~]$ scp -r vimwiki_linux nieyong@72.10.38.50:/httpdocs/
nieyong@72.10.38.50's password: 
index.wiki                                            100%   52     0.1KB/s   00:00 

将服务器上的文件拷贝到本地计算机,只需要将scp的目的和源对调即可。一定要注意目录的权限。

另外,获取其它服务器上的文件,可以在SSH下面使用wget命令。

基于SSH的git服务器

例如ssh服务器的地址为ny@x.x.x.x,git代码库在ssh服务器上存放的地址为/opt/git目录下,需要存放的git版本控制工程为test。

$git clone --bare test test.git

$scp -r test.git ny@x.x.x.x:/opt/git

$git clone ny@x.x.x.x:/opt/git/test.git //将test工程clone下载到本地 $git push //将本地对test工程的修改上传到ssh服务器的test.git仓库中

SSH和github

版本控制工具git必须使用SSH安全配置,有关git的使用,可以查看git使用笔记。在这里,我们只说明git中SSH的使用。首先,产生一对SSH密钥,包括一个私钥和一个公钥。命令如下:

[ny@localhost .ssh]$ ssh-keygen -C 'nieyong_1947@126.com' -t rsa
[ny@localhost .ssh]$ ls
id_rsa  id_rsa.pub  known_hosts

可以看到,在~/.ssh/目录下,多了两个文件,其中id_rsa是私钥,而id_rsa.pub就是公钥。利用more命令显示出公钥的内容(当然内容是加密过的),然后把这个公钥的内容复制到github网站的账户的SSH Public Key中。

[ny@localhost .ssh]$ more id_rsa.pub 

可以看到,在github账户的SSH Public Key的网页中,可以建立多个Key。这个对于有多个用户很有用。例如,我的系统中有根用户root和普通用户ny,那么为根用户root建立一对密钥,私钥位于/root/.ssh/下,为普通用户建立一对密钥,私钥位于/home/ny/.ssh/下。 如果你只建立一对密钥,那么另外一个用户肯定找不到私钥的位置(因为不是默认路径下了),这样使用git push提交的时候,会出现权限不够的提示。

其它参考