一. 练习 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 "请输入你要添加的用户个数:"  num1for  i in  `seq  $num1 `    do         id  user$i  &>/dev/null         a=`echo  $?`              str1=`date  +%s+%N | md5sum |head  -c 4`              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`                           echo  $passwd1  |passwd user$str1$i  --stdin  &>/dev/null                           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)		       %s     seconds since 1970-01-01 00:00:00 UTC			        %N     nanoseconds (000000000..999999999)			 [root@cPen_web ~]# date  +%s+N | md5sum |head  -c 4 2b13[root@cPen_web ~]#  示例2 --------------------------------------------------------------------- read  -p "输入新增用户数:"  numfor  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 [root@cPen_web ~]# a=123			 [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											 [root@cPen_web ~]# echo  $(( $a  < $b  )) 0											 [root@cPen_web ~]# expr  $a  + $b 				 127 [root@cPen_web ~]# echo  $(( $a  + $b  ))		 127 [root@cPen_web ~]# echo  $[ $a  + $b  ]		 127 [root@cPen_web ~]# let  c=$a +$b 				 [root@cPen_web ~]# echo  $c 					 127 [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 				 数值运算:https://blog.csdn.net/weixin_34408624/article/details/92598137 ------------------------------------------------------------------------ echo  "scale=3;5/3" |bc						[root@cPen_web ~]# echo  "scale=3;5/3" |bc	 1.666 [root@cPen_web lianxi]# echo  $((5 /3 )) 1 [root@cPen_web lianxi]# echo  |awk '{printf 5/3}' 		 1.66667[root@cPen_web lianxi]#  [root@cPen_web lianxi]# echo  |awk '{printf "%.2f",5/3}' 	 1.67[root@cPen_web lianxi]#  数值运算:https://blog.csdn.net/weixin_34408624/article/details/92598137 
1.3 如何计算本机有多少个用户以及多少个普通用户? 题目3:如何计算本机有多少个用户以及多少个普通用户? 
1 2 3 4 5 6 示例 --------------------------------------------------------------------- wc  -l /etc/passwd									awk -F":"  '$3>=1000{print $1}'  /etc/passwd |wc  -l	 
1.4 如何去除字符串中所有空格? 题目4:如何去除字符串中所有空格? 
1 2 3 4 示例 --------------------------------------------------------------------- str="s t r i n g"  echo  $str  |tr  -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 					 ……………… 最近访问: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 语句 --------------------------------------------------------------------- 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                        if  [[ $a  -eq 0 || $b  -eq 0 ]];then                                   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                           ssh             22/udp                           
.--------------------------------------------------------------------------------------------------------------
#注:因为它所有的数据都是进行加密的,所以说它是安全的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			 2、pidof sshd									 [root@cPen_web lianxi]# pidof sshd				 2545 2543 2542 2538 2537 2536 909 3、查看网络连接监听状态 netstat [root@cPen_web lianxi]# netstat -atpl |grep ssh		 [root@cPen_web lianxi]# netstat -atpln |grep ssh tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      909/sshd             tcp        0      0 192.168.0.21:22         192.168.0.42:58697      ESTABLISHED 2536/sshd: root [pr   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        ------------------------------------------------------------------------------------------------------ 4、lsof -i:22				 [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)		 sshd     908 root    6u  IPv6  27721      0t0  TCP *:ssh (LISTEN)		 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	 [root@cPen_web lianxi]# ip add								     inet 127.0.0.1/8 scope host lo							     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.			 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 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.			 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:			# 注:信息摘要 用的 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 
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 
六. 实现公钥认证(免密码登录) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 [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 [root@cPen_web ~]# mkdir  .ssh					 [root@cPen_web ~]# cd  .ssh/ [root@cPen_web .ssh]# ls  known_hosts [root@cPen_web .ssh]# vim authorized_keys		 ssh-rsa											 AAAAB3NhQX......jXDv87iERv/z9XepKCeYqCfF2Dvv0n/g+IeFmzhW0iOppExskimMPGGWcN+7rXWlwaLNTiknmSTl+mFvZV8uIY5DnQXv root@cPen_web [root@cPen_web .ssh]# chmod  600 authorized_keys 	 [root@cPen_web .ssh]# ssh root@10.122.148.108		 ……………………… 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					 [wy@cPen_web ~]$  su 和 su -		su切换不会切换bash环境(还是原用户的bash环境) 				 su - 去切换 会切换到wy的bash环境 
公钥认证排错 
确保公钥正确
确保~/.ssh/authorized_keys文件权限为600
确保家目录以及.ssh目录权限为755以下权限,即属组和其他人没有7的权限