Linux学习的点点滴滴(一)
一、SSH协议介绍
SSH全称是Secure Shell
,是基于网络中应用层的协议,为远程登录会话和其他网络服务提供安全性的协议。SSH使用最多的是远程登录和传输文件,实现此功能的传统协议都不安全(ftp,telnet等),因为它们使用明文传输数据。而SSH在传输过程中的数据是加密的,安全性更高。基于SSH协议的文件传输协议SFTP是安全的,我在后面的学习中也会介绍。
二、工作原理
SSH协议是基于非对称加密方法的,服务器和客户端都会生成自己的公钥和私钥。
- 服务器建立公钥。若远程服务器是新系统,会在/etc/ssh目录下生成一个名为ssh_host_ecdsa_key.pub的公钥,同时生成一个名为ssh_host_ecdsa_key的私钥,这一对就是远程服务器的公钥与私钥。之后每回启动sshd服务的时候,系统会自动在此路径下查找公钥;
- 客户端请求连接。linux或者mac系统可以直接通过自带的shell连接,命令为
ssh user@host
,如果客户端和服务器是相同的用户,则可以省去user,直接使用ssh host; - 服务器发送公钥给客户端。服务器接到请求后,把公钥传给客户端使用;
- 客户端记录服务器公钥并计算自己的公私钥。客户端将服务器传来的公钥记录在~/.ssh/known_hosts中,若是已经记录有该服务器公钥,则比对是否一致,一致后就计算客户端自己的公私钥;
- 客户端发送自己的公钥给服务器。客户端将自己的公钥发送给服务器,这样服务器端就有客户端公钥+服务器自己私钥,客户端就有服务器公钥+客户端自己私钥,组成了非对称加密系统;
- 开始双向加解密。服务器发送数据:用客户端公钥加密,客户端收到数据后用自己私钥解密。客户端发送数据:用服务器公钥加密,服务器收到数据后用自己私钥解密
三、工作过程
- 版本号协商阶段,SSH目前包括 SSH1和SSH2两个版本, 双方通过版本协商确定使用的版本
- 密钥和算法协商阶段,SSH支持多种加密算法, 双方根据本端和对端支持的算法,协商出最终使用的算法
- 认证阶段,SSH客户端向服务器端发起认证请求, 服务器端对客户端进行认证
- 会话请求阶段, 认证通过后,客户端向服务器端发送会话请求
- 交互会话阶段 ,会话请求通过后,服务器端和客户端进行信息的交互
四、认证方式
认证方式主要有两种:密码认证和公钥认证。
密码认证:输入账号密码进行认证。
公钥认证:需要客户端生成一对公私钥,使用ssh-keygen生成,保存在~/.ssh路径下,然后使用指令ssh-copy-id user@host
传到服务器端,以后再登录认证的时候,客户端自动发送公钥给服务器,服务对比一致则通过认证,不要繁琐地输入密码了。
五、具体实现
1. SSH连接成功
在cmd中输入命令:ssh username@ip:port
,根据提示输入密码即可,第一次登录会有验证,输入Yes,再输入密码即可(输入密码不可见)。
2. 安装SSH
有的电脑没有自带的OpenSSH Server,因此要自己下载安装并且配置。
先在终端中输入ssh,看是否已经安装,如下图
那么就可以直接连接了。
如果没有安装,cmd提示未知命令,我们可以先在设置中的应用,点击蓝色小字管理可选功能
,点击添加功能
然后安装OpenSSH Server.一般的默认会安装在电脑的C:\Windows\System32
中,然后添加环境变量:`C:\Windows\System32\OpenSSH``,然后在cmd中启动ssh即可。
若电脑中无法根据上述安装OpenSSH,那么从网络中下载一个OpenSSH的包即可。
如果实在不想这么麻烦,从网络上下载有关SSH的软件也是一种不错的方案,如Xshell(Xshell Download) Termius(Termius Download)等。
Termius长这样:
Xshell长这样:
虽然Termius好看,但是只有SSH功能是免费的,例如SFTP等都是要收费的,Xshell只有SSH连接这一个功能,如果要用SFTP的话,还要下载XFTP这个软件。
3. 通过虚拟机连接SSH
(1)安装虚拟机就不说了,我用的是Ubuntu。
安装完成后如图:
(2)设置虚拟机网络
先设置虚拟机的网络:
端口默认为22,就不用改了。
然后在虚拟机中打开终端(快捷键为Ctrl+Alt+T),一般刚安装的都要更新apt工具包,输sudo apt-get update
,然后输入密码(使用root账户的权限)
(3)安装和设置SSH服务
然后在终端中输入sudo apt-get install openssh-server
,然后输入y安装完成。
继续在终端输入service ssh status
,观察ssh是否启动,如下状态说明已经启动:
或者在终端输入sudo ps -e | grep ssh
.如果没有启动,输入sudo service ssh start
即可启动ssh服务。
(4)修改SSH设置
接着我们就要修改SSH的配置,ssh的配置文件是/etc/ssh/sshd_config
,默认放在/etc/ssh
文件夹中。在Linux中是没有像Windows中有C盘D盘之分的,只有一个根目录/
,/etc
文件夹就是在根目录中的其中一个系统文件夹。
该文件的权限属于root,我们只有读文件的权限,没有修改的权限,因此要用chmod命令修改该文件权限:chmod 777 /etc/ssh/sshd_config
,该命令表示将该文件的权限修改为该用户可读可写可执行,组内用户可读可写可执行,其他用户可读可写可执行。chmod 777表示文件的r,w,x(读、写、执行权限),如果给予全部三个权限,这三个值便全是1,那么111用十进制表示就是7,任何人可对其读写和执行,777就是一个文件的最高权限。对于Linux的文件系统,我以后会慢慢介绍。
然后打开该文件(暂时先不用vim):sudo gedit /etc/ssh/sshd_config
,把配置文件中的找到#PasswordAuthentication no
的注释#
去掉,并且将NO
修改为YES
,将#PermitRootLogin prohibit-password
修改为 PermitRootLogin yes
保存,修改成功。即修改为如下状态:
保存后退出,输入service ssh restart
重启服务,这样就设置成功了。
(5)设置SSH连接
连接总得有IP吧,在Linux终端输入ifconfig
查看IP,注意和Windows中的ipconfig
不一样,如果提示没有该命令的话,按照提示安装net-tools
包即可。
用虚拟机的话,所有的IP都是127.0.0.1
,表示本机环回地址,然后在Xshell中连接即可:
用cmd的话,就是ssh [email protected]
同理,连接完成后的Xshell如下: