首页 > 技术文章 > SSH个人小结

w-guangyu 2017-11-05 22:08 原文

 

初学SSH的一些总结,主要来源于谷歌搜索和鸟叔的教程http://cn.linux.vbird.org/linux_server/0310telnetssh_2.php

以及阮一峰的博客http://www.ruanyifeng.com/blog/2011/12/ssh_remote_login.html。

 

SSH(Secure SHell protocol),安全的壳程序协议。介绍它之前,简单介绍一下“非对称密钥系统”,阮一峰的一篇博文讲的非常好,http://www.ruanyifeng.com/blog/2006/12/notes_on_cryptography.html,同时还有一篇数字签名的文章也非常好,一并贴上来http://www.ruanyifeng.com/blog/2011/08/what_is_a_digital_signature.html。

加密方法可以分为两大类。一类是单钥加密(private key cryptography),还有一类叫做双钥加密(public key cryptography)。前者的加密和解密过程都用同一套密码,后者的加密和解密过程用的是两套密码。在单钥加密的情况下,密钥只有一把,所以密钥的保存变得很重要。一旦密钥泄漏,密码也就被破解。在双钥加密的情况下,密钥有两把,一把是公开的公钥,还有一把是不公开的私钥。双密钥加密有以下特点:

a) 公钥和私钥是一一对应的关系,有一把公钥就必然有一把与之对应的、独一无二的私钥,反之亦成立。

b) 所有的(公钥, 私钥)对都是不同的。

c) 用公钥可以解开私钥加密的信息,反之亦成立。

d) 同时生成公钥和私钥应该相对比较容易,但是从公钥推算出私钥,应该是很困难或者是不可能的。

由于每部主机都应该有自己的密钥(公钥与私钥),且公钥用来加密而私钥用来解密,其中私钥不可外流。但因为网络联机是双向的,所以,每个人应该都要有对方的『公钥』才对。

我们如果站在客户端的角度来看,那么,首先你必须要取得服务器端的公钥,然后将自己的公钥发送给服务器端, 最终在客户端上面的密钥会是『服务器的公钥加上客户端我自己的私钥』来组成的。

SSH的联机行为简介:

  • 服务器建立公钥档:每一次启动sshd服务时,该服务会主动去找/etc/ssh/ssh_host*的档案,若系统刚刚安装完成时,由于没有这些公钥档案,因此sshd会主动去计算出这些需要的公钥档案,同时也会计算出服务器自己需要的私钥档;
  • 客户端主动联机要求:若客户端想要联机到ssh服务器,则需要使用适当的客户端程序来联机,包括ssh, pietty等客户端程序;
  • 服务器传送公钥档给客户端:接收到客户端的要求后,服务器便将第一个步骤取得的公钥档案传送给客户端使用(明码传送);
  • 客户端记录/比对服务器的公钥数据及随机计算自己的公私钥:若客户端第一次连接到此服务器,则会将服务器的公钥数据记录到客户端的用户家目录内的~/. ssh/known_hosts 。若是已经记录过该服务器的公钥数据,则客户端会去比对此次接收到的与之前的记录是否有差异。若接受此公钥数据,则开始计算客户端自己的公私钥数据;
  • 回传客户端的公钥数据到服务器端:用户将自己的公钥传送给服务器。此时服务器:『具有服务器的私钥与客户端的公钥』,而客户端则是: 『具有服务器的公钥以及客户端自己的私钥』,在此次联机的服务器与客户端的密钥系统(公钥+私钥)并不一样,所以才称为非对称式密钥系统。
  • 开始双向加解密: (1)服务器到客户端:服务器传送数据时,拿用户的公钥加密后送出。客户端接收后,用自己的私钥解密;

              (2)客户端到服务器:客户端传送数据时,拿服务器的公钥加密后送出。服务器接收后,用服务器的私钥解密。

第4 步骤中,客户端的密钥是随机运算产生于本次联机当中的,所以这次的联机与下次的联机的密钥可能就会不一样。此外在客户端的用户家目录下的~/.ssh/known_hosts 会记录曾经联机过的主机的public key ,用以确认我们是连接上正确的那部服务器。

这样一来,就确保了数据传输的保密性。

 

 

SSH指令

  • 直接登入远程主机

ssh [-o 参数项目] [-p 其他端口] 账号 @ IP

-o:可用的参数有ConnectTimeout=秒数 联机等待的秒数,还有一些其他的。

-p:如果你需要连接的端口不是22,使用该选项

ssh user@host  user指自己的用户名,host指远程主机,如果本地用户名与远程用户名一致,登录时可以省略用户名。

初次登陆需要做的事项在http://cn.linux.vbird.org/linux_server/0310telnetssh_2.php有详细描述,需要时可以参考。

 

  • 模拟FTP 的文件传输方式: sftp

如果你只是想要从远程服务器下载或上传档案,可以使用sftp或scp这两个指令也都是使用ssh的通道(port 22),只是模拟成FTP与复制的动作而已。

sftp user@host

登陆后的操作与ftp基本一致。主要写一下下载和上传指令。

上传:put [本机目录或档案] [远程] 
   put [本机目录或档案] ,如果是这种格式,则档案会放置到目前远程主机的目录下
下载:get [远程主机目录或档案] [本机] 
   get [远程主机目录或档案] ,若是这种格式,则档案会放置在目前本机所在的目录当中

  • 档案异地直接复制: scp

如果已经知道服务器上的档案档名,可以直接通过scp进行复制。

上传:scp [-pr] [-l速率] file [账号@]主机:目录名

下载:scp [-pr] [-l速率] [账号@ ]主机:file 目录名

-p :保留原本档案的权限数据;
-r :复制来源为目录时,可以复制整个目录(含子目录)
-l :可以限制传输的速度,单位为Kbits/s ,例如[-l 800] 代表传输速限100Kbytes/s
注意,上面的两个指令中,目录名都是指文件要“到达”的地方;file都是指要进行操作的文件。

SSH的细节设定可以参考鸟叔的教程,这里先不写。有需要的话会加上。

 

推荐阅读