一. 练习

1、编写脚本,实现批量新增用户,用户名以user开头,具体新增用户数量随用户输入,并且为每个用户设置随机密码(密码长度为12位随机字符组成),记录创建的用户与密码,保存到/tmp/user文件中。

2、如何实现两个字符串的拼接,两个整数求和,以及5除以3,保留2位小数

3、如何计算本机有多少个用户以及多少个普通用户?

4、如何去除字符串中所有空格?

5、备份/var/log/nginx/access.log日志,每五分钟备份一次,并且以2020-11-15_10_05-access.log.tar.gz方式命名。将日志文件备份文件放到/nginx/目录下。

6、查找/etc/目录下10天以内3天以前修改过的文件,并将这些文件记录到/tmp/etc_log文件中

1.1 编写脚本,实现批量新增用户,用户名以user开头,具体新增用户数量随用户输入,并且为每个用户设置随机密码(密码长度为12位随机字符组成),记录创建的用户与密码,保存到/tmp/user文件中

题目1:编写脚本,实现批量新增用户,用户名以user开头,具体新增用户数量随用户输入,并且为每个用户设置随机密码(密码长度为12位随机字符组成),记录创建的用户与密码,保存到/tmp/user文件中。

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
示例1
---------------------------------------------------------------------
read -p "请输入你要添加的用户个数:" num1
for i in `seq $num1` # 注:循环多少次
do
id user$i &>/dev/null
a=`echo $?` # 注:上条命令返回值 0 成功 非0 失败
str1=`date +%s+%N | md5sum|head -c 4` # 注:%s时间戳
if [ $a -eq 0 ] ;then
echo "该用户已存在,不进行新建操作"
break
else
useradd user$str1$i &>/dev/null
b=`echo $?`
if [ $b -eq 0 ];then
echo "创建成功"
passwd1=`mkpasswd -l 12` # 注:mkpasswd 生成随机12位密码串
echo $passwd1 |passwd user$str1$i --stdin &>/dev/null # 注:--stdin 密码从标准输入里面来
echo "user$str1$i:$passwd1" >>/tmp/user
else
echo "创建失败"
fi
fi
done
---------------------------------------------------------------------
[root@cPen_web lianxi]# date +%s+%N # 注:引用纳秒的概念,防止用户名 重复
1605251515+012657467
[root@cPen_web lianxi]# man date
%% a literal %
%a locale's abbreviated weekday name (e.g., Sun) # 注:Sun
%A locale's full weekday name (e.g., Sunday) # 注:Sunday
%s seconds since 1970-01-01 00:00:00 UTC # 注:时间戳 从1970年1月1号到现在的秒数
%N nanoseconds (000000000..999999999) # 注:纳秒 1纳秒=十亿分之一秒
[root@cPen_web ~]# date +%s+N | md5sum|head -c 4
2b13[root@cPen_web ~]#

示例2
---------------------------------------------------------------------
read -p "输入新增用户数:" num
for i in `seq $num`
do
useradd user$i &>/dev/null
passwd=`mkpasswd -l 12`
echo $passwd |passwd user$i --stdin &>/dev/null
echo "用户名:user$i" "密码:$passwd" &>>/tmp/user
done

1.2 如何实现两个字符串的拼接,两个整数求和,以及5除以3,保留2位小数

题目2:如何实现两个字符串的拼接,两个整数求和,以及5除以3,保留2位小数

数值运算:https://blog.csdn.net/weixin_34408624/article/details/92598137
#注:挨在一起写实现2个字符串拼接

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
示例
---------------------------------------------------------------------
[root@cPen_web ~]# a=abc
[root@cPen_web ~]# b=def
[root@cPen_web ~]# echo $a$b # 注:字符串拼接
abcdef
[root@cPen_web ~]# echo abc$a
abcabc
[root@cPen_web ~]# a=3
[root@cPen_web ~]# b=4
[root@cPen_web ~]# echo $(($a+$b))
7
#注:1个括号默认是字符串拼接 不会进行数值运算
[root@cPen_web ~]# a=123 # 注:默认都是str类型
[root@cPen_web ~]# a="123"
[root@cPen_web ~]# a='123'
------------------------------------------------------------
[root@cPen_web ~]# a=123
[root@cPen_web ~]# b=4
[root@cPen_web ~]# echo $(( $a > $b ))
1 # 注:正确返回1
[root@cPen_web ~]# echo $(( $a < $b ))
0 # 注:错误返回0
[root@cPen_web ~]# expr $a + $b # 注:expr命令 进行数值运算
127
[root@cPen_web ~]# echo $(( $a + $b )) # 注:2个圆括号实现整数运算
127
[root@cPen_web ~]# echo $[ $a + $b ] # 注:中括号实现整数运算
127
[root@cPen_web ~]# let c=$a+$b # 注:let 也可以实现整数运算
[root@cPen_web ~]# echo $c # 注:let只能复制 不能直接赋值
127
#注:整数运算:4种方法
[root@cPen_web ~]# expr $a + $b
[root@cPen_web ~]# echo $(( $a + $b ))
[root@cPen_web ~]# echo $[ $a + $b ]
[root@cPen_web ~]# let c=$a+$b # 注:let只能复制 不能直接赋值
数值运算:https://blog.csdn.net/weixin_34408624/article/details/92598137
------------------------------------------------------------------------
#注:小数运算
echo "scale=3;5/3"|bc # 注:3表示保留3位小数 5/3
[root@cPen_web ~]# echo "scale=3;5/3"|bc # 注:确保主机上装了bc
1.666
[root@cPen_web lianxi]# echo $((5/3))
1
[root@cPen_web lianxi]# echo |awk '{printf 5/3}' # 注:awk默认保留5位小数
1.66667[root@cPen_web lianxi]#
[root@cPen_web lianxi]# echo |awk '{printf "%.2f",5/3}' # 注:保留2位小数
1.67[root@cPen_web lianxi]#
数值运算:https://blog.csdn.net/weixin_34408624/article/details/92598137

1.3 如何计算本机有多少个用户以及多少个普通用户?

题目3:如何计算本机有多少个用户以及多少个普通用户?

1
2
3
4
5
6
示例
---------------------------------------------------------------------
#3、如何计算本机有多少个用户以及多少个普通用户?
wc -l /etc/passwd # 注:本机有多少用户
awk -F":" '$3>=1000{print $1}' /etc/passwd |wc -l # 注:本机有多少普通用户
#注:普通用户uid>1000

1.4 如何去除字符串中所有空格?

题目4:如何去除字符串中所有空格?

1
2
3
4
示例
---------------------------------------------------------------------
str="s t r i n g"
echo $str |tr -d " " # 注:-d删除指定字符

1.5 备份/var/log/nginx/access.log日志,每五分钟备份一次,并且以2020-11-15_10_05-access.log.tar.gz方式命名。将日志文件备份文件放到/nginx/目录下

题目5:备份/var/log/nginx/access.log日志,每五分钟备份一次,并且以2020-11-15_10_05-access.log.tar.gz方式命名。将日志文件备份文件放到/nginx/目录下。

#注:确保crontab打开

1
2
3
4
示例
---------------------------------------------------------------------
[root@cPen_web ~]# crontab -e # 注:计划任务里命令最好写绝对路径
*/5 * * * * tar czf /nginx/$(date +%Y-%m-%d_%H_%M-access.log.tar.gz) /var/log/nginx/access.log

1.6 查找/etc/目录下10天以内3天以前修改过的文件,并将这些文件记录到/tmp/etc_log文件中

题目6:查找/etc/目录下10天以内3天以前修改过的文件,并将这些文件记录到/tmp/etc_log文件中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
示例
---------------------------------------------------------------------
[root@cPen_web ~]# find /etc -type f -mtime -10 -mtime +3 # 注:注意 是查找的文件
/etc/dnf/modules.d/python27.module
/etc/selinux/config
/etc/vsftpd/vsftpd.conf
/etc/dconf/db/site
/etc/dconf/db/local
/etc/dconf/db/distro
[root@cPen_web ~]# stat /etc/selinux/config # 注:stat看文件的原信息
………………
最近访问:2020-11-13 10:14:37.388001468 +0800
最近更改:2020-11-05 15:12:05.484883965 +0800
最近改动:2020-11-05 15:12:05.485883965 +0800
[root@cPen_web lianxi]# find /etc -type f -mtime -10 -mtime +3 &>/tmp/etc_log

二. 练习

请用shell写出一个简单的猜拳游戏,枚举值(0石头、1剪刀、2布),有两位选手分别是rob1、rob2,他们的出拳方式由系统自动枚举,并连续猜十盘,最后给出十盘的结果

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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
示例1:判定各种情况 if语句
---------------------------------------------------------------------
#!/bin/bash
echo "猜拳游戏开始啦!!!"
echo "今天我们的两位对手是rob1和rob2"
pingju=0
rob1_win=0
rob2_win=0
for i in `seq 10`
do
a=`echo $[RANDOM%3]`
b=`echo $[RANDOM%3]`
case $a in
0)
c=bor1出的是石头
;;
1)
c=bor1出的是剪刀
;;
2)
c=bor1出的是布
;;
esac
case $b in
0)
d=bor2出的是石头
;;
1)
d=bor2出的是剪刀
;;
2)
d=bor2出的是布
;;
esac
if (($a==$b));then
echo -e "$c\n$d \n他们战平了"
pingju=$[$pingju+1]
continue
fi
if [[ $a -eq 1 || $b -eq 1 ]];then # 注:如果1方出布
if [[ $a -eq 0 || $b -eq 0 ]];then # 注:如果1方出拳头
if (($a>$b));then
echo -e "$c\n$d,rob2获胜"
rob2_win=$[$rob2_win+1]
continue
else
echo -e "$c\n$d,rob1获胜"
rob1_win=$[$rob1_win+1]
continue
fi
fi
fi
if (($a>$b));then
echo -e "$c\n$d,rob1获胜"
rob1_win=$[$rob1_win+1]
else
echo -e "$c\n$d,rob2获胜"
rob2_win=$[$rob2_win+1]
fi

done

echo "rob1获胜次数$rob1_win,rob2获胜次数$rob2_win,平局次数$pingju
============================================================================================

示例2:使用减法
#注:if语句的使用
---------------------------------------------------------------------
for i in `seq 10`
do
rob1=$(($RANDOM%3))
echo rob1=$rob1
rob2=$(($RANDOM%3))
echo rob2=$rob2
if [ $rob1 -eq $rob2 ]
then
echo "平局"
elif [ $(($rob1-$rob2)) -eq -1 ] || [ $(($rob1-$rob2)) -eq 2 ] # 注:rob1赢的情况
then
echo "rob1 win"
else
echo "rob2 win"
fi
done
============================================================================================

示例3
---------------------------------------------------------------------
r1_win=0
r2_win=0
equal=0
for i in `seq 10`
do
echo -ne "$i盘\t"
rob1_res=$(($RANDOM%3))
rob2_res=$(($RANDOM%3))
if [[ $(($rob1_res - $rob2_res)) = -1 ]]; then echo -ne "rob1胜\t" &&r1_win=$(($r1_win + 1)); fi
if [[ $(($rob1_res - $rob2_res)) = 2 ]]; then echo -ne "rob1胜\t" &&r1_win=$(($r1_win + 1)); fi
if [[ $(($rob2_res - $rob1_res)) = -1 ]]; then echo -ne "rob2胜\t" &&r2_win=$(($r2_win + 1)); fi
if [[ $(($rob2_res - $rob1_res)) = 2 ]]; then echo -ne "rob2胜\t" &&r2_win=$(($r2_win + 1)); fi
if [[ $(($rob1_res - $rob2_res)) = 0 ]]; then echo -ne "平局\t" && equal=$(($equal + 1)); fi
[[ $rob1_res = 0 ]] && echo -ne "rob1:石头\t"
[[ $rob1_res = 1 ]] && echo -ne "rob1:剪刀\t"
[[ $rob1_res = 2 ]] && echo -ne "rob1:布\t\t"
[[ $rob2_res = 0 ]] && echo "rob2:石头"
[[ $rob2_res = 1 ]] && echo "rob2:剪刀"
[[ $rob2_res = 2 ]] && echo "rob2:布"
done
echo "rob1胜场:$r1_win"
echo "rob2胜场:$r2_win"
echo "平局场数:$equal"

示例4:生成1个随机数 3以内 不包括3
---------------------------------------------------------------------
#注:生成1个随机数 3以内 不包括3
[root@cPen_web lianxi]# echo $[RANDOM%3]
2
[root@cPen_web lianxi]# echo $[RANDOM%3]
1
[root@cPen_web lianxi]# echo $[RANDOM%3]
0

SSH服务

三. SSH服务介绍

远程Shell应用程序

  • 允许用户在远程机器上执行任意命令

  • 让标准输出在本地

  • 早期明文远程协议:telnet

SSH(Secure Shell,安全的外壳)

  • 为客户机提供安全的Shell环境,用于远程管理

  • 默认端口:TCP 22

SSH基于公钥加密(非对称加密)技术

  • 数据加密传输

  • 客户端和服务器的身份验证

#注:23号端口是明文的,已经淘汰了

.--------------------------------------------------------------------------------------------------------------

ssh是什么?

​ ssh --> secure shell

​ remote login program – 远程登陆模式

​ 对数据进行加密传输的服务,主要用在远程登陆

#注:把数据放到加密好了的壳里面,是安全的协议

.--------------------------------------------------------------------------------------------------------------

ssh协议是应用层协议,根据ssh协议实现的服务叫ssh服务

ssh服务主要在HP-UX,LINUX,AIX,UNIX系统上都有(类UNIX系统上),Windows上没有

#注:ftp协议也是应用层的协议,根据协议实现的服务叫ftp服务

.--------------------------------------------------------------------------------------------------------------

ssh常见的2种登陆方式:

1、密码登陆

2、密钥登陆(免密码登录) # 注:不需要密码

#注:想要登录到那台主机,1、需要知道那台主机ip,2、允许登录,3、网络跟它联通,可以访问到那台主机上

#注:ssh服务默认端口 22号端口 可以去更改

.--------------------------------------------------------------------------------------------------------------

#注:/etc/services 可以查看常用服务的默认端口号

1
2
3
4
[root@cPen_web lianxi]# less /etc/services 
ssh 22/tcp # The Secure Shell (SSH) Protocol
ssh 22/udp # The Secure Shell (SSH) Protocol
#注:一般来说ssh都是使用tcp去传输的

.--------------------------------------------------------------------------------------------------------------

#注:因为它所有的数据都是进行加密的,所以说它是安全的shell

#注:2台主机之间进行数据交互 都会牵扯到 数据包的传输

#注:对别的服务发起一个请求,其实就是相当于发送了1个包给它,这里包里面带有请求

#注:普通情况下不给它加密的话,信息是明文的,是不安全的;ssh服务对数据进行加密,只有a主机和b主机知道解密的方式,其他人不知道

#注:安装好系统后(最小安装),一般来说自带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
示例:查看ssh服务是否启动
---------------------------------------------------------------------------------
1、查看进程
[root@cPen_web lianxi]# ps ef |grep ssh # 注:进程名叫sshd
2、pidof sshd # 注:判定某个服务是否存在pid
[root@cPen_web lianxi]# pidof sshd # 注:服务起来的话必定会有1个pid
2545 2543 2542 2538 2537 2536 909
#服务起来后必定会有1个pid
3、查看网络连接监听状态 netstat
#注:yum install net-tools
[root@cPen_web lianxi]# netstat -atpl |grep ssh # 注:a 所有 ;t tcp ;p 端口
[root@cPen_web lianxi]# netstat -atpln |grep ssh
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 909/sshd
#注:listen状态 在监听中,表示别人可以里来连接我了
tcp 0 0 192.168.0.21:22 192.168.0.42:58697 ESTABLISHED 2536/sshd: root [pr
#注:ESTABLISHED表示已经建立连接了,可以进行数据交换了;
tcp 0 36 192.168.0.21:22 192.168.0.42:58698 ESTABLISHED 2537/sshd: root [pr
tcp6 0 0 :::22 :::* LISTEN 909/sshd

#注:0.0.0.0:22表示在本机所有ip上监听22端口(别人可以通过所有的ip来访问)。如果把它监听到192.168.0.135/24上,那别人只能通过135这个地址来访问我
#注:listen状态 在监听中;表示服务起来了 在监听状态,表示别人可以来连接我了
#注:establish表示有1个客户端连接我了(已经建立连接的状态)
#注:0.0.0.0:*表示允许任意ip,任意端口客户端来连接 (*代表任意端口客户端)
#注:0.0.0.0:22第1种表示本机上所有的ip (本机上的)
#注:0.0.0.0:* 表示允许任意ip,任意端口客户端来连接 (外部客户端的任意端口)(*代表任意端口客户端)
------------------------------------------------------------------------------------------------------
#注:本地回环地址代表本地,测试网卡是否ok 127.0.0.1/8 本地回环地址
#注:网卡实际地址 192.168.0.21/24
#注:别人不可以通过127.0.0.1来访问,因为127.0.0.1代表本地,每一台机器都有一个127.0.0.1本地回环地址,别人通过127.0.0.1来访问,仅仅只是访问的自己

4、lsof -i:22 #注:查看有没有listen状态的监听 ; establish表示连接建立了
#注:知道端口后可以查看端口
#注:lsof -->list open file 列出打开的文件(全称)
[root@cPen_web ~]# lsof -i:22
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 908 root 4u IPv4 27707 0t0 TCP *:ssh (LISTEN) # 注:listen 监听状态
sshd 908 root 6u IPv6 27721 0t0 TCP *:ssh (LISTEN) # 注:ESTABLISHED 建立连接
sshd 1419 root 5u IPv4 29943 0t0 TCP cPen_web:ssh->10.112.68.22:49959 (ESTABLISHED)
sshd 1421 root 5u IPv4 29943 0t0 TCP cPen_web:ssh->10.112.68.22:49959 (ESTABLISHED)
============================================================================================
示例:增加ip地址
[root@cPen_web lianxi]# ip a add 192.168.0.144/24 dev ens33 # 注:增加ip地址
[root@cPen_web lianxi]# ip add # 注:最好跟它同网段
inet 127.0.0.1/8 scope host lo # 注:dev ens3 设备 ens33
inet 192.168.0.21/24 brd 192.168.0.255 scope global dynamic noprefixroute ens33
inet 192.168.0.144/24 scope global secondary ens33
============================================================================================
示例:查看命令属于哪个包
[root@cPen_web lianxi]# which netstat # 注:找到命令的绝对路径
/usr/bin/netstat
[root@cPen_web lianxi]# rpm -qf /usr/bin/netstat # 注:查看这个绝对路径执行文件属于哪个包
net-tools-2.0-0.51.20160912git.el8.x86_64

四. 密钥登陆

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[root@cPen_web ~]# ssh-keygen					# 注:创建密钥对
Generating public/private rsa key pair. # 注:rsa算法生成公钥和私钥的钥匙对(钥匙有2把不是同一把)
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:JZh0IhlTUDkIvuXuv7Iw7zYsoucwfLjpPWrHYN7P63g root@cPen_web
The key's randomart image is:
+---[RSA 2048]----+
| ..=B=.. |
| . o+o= |
| . . o.. . |
| + o |
| . . S |
|.o.. |
|=o*o. |
|.=BXBE |
|=O+*XX+. |
+----[SHA256]-----+
[root@cPen_web ~]#

加密

  1. 对称加密

    ​ 加解密的钥匙都是同一把

    ​ 怎么样安全的保存这个密码,这个密钥在需要加密的机器之间都是共享的

    ​ 很难保证这个密钥不被泄漏

  2. 非对称加密 # 注:加密和解密的钥匙不一样

    ​ 生成一对公私钥,私钥自己保管,公钥可以给其他人

    ​ 公私钥对是成对存在的,一个用于加密,一个用于解密。具体哪个为私钥,哪个为公钥就看使用者自己管理。

注意:

​ 使用公钥进行加密,私钥解密,基本用于数据加密

​ 使用私钥加密公钥解密,用于认证

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
[root@cPen_web ~]# ssh-keygen					# 注:创建密钥对
Generating public/private rsa key pair. # 注:rsa算法生成公钥和私钥的钥匙对(钥匙有2把不是同一把)
Enter file in which to save the key (/root/.ssh/id_rsa): # 注:存放公私钥的路径,root用户的
Enter passphrase (empty for no passphrase): # 注:设置密钥密码 # 注:非全局
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:JZh0IhlTUDkIvuXuv7Iw7zYsoucwfLjpPWrHYN7P63g root@cPen_web # 注:算法hash算法
The key's randomart image is: # 注:信息摘要 用的 SHA256 hash算法
+---[RSA 2048]----+
| ..=B=.. |
| . o+o= |
| . . o.. . |
| + o |
| . . S |
|.o.. |
|=o*o. |
|.=BXBE |
|=O+*XX+. |
+----[SHA256]-----+
[root@cPen_web ~]#
#注:hash算法 任意长度的输入,映射成固定长度的输出
--------------------------------------------------------------------------------------------
#注:加密分为2种方式:1、对称加密;2、非对称加密
#注:对称加密 a机器给b机器传输东西,a机器知道1串密码叫做aa,b机器也知道这个密码叫做aa;a机器对date用aa加密,b机器用aa解密。2个加密解密都用同一个密钥(加密的钥匙A和B都知道)。形式的条件是a和b都知道密钥是什么,且都一样
#注:问题 不能保证密钥不被被人知道

#注:非对称加密 a机器和b机器进行数据加密传输(进行通讯)。a机器在本地生成1个public和private的钥匙对,a机器生成公钥和私钥都放在a机器上,发送数据时,a机器先把公钥给b(也可以把公钥给c,公钥可以给任何人),但是私钥只有自己a机器才知道。b机器用a机器给的公钥加密,a机器收到后用私钥解密
唯一能够解密的钥匙 私钥 只有机器a才有,只有机器a才能解密

#注:对于数据信息加密而言,用公钥加密,用私钥解密,只有机器a才能解密
#注:非对称加密 用于数据加密时,用公钥加密,私钥解密

五. ssh配置

ssh配置

目录:/etc/ssh # 注:这下面放的都是ssh的配置文件

1
2
3
4
5
6
7
8
9
[root@cPen_web ~]# cd /etc/ssh/  
[root@cPen_web ssh]# ls
moduli sshd_config ssh_host_ecdsa_key.pub ssh_host_ed25519_key.pub ssh_host_rsa_key.pub
ssh_config ssh_host_ecdsa_key ssh_host_ed25519_key ssh_host_rsa_key
#注:sshd_config 客户端的配置文件
#注:ssh_config 服务的配置文件
#注:ssh_host_ecdsa_key ssh_host_ecdsa_key.pub 一对公私钥
#注:ssh_host_ecdsa_key.pub 公钥 ssh_host_ecdsa_key私钥
#注:ssh服务起来的时候,它会自动创建1对公私钥
1
2
3
4
5
6
示例:创建的公私钥默认放在/root/.ssh/目录下
[root@cPen_web ~]# cd .ssh
[root@cPen_web .ssh]# ls
id_rsa id_rsa.pub known_hosts
#注:id_rsa 私钥
#注:id_rsa.pub 公钥

六. 实现公钥认证(免密码登录)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#注:a机器下(生成公钥后)
[root@cPen_web ~]# cd .ssh
[root@cPen_web .ssh]# ls
id_rsa id_rsa.pub known_hosts
[root@cPen_web .ssh]# cat id_rsa.pub
ssh-rsa
AAAAB3NhQX......jXDv87iERv/z9XepKCeYqCfF2Dvv0n/g+IeFmzhW0iOppExskimMPGGWcN+7rXWlwaLNTiknmSTl+mFvZV8uIY5DnQXv root@cPen_web
#注:b机器下
[root@cPen_web ~]# mkdir .ssh # 注:没有的话 创建 .ssh文件夹
[root@cPen_web ~]# cd .ssh/
[root@cPen_web .ssh]# ls
known_hosts
[root@cPen_web .ssh]# vim authorized_keys # 注:创建文件authorized_keys
ssh-rsa # 注:把a机器的公钥粘过去
AAAAB3NhQX......jXDv87iERv/z9XepKCeYqCfF2Dvv0n/g+IeFmzhW0iOppExskimMPGGWcN+7rXWlwaLNTiknmSTl+mFvZV8uIY5DnQXv root@cPen_web
[root@cPen_web .ssh]# chmod 600 authorized_keys
#注:给它的权限为600,不要让其他人或者其他组有任何权限
#注:a机器下
[root@cPen_web .ssh]# ssh root@10.122.148.108 # 注:使用客户端 以root用户登录
………………………
Are you sure you want to continue connecting (yes/no)? yes
………………………
[root@cPen_web ~]# # 注:不需要输入密码,就是免密码登录成功

实现公钥认证,免密码登录

A --> B A机器要登录到B机器上

1、在A机器上生成公钥对(如果有公钥对,则不需要重新生成),默认会放在当前用户家目录下的.ssh/文件下

生成一个id_rsa(私钥),id_rsa.pub(公钥)

#注:如果有了,就不需要重新生成公钥对了,因为会覆盖。默认路径不要改它,改它的意义不大,因为默认在默认路径查找

[root@cPen_web ~]# ssh-keygen # 注:生成,中间一直敲回车,选择默认

2、在B机器上目标用户的家目录下面~/.ssh/authorized_keys文件里将A机器的公钥复制粘贴过来,

没有此文件就创建,并且确保这个文件的权限设为600

3、查看公钥认证是否成功

​ 在A机器上执行 ssh root@B机器的ip

​ 不需要输入密码就可以登录到B机器,则表示免密码登录成功

​ 公钥放在B机器的哪个用户下面,就通过哪个用户登录

​ 以哪个用户登录,需要看公钥放到B机器的哪个用户下

1
2
3
4
5
6
7
8
[root@cPen_web ~]# useradd wy
[root@cPen_web ~]# su - wy # 注:su切换不会经过ssh服务
[wy@cPen_web ~]$

#注:su切换用户,是不会经过ssh
#注:ssh是远程登录
su 和 su - su切换不会切换bash环境(还是原用户的bash环境)
su - 去切换 会切换到wy的bash环境

公钥认证排错

  1. 确保公钥正确

  2. 确保~/.ssh/authorized_keys文件权限为600

  3. 确保家目录以及.ssh目录权限为755以下权限,即属组和其他人没有7的权限