经常碰到一个概念SSH。下面就通过实际的应用,将SSH的基本概念,基本使用说明清楚。
SSH应用场景
下面就是我碰到的几种情况:
- 搭建wordpress博客,使用了Media Temple作为服务器,使用SSH远程登录服务器。
- 使用git工具进行版本控制,使用github作为代码服务器的时候,需要配置SSH密钥。
- 使用SSH登录交换机,相当于使用telnet登录交换机。
SSH是什么
SSH为Secure Shell的缩写,由IETF的网络工作小组(Network Working Group)所制定;SSH为创建在应用层和传输层基础上的安全协议。传统的网络服务程序,如FTP、POP和Telnet其本质上都是不安全的;而SSH是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。SSH之另一项优点为其传输的数据是经过压缩的,所以可以加快传输的速度。SSH有很多功能,它既可以代替Telnet,又可以为FTP、POP、甚至为PPP提供一个安全的“通道”。
在客户端来看,SSH提供两种级别的安全验证。 第一种级别(基于密码的安全验证),知道帐号和密码,就可以登录到远程主机,并且所有传输的数据都会被加密。但是,可能会有别的服务器在冒充真正的服务器,无法避免被“中间人”攻击。 第二种级别(基于密匙的安全验证),需要依靠密匙,也就是你必须为自己创建一对密匙,并把公有密匙放在需要访问的服务器上。
(摘自《维基百科》)
SSH远程登录服务器
在搭建自己的网站,博客的时候,可能你想远程登录到服务器上,向管理自己电脑上的文件一样管理服务器上的文件(增删该)。可能你还想把其它地方的文件(例如自己本地电脑上,或者其它服务器上)拷贝到服务器上,或者把服务器上的文件拷贝下来。这个时候,你就可以使用SSH。
- 确定服务器支持SSH
如何判定服务器是否支持SSH呢?如果在服务器的说明中没有看到,那还是直接问服务器提供者吧。可以肯定,Media Temple是支持SSH的,但是默认情况下是没有启动的。所以必须设置启动。例如我的设置就在网站管理->虚拟主机设置。将“通过SSH访问服务器“的禁用改为其它的,例如改为/bin/bash(chrooted)。同时记得设定一个用户名和密码。
- SSH登录服务器
在确定服务器支持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传送文件
如何将本地的文件传送到主机上呢?由于使用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。
- 需要先把现有test工程仓库导出为裸仓库 — 即一个不包含当前工作目录的仓库。做法直截了当,克隆时用 --bare 选项即可。裸仓库的目录名一般以.git结尾。
$git clone --bare test test.git
- 将导出的裸仓库test.git上传到ssh服务器的/opt/git目录下
$scp -r test.git ny@x.x.x.x:/opt/git
- 下面就可以从任何可以登录该ssh服务器的地方clone,push该工程
$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提交的时候,会出现权限不够的提示。