所谓ssh: 就是secure shell protocol, 22/tcp, 安全的远程登录,实现加密通信,代替传统的 telnet 协议
SSH服务默认使用TCP的22端口,SSH 是较可靠,专为远程登录会话和其他网络服务提供安全性的协议
v1 基于CRC-32做MAC,不安全;man-in-middle
v2 双方主机协议选择安全的MAC方式,基于DH算法做密钥交换,基于RSA或DSA实现身份认证
在目前生产中,这是常用,而且非常重要的一个工具。
首先了解下原理
公钥交换原理
1. 客户端发起链接请求
2. 服务端返回自己的公钥,以及一个会话ID(这一步客户端得到服务端公钥)
3. 客户端生成密钥对 ----- 没有实体文件
4. 客户端用自己的公钥异或会话ID,计算出一个值Res,并用服务端的公钥加密
5. 客户端发送加密后的值到服务端,服务端用私钥解密,得到Res
6. 服务端用解密后的值Res异或会话ID,计算出客户端的公钥(这一步服务端得到客户端公钥)
7. 最终:双方各自持有三个秘钥,分别为自己的一对公、私钥,以及对方的公钥,之后的所有通讯都加密
这里需要了解的是:”验证链接的是否正确的主机:对比他们的哈希值即可
Ssh加密通讯原理
客户端ssh命令
格式 ssh [options...] destination [command]
#常用选项
-p PORT #指定远程服务器的端口,默认22
-b IP #指定本地主机此次连接使用的IP
-v #调试模式,可以追踪此次连接的过程
-C #开启压缩
-F configfile #指定客户端配置文件
-t #强制伪终端分配,可用于在远程系统上执行任意基于屏幕的程序
-o option #以K=V格式指定选项
-i <file> #指定私钥文件路径,实现基于key验证
sh命令是ssh客户端,允许实现对远程系统经验证地加密安全访问
当用户远程连接ssh服务器时,会复制zssh服务器/etc/ssh/ssh_host*key.pub文件中的公钥到客户机的
~/.ssh/know_hosts中。下次连接时,会自动匹配相对应的私钥,不能匹配,将拒绝连接。
首次连接,会显示目标主机的指纹信息,并提示是否继续
#敲yes后会将目标主机的公钥保存在当前用户的~/.ssh/know_hosts 文件中
在客户端机器上可以看到远端主机的公钥
root@ubuntu2204:~# ls -l .ssh/
首次连接时并不能确定远端主机的真伪,但是下载公钥之前可以查看远端的指纹信息
#在连接前,可以先自己连自己,查看一下指纹
将 10.0.0.206 加到其它主机上,将原主机关闭
# ip a a 10.0.0.206/24 dev eth0
# ip a s eth0
#首次连接之后,如果保存了远程主机的公钥,后续远程主机发生了改变,则会提示
#如果远程主机确实发生了改变,则可以删除本地~.ssh/know_host中的对应的公钥
首次连接会下载远程主机公钥
#如果不指定用户名,默认使用当前用户去登录远程主机
在进行远程操作之前,准备工作不可少,提前配置好本地源,安装好所有应用工具,比如vim、 ssh、rsync
我用两台主机作为试验机,
主机是centos 8的系统
另外一台是centos7的系统
EG:
#指定本机IP去连远程主机
~# ssh -b 10.0.0.220 root@10.0.0.150
先连接到,再从1连接2
#ssh -t 1目标ip1 ssh -t 目标ip2
查看
#ss -tn
断开先断2 >> 1
#exit
但是ssh最让很多人使用的原因,可能是它下面的这个功能
SCP命令
用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器,而且scp传输是加密的
格式:scp [options] SRC... DEST/
#常用选项
-C #压缩数据流
-r #递归复制
-p #保持原文件的属性信息
-q #静默模式
-P PORT #指定远程服务器的端口,默认22
EG:三种复制
本地文件复制到远程
#scp /root/test.sh root@10.0.0.151
远程主机文件复制到本地
#scp root@10.0.0.151:/home/jose/test.sh
源和目标都不是本机
#scp jose@10.0.0.157:test.sh root@10.0.0.154:
复制目录
# scp -r /var/log/ root@10.0.0.161:/tmp/
scp -r dir dest/ 复制整个目录
scp -r dir/ dest/ 复制整个目录
scp -r dir/* dest/ 复制目录下的所有文件
EG:
1,在data下执行dd if=/dev/zero of=f1.img bs=1M count=100 连续三次 创建f1 f2 f3三个文件
2,然后创建一个文件夹test 将三个文件都放进文件夹
执行:mv f test/ (说明:f后面的是通配符,f*意思是 所有f开头的文件)**
3.执行: scp -r test/ 10.0.0.3:/data {需要注意的是这里加-r (递归) 意思是将文件夹文件一起拷贝 而3后面的是冒号 :不是分号}
从下图看出,包括文件夹和三个文件,在输完密码后都全部拷贝到了10.0.0.3这台centos7的主机上:
4,这个时候查看ip为10.0.0.3的centos7的主机,可以清楚的看到刚刚从centos8拷贝过来的文件.
5:这个SCP的拷贝方法,感觉确实很好用,
但是如果出现数据变化的情况,如下图
变化前
执行操作,echo >>f1.img让f1.img文件数据变化
变化后
执行scp拷贝:
当其中一个文件数据更新了后,要进行更新,执行后会发现,只是其中一个文件有变化,但是它还 是全部拷贝了一遍,这样是非常低效率的,而cp 命令在复制文件时是全量复制,不管文件有没有改动,都是复制,速度慢,消耗资源
而rsync工具可以基于ssh和rsync协议实现高效率的远程系统之间复制文件,使用安全的shell连接做为传输方式,比scp更快,基于增量数据同步,即只复制两方不同的文件,此工具来自于rsync包
(通信两端主机都需要安装 rsync)
个人看来 rsync之所以优于scp的一点在于,它只拷贝更新后的数据。
主要用法
rsync -av /etc server1:/tmp #复制目录和目录下文件
rsync -av /etc/ server1:/tmp #只复制目录下文件
{ rsync -av dir dest/ #复制整个目录
rsync -av dir/ dest/ #复制目录下所有文件
rsync -av dir/* dest/ #复制目录下所有文件}
增量复制***
# cp /var/log/syslog ./0525
#ll -l ./0525
只复制了新增的syslog 文件
rsync -av /root/0525 root@10.0.0.151:/tmp/
查看目标机 0525属性更新了
ll /tmp/0525/
只复制目录下的文件,不复制目录****
# rsync -av /root/0525/ root@10.0.0.151:/tmp/dira/
EG:
1:只更新f1文件的数据 ,执行命令 rsync -av /data/test/ 10.0.0.3:/data
只有有数据变更的f1被拷贝:
在centos7里查看拷贝结果,已经拷贝成功
*****:test后不加加/ 表示文件夹一起复制,加/只是复制里面的文件