SSH远程管理服务实战

SSH基本概述
SSH是一个安全协议,在进行数据传输时,会对数据包进行加密处理,加密后在进行数据传输。确保了数据传输安全。那SSH服务主要功能有哪些呢?

1.提供远程连接服务器的服务
2.对传输的数据进行加密

那么除了SSH协议能提供远程连接服务,Telnet也能提供远程连接服务, 那么分别的区别是什么呢?
ssh服务会对传输数据进行加密, 监听在本地22/tcp端口, ssh服务默认支持root用户登录
telnet服务不对数据进行加密, 监听在本地23/tcp端口, Telnet默认不支持root用户登录

为什么不要telnet连接呢?

1
2
3
telnet也可以远程连接,为什么不要telnet连接呢?
1、刚安装完成的系统没有telnet的服务端,只有ssh的服务端,想要使用telnet远程,需要安装
2、telnet是明文传输,不安全 端口是23端口
服务连接方式 服务数据传输 服务监听端口 服务登陆用户
ssh 加密 22/tcp 默认支持root用户登陆
telnet 明文 23/tcp 不支持root用户登陆

写出以下协议端口

1
2
3
4
5
6
7
8
9
10
11
ftp:21
dns:53
ssh:22
telnet:23
mysql:3306
http:80
http:443
rsync:873
pop3收邮件协议:110
smtp邮箱协议端口:25
rdp远程连接windows:3389

SSH相关命令

ssh命令一般都是建立远程连接

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# ssh  远程连接
远程连接的底层就是调用ssh这个命令
ssh -p 22 root@172.16.1.13

-p :指定端口,默认22端口这个选项就可以省略
@:分隔符,分割用户和ip
172.16.1.13 : 可以输入ip或者域名

远程输入执行命令
#注意
1、在第一次建立连接时会进行指纹认证,让输入yes
2、只要没有做免密的情况下,连接自己也需要输入密码
[root@backup ~]# ssh root@10.0.0.7 "ifconfig"
[root@backup ~]# ssh root@10.0.0.7 "ls /root"
root@10.0.0.7's password:
anaconda-ks.cfg
jichu1.sh
jichu.sh
sh

[root@backup ~]# ssh -o strictHostKeyChecking=no root@10.0.0.7 "ifconfig"
-o strictHostKeyChecking=no:忽略指纹认证,直接输入密码

# scp 远程拷贝
scp -r /etc root@10.0.0.7:/tmp
-r:递归,传输目录
-p(小写):保持文件属性,传递过去etc目录下的文件属性不变
-P(大写):指定端口
如果ssh的端口变了 就要加入端口的选项 -P
scp -P 2222 -rp /etc root@10.0.0.7:/tmp

#scp远程拉取文件
scp 10.0.0.31:/backup /tmp

学ssh协议需要一台新的机器

1
2
3
4
5
6
7
8
机器巡检,每台机器一个脚本,发邮件给领导,如果100个服务器 那邮件都满了,一般巡检都是由一个机器完成
[root@backup ~]# ssh root@10.0.0.7 "idf -Th"

可以写一个脚本,就放到web01,执行远程执行的命令
#!/bin/bash
ssh root@10.0.0.7 "idf -Th"
ssh root@10.0.0.8 "idf -Th"
ssh root@10.0.0.31 "idf -Th" 但是要输入密码,没有写入密码的变量,需要做ssh免密验证

SSH免密连接方式

默认情况下,通过ssh客户端命令登陆远程服务器,需要提供远程系统上的帐号与密码,但为了降低密码泄露的机率和提高登陆的方便性,建议使用密钥验证方式。

image-20240517133155314

SSH免密连接方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
1、必须要生成一对密钥对,才能免密连接别人
# 密钥对:由公钥 + 私钥组成
公钥:门锁
私钥:钥匙

m01(10.0.0.61),做管理的机器,以后放巡检脚本用的
# 1.生成密钥对
[root@m01 ~]# ssh-keygen
Enter file in which to save the key (/root/.ssh/id_rsa): // 密钥对存放路径
Your identification has been saved in /root/.ssh/id_rsa. // 私钥
Your public key has been saved in /root/.ssh/id_rsa.pub. // 公钥

[root@m01 ~]# ll ~/.ssh/
-rw------- 1 root root 1675 May 17 11:49 id_rsa // 私钥:钥匙
-rw-r--r-- 1 root root 390 May 17 11:49 id_rsa.pub // 公钥:锁

# 2.免密连接web01
[root@m01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.7
[root@m01 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@172.16.1.8
[root@m01 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@172.16.1.31
[root@m01 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@172.16.1.41
------------------------------------
## ssh-copy-id 底层原理
1)远程创建.ssh目录
免密跳板机
[root@m01 ~]# ssh root@10.0.0.8 'mkdir /root/.ssh'
2)将公钥保存到需要免密控制的机器
[root@web02 ~]# vim /root/.ssh/authorized_keys
ssh-rsa
AAAAB3NzaC1yc2EAAAADAQABAAABAQDXrmYzl1/VAkM6pcAkjwuPzHzzhWKroscKwnGlsWLffgEe/WZT
2mqQqfygUNQmhZF3BLySTRlI/vVZKoLgqKBGr6CbRXPWi1ETKCYpbkK8NCj97wO3SV6Q01GU1sIcFAFV
pXl5O+BapM/tLJVC+5EJqtK+2O1am3PC2/OPxQJJXCYWg9GH4VZhTUK4jQISJX9YRMcY8/HFjhQkgHEA
/O6bFzeEFcfOodVfUKO2cauBLJTNw5UIRvsBX9cH10478pN3+QaZCTab2d43bfGW2A8b/tVXfumCF253
eBrPCA8mt1nAH+YRpPLRS4FovbqQpfFHn/fVR1WLDo5IYIUhbcPP root@m01



ssh-keygen 3个回车
会输出一个ll -a ~/.ssh目录,里面有公钥和私钥文件
我想免密连接哪个机器,我就要把公钥发给谁

只有用ssh连接过别人,自己家目录下就会生成一个.ssh的目录,下次连接就不要输入yes

fingerprint 指纹认证 在.ssh目录下的known_hosts

2、免密连接 把锁发给需要连接的人
ssh-copy-id -i /root/.ssh/id_rsa.pub root@172.16.1.7

-i 指定锁的路径


ssh-copy-id底层原理
会先创建一个 .ssh目录

有这种免密连接的方式,写脚本就容易了,

免密跳板机

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#!/bin/bash
#jumpserver
lb01=10.0.0.5
lb02=10.0.0.6
web01=10.0.0.7
web02=10.0.0.8
web03=10.0.0.9
nfs=10.0.0.31
backup=10.0.0.41
db01=10.0.0.51
m01=10.0.0.61
zabbix=10.0.0.71
menu(){
cat <<-EOF
+-------------------------+
| 1) lb01 |
| 2) lb02 |
| 3) web01 |
| 4) web02 |
| 5) web03 |
| 6) nfs |
| 7) backup |
| 8) db01 |
| 9) m01 |
| 10) zabbix |
| h) help |
+-------------------------+
EOF
}
#菜单函数
menu
#连接函数
connect(){
ping -c 1 -w 1 $1 &>/dev/null
if [ $? -eq 0 ];then
ssh root@$1
else
echo -e "\033[5;4;40;31m 别连了,我的哥,$2:$1机器都没开!!!\033[0m"
fi
}
#控制不让输入ctrl+c,z
trap "" HUP INT TSTP
while true
do
read -p "请输入要连接的主机编号:" num
case $num in
1|lb01)
connect $lb01 lb01
;;
2|lb02)
connect $lb02 lb02
;;
3|web01)
connect $web01 web01
;;
4|web02)
connect $web02 web02
;;
5|web03)
connect $web03 web03
;;
6|nfs)
connect $nfs nfs
;;
7|backup)
connect $backup backup
;;
8|db01)
connect $db01 db01
;;
9|m01)
connect $m01 m01
;;
10|zabbix)
connect $zabbix zabbix
;;
h|help)
clear
menu
;;
close)
break
;;
esac
done