shell脚本实现四则运算_shell脚本能做哪些事

写在前面


  • 笔记是上课后整理的笔记,适合温习,不适合新手,希望对小伙伴有帮助
  • 笔记内容包括:Shell一些常见情境

傍晚时分,你坐在屋檐下,看着天慢慢地黑下去,心里寂寞而凄凉,感到自己的生命被剥夺了。当时我是个年轻人,但我害怕这样生活下去,衰老下去。在我看来,这是比死亡更可怕的事。——–王小波


一、Shell 基础知识

1.1 什么是 Shell

shell 是用户 与 Linux 内核之间的解释器

区分 shell 和 bash:shell是解释器的总称,bash是一类解释器。

Bash基本特性

查看当前在使用得解释器,不会显示临时切换的解释器,查看当前系统支持得解释器类型

[root@liruilong ~]$ echo $SHELL 查看当前系统支持得解释器类型 /bin/sh /bin/bash /sbin/nologin /usr/bin/sh /usr/bin/bash /usr/sbin/nologin /bin/tcsh /bin/csh

临时使用其他的解释器,查看设置用户得解释器类型

[root@liruilong ~]$ sh 创建用户 [root@liruilong ~]$ cat /etc/passwd | grep zhangsan 修改zhangsan得解释器 [root@liruilong ~]$ cat /etc/passwd | grep zhangsan zhangsan:x:1002:1002::/home/zhangsan:/bin/tcsh [root@liruilong ~]$ su - zhangsan #切换用户,验证用户得解释器类型 [zhangsan@liruilong ~]$ echo $SHELL /bin/tcsh [zhangsan@liruilong ~]$

shell脚本实现四则运算_shell脚本能做哪些事

在这里插入图片描述

Bash的优点

  • 快捷键、Tab键补齐Ctrl + A #将光标移动到命令行首Ctrl + E #将光标移动到命令行尾Ctrl + C #中断正在执行的命令Ctrl + L #清屏Ctrl + W #从光标位置,往回删一个单词Ctrl + U #从光标位置,往回删到开头
  • 命令历史 ( history )

[root@liruilong ~]$ history 清空历史记录 [root@liruilong ~]$ vim /etc/profile #修改历史记录的数量 46 HISTSIZE=1000

  • 命令别名 (alias)

[root@liruilong ~]$ alias #查看当前用户可以使用的别名

shell脚本实现四则运算_shell脚本能做哪些事

在这里插入图片描述

[root@liruilong ~]$ vim /root/.bashrc 39;cat /etc/sysconfig/network-scripts/ifcfg-ens33' [root@liruilong ~]$ vim /etc/bashrc 39;cat /etc/sysconfig/network-scripts/ifcfg-ens33'

标准输入与输出的重定向 ( >、>>、2>、2>>、&> )

正确输出重定向覆盖,> 等同于 1>

正确输出重定向覆盖,> 等同于 1> [root@liruilong ~]$ ls /etc/passwd > /root/1.txt [root@liruilong ~]$ cat /root/1.txt /etc/passwd

正确输出重定向追加, 1>> 等同于 1>>

正确输出重定向追加, 1>> 等同于 1>> [root@liruilong ~]$ ls /etc/passwd >> /root/1.txt [root@liruilong ~]$ cat /root/1.txt /etc/passwd /etc/passwd

错误输出重定向覆盖追加

错误输出重定向覆盖 [root@liruilong ~]$ ls --helps 2> /root/2.txt [root@liruilong ~]$ cat /root/2.txt ls:无法识别的选项“--helps” Try 'ls --help' for more information. 错误输出重定向追加 [root@liruilong ~]$ ls --helps 2>> /root/2.txt [root@liruilong ~]$ cat 2.txt ls:无法识别的选项“--helps” Try 'ls --help' for more information. ls:无法识别的选项“--helps” Try 'ls --help' for more information.

错误或正确的输出重定向覆盖追加

错误或正确的输出重定向覆盖 [root@liruilong ~]$ ls /etc/shadow /root/fsdfs &> /root/3.txt [root@liruilong ~]$ cat /root/3.txt ls: 无法访问/root/fsdfs: 没有那个文件或目录 错误或正确的输出重定向追加 [root@liruilong ~]$ ls /etc/shadow /root/fsdfs &>> /root/3.txt [root@liruilong ~]$ cat /root/3.txt ls: 无法访问/root/fsdfs: 没有那个文件或目录 /etc/shadow [root@liruilong ~]$ cat /root/3.txt ls: 无法访问/root/fsdfs: 没有那个文件或目录 /etc/shadow

管道 ( | )

管道的应用 [root@liruilong ~]$ cat /etc/passwd | less [root@liruilong ~]$ echo "123" | passwd --stdin zhangsan

Shell 执行命令的方式

  • 交互式 (命令行) 人工干预逐条解释执行、效率低
  • 非交换式(脚本) 需要提前设计批量执行、效率高修改用户的 Shell 解释器:/etc/shadow

二、脚本设计与运行

2.1 编写Shell 脚本

什么是 Shell 脚本提前将可执行的命令语句写入一个文件 顺序执行 解释器逐行解释代码

第一个 Shell 脚本

编写一个 Hello Word脚本新建文件 添加可执行语句 (命令) 给文件添加 x 执行权限

[root@liruilong ~]$ mkdir -p /root/shell/day01 [root@liruilong ~]$ vim /root/shell/day01/first.sh echo "Hello World"

规范脚本的构成

一个合格规范的脚本应该包含以下这些内容#! 脚本声明 (使用哪种解释器解释代码) 注释信息 (步骤、思路、用途等),以 # 可执行的语句

[root@liruilong ~]$ vim /root/shell/day01/first.sh A test program for Shell. echo "Hello World"

2.2 执行 Shell 脚本

方法一:需要为文件赋予可执行的权限绝对路径执行 相对路径执行

[root@liruilong ~]$ chmod +x /root/shell/day01/first.sh 以绝对路径的方式运行脚本 Hello World [root@liruilong ~]$ cd /root/shell/day01 [root@liruilong day01]以相对路径运行脚本,【.】只得是当前目录 Hello World

方法二:不需要文件有可执行的权限sh 脚本文件名 source 脚本文件名 #不会启动子进程,通过pstree 查看进程树

shell脚本实现四则运算_shell脚本能做哪些事

在这里插入图片描述

[root@liruilong ~]$ chmod -x /root/shell/day01/first.sh #取消脚本的执行权限

[root@liruilong ~]$ ls -l /root/shell/day01/first.sh

-rw-r–r– 1 root root 58 7月 4 11:03 /root/shell/day01/first.sh

[root@liruilong ~]$ sh /root/shell/day01/first.sh #用开启子进程的方式运行脚本

Hello World

shell脚本实现四则运算_shell脚本能做哪些事

!(https://img-blog.csdnimg.cn/0ed77c927305454dbe40ae57e34b93

[root@liruilong ~]$ source /root/shell/day01/first.sh #运行脚本时不会开启子进程 Hello World

34;Hello World" sleep 100 pstree的软件包 [root@liruilong ~]$ sh /root/hello.sh 终端B验证,查看进程树 ├─sshd─┬─sshd───bash───sh───sleep └─sshd───bash───pstree [root@liruilong ~]$ source /root/hello.sh 终端B验证,查看进程树 ├─sshd─┬─sshd───bash───sleep └─sshd───bash───pstree

三、变量

3.1 自定义变量

以固定的名称,存放可以能有变化的值

定义变量

  • 定义变量的格式:变量名=变量值
  • 取消变量的格式:unset 变量名

注意事项:= 两边不能有空格,不要使用关键字做变量名,如:ls、cd等; 如果变量名已经存在则覆盖之前的变量值; 变量名称有:字母/数字/下划线,不能以数字开始;

查看变量

  • 查看变量的语法格式: $变量名 ${变量名}

给变量x赋值为12 [root@liruilong ~]$ var1=centos 变量名以下划线开头 [root@liruilong ~]$ a_0="hello world" 输出变量x的值 12 [root@liruilong ~]$ echo $_a 输出变量$_0的值 hello world [root@liruilong ~]$ echo ${var1}6.5 取消定义的变量x [root@liruilong ~]$ echo $x #再次输出结果为空

3.2系统预设变量

变量类型环境变量(变量名通常大写,有操作系统维护); 位置变量(bash内置变量,存储脚本执行时的参数); 预定义变量(bash内置变量,可以调用但是不能赋值或修改); 自定义变量(用户自主设置)

环境变量

环境变量存储在 /etc/profile 或 ~/.bash_profile 命令 env 可以列出所有环境变量 常见环境变量:PATH、PWD、USER、UID、HOME、SHELL

[root@liruilong ~]$ echo $PATH 当前用户对应得UID号 0 [root@liruilong ~]$ echo $USER 当前登录用户得家目录 /root [root@liruilong ~]$ cd /etc/sysconfig/network-scripts/ [root@liruilong network-scripts]显示当前用户得所在路径 /etc/sysconfig/network-scripts [root@liruilong ~]$ [root@liruilong ~]$ echo $SHELL #显示当前用户使用得解释器 /bin/bash

位置变量

位置变量存储脚本执行时的参数: 使用 $n 表示,n 为数字序列号 $1、$2、… 、${10}、${11}、…

[root@liruilong ~]$ vim /root/shell/day01/user.sh test positional parameters. echo $1 echo $2 echo $3 [root@liruilong ~]$ bash /root/shell/day01/user.sh aa 99 cc aa 99 cc

  • 通过位置变量创建系统账户,配置密码

[root@liruilong ~]$ vim /root/shell/day01/user02.sh read username and pass from positional parameters. useradd "$1" 34;$2" | passwd --stdin "$1" #给用户设置密码 [root@liruilong ~]$ sh /root/shell/day01/user02.sh tom 123 更改用户 tom 的密码 。 passwd:所有的身份验证令牌已经成功更新。

预定义变量

预定义变量用来保存脚本程序的执行信息 直接使用这些变量 不能直接为这些变量赋值

shell脚本实现四则运算_shell脚本能做哪些事

在这里插入图片描述

[root@liruilong ~]$ ls /tmp/ [root@liruilong ~]$ echo $? 上一条命令执行失败,返回一个非0值 1 [root@liruilong ~]$ vim /root/shell/day01/pre.sh 输出当前得脚本名 echo $* 输出脚本的进程号,每次运行脚本进程号不同 [root@liruilong ~]$ bash /root/shell/day01/pre.sh aa bb 88 qq /root/shell/day01/pre.sh $*执行结果 4 执行结果 3255 # $$脚本进程号 [root@liruilong ~]$

四、变量的扩展应用

4.1 各种引号

多种引号的区别

区别三种定界符双引号 " " 允许扩展,以 $ 引用其他变量; 单引号 ' ' 禁用扩展,即便 $ 也视为普通符号; 反引号 “ 将命令的执行输出作为变量值,$() 与反引号等效;

[root@liruilong ~]创建的是三个文件 [root@liruilong ~]34;a b c" touch 'b c d' ls -l rm -rf "a b c" rm -rf 'b c d'

[root@liruilong ~]输出家目录路径 /root [root@liruilong ~]39;$HOME' 39;'屏蔽特殊符号的含义 $HOME [root@liruilong ~]39;$USER id is $UID' $USER id is $UID [root@liruilong ~] test=`grep root /etc/shadow` [root@liruilong ~] echo $test root:$6$Uebh9/WEzEaQfT$8b0B6oBgWUTEmYojDW9.6PHOw0.jD7A.SENsHFD/YPwh/L9jRJK0yWAtRF4BEteYZETeMiInp72dTviSKmLZf.:18501:0:99999:7::: dockerroot:!!:18691:::::: [root@liruilong ~]

4.2 read 命令定义变量

read 标准输入取值

read 标准输入取值read 从键盘读入变量值完成赋值 格式:read [-p "提示信息"] 变量名 -p 可选,-t 可指定超时秒数,-s 设置是否在终端显示输入的内容

交互式定义变量

[root@liruilong ~]交互式定义变量 haha echo $name #查看变量 haha

[root@liruilong ~]34;请输入用户名:" name echo $name #查看变量 xixi

从键盘读取用户名密码,创建用户并设置密码

[root@liruilong ~]!/bin/bash read 从键盘读取用户名密码,创建用户并设置密码 read -p "请输入一个用户名:" name read -p "请输入密码:" pass useradd $name echo "$pass" | passwd --stdin $name 脚本测试 [root@liruilong ~]# source /root/shell/day01/user03.sh 请输入一个用户名:nana 请输入密码:123456 更改用户 nana 的密码 。 passwd:所有的身份验证令牌已经成功更新。

read 从键盘读取用户名密码,创建用户并设置密码,要求不显示输入密码

[root@liruilong ~]!/bin/bash read 从键盘读取用户名密码,创建用户并设置密码,要求不显示输入密码 read -p "请输入一个用户名:" name read -p "请输入密码:" -s pass useradd $name echo "$pass" | passwd --stdin $name 脚本测试 [root@liruilong ~] vim /root/shell/day01/user03.sh #!/bin/bash

不输入就会自动退出:如果后面不加秒数,则不会自动退出

read 从键盘读取用户名密码,创建用户并设置密码,要求不显示输入密码 -t 多少秒不输入就会自动退出:如果后面不加秒数,则不会自动退出 read -p "请输入一个用户名:" name read -p "请输入密码:" -s -t 3 pass useradd $name echo "$pass" | passwd --stdin $name 脚本测试 [root@liruilong ~]超过3秒退出 passwd: 鉴定令牌操作错误

4.3 全局变量 or 局部变量

变量的作用范围

变量的作用范围局部变量 新定义的变量默认只是在当前 Shell 环境中有效,无法在子 Shell 环境中使用 全局变量 系统中的任何 Shell 环境中都有效

开启两个终端,A和B来测试 x=11 sh echo $x 终端B上操作 [root@liruilong ~]查看进程树 ...... ├─sshd─┬─sshd───bash───sh │ └─sshd───bash───pstree ......

使用 export 定义全局变量

export x=12 sh echo $x bash echo $x pstree #查看进程树 ...... ├─sshd─┬─sshd───bash───sh───bash └─sshd───bash───pstree ......

五、Shell 中的运算

5.1 整数运算

基本运算法则

基本运算法则四则运算加法:num1 + num2 减法:num1 – num2 乘法:num1 * num2 整除:num1 / num2 取余数运算求模:num1 % num2

$ 算式替换

  • 使用 $[ ] 或 $(( )) 表达式 格式:$[整数1 运算符 整数2……]计算结果替换表达式本身,可结合 echo 命令输出

[root@liruilong ~] echo $[2*3] 6

[root@liruilong ~]# x=15;y=3 echo $[x+y] echo $[x-y] echo $[x*y] echo $[x/3] echo $[x%3] echo $[x%2] x=15;y=3 echo $((x+y)) echo $((x-y)) echo $((x*y)) echo $((x/y)) echo $((x%y)) echo $((x%y)) x=2 echo $[x+=4] echo $x #输出x值 6

变量的自增/减等操作

[root@liruilong ~]输出x值,x=x+1 7 [root@liruilong ~]输出x值 7 [root@liruilong ~]输出x值,x=x*3 21 [root@liruilong ~]输出x值 21 [root@liruilong ~]输出x+1前的值 21 [root@liruilong ~]这是x+1后的值 22 [root@liruilong ~]输出x-1前的值 22 [root@liruilong ~]输出x-1后的值 21

let 指定算术运算

let 用于指定算术运算 [root@liruilong ~]将算术运算 2*3 赋予变量 i [root@liruilong ~] let i=3*6 echo $i 18 [root@liruilong ~]定义变量 [root@liruilong ~]变量赋值,b=b+2 [root@liruilong ~] let b*=3 echo $b 12 [root@liruilong ~] let x++;echo $x # ;用来区分两条命令 3 [root@liruilong ~]# let x++;echo $x # ;用来区分两条命令 4 [root@liruilong ~]# let x+=3;echo $x # ;用来区分两条命令 7

5.2 小数运算

bc计算器

Bash 内建机制仅支持整数运算,不支持小数运算

[root@liruilong ~]34;.2+23")

我们可以通过计算器软件 bc 实现小数运算

我们没有该软件则需要使用yum安装; bc支持交换式和非交换式两种计算,scale=n 可以约束小数位,quit 退出交互式计算

[root@liruilong ~]安装bc软件包 bc 12+23 乘法运算 29.123 23/2 取余运算 2 quit echo "1.2+3.3" | bc 4.5 [root@liruilong ~]34;1.2+3.3;3.8*2.7" | bc echo "scale=2;10/2" |bc echo "scale=2;17/2" |bc 8.50 [root@liruilong ~]34;scale=2;17.34/2" |bc #scale=2 结果小数位保留两位

小数的比较

  • bc 支持的比较操作符:>、>=、<、<=、==、!=
  • 表达式成立则返回1,否则返回0

[root@liruilong ~]34;1>2" | bc echo "5>2" | bc echo "2==2" | bc echo "2!=2" | bc echo "12.34 < 8.8" | bc echo "12.34 != 8.8" | bc echo "hello world" echo -n "hello world"

六、综合案例

6.1 监控脚本之显示硬件信息

echo回显

  • -n选项:不换行
  • -e选项:支持扩展属性

改变echo输出的文本颜色

  • echo -e "\033[文字颜色m 文字 \033[0m"
  • 文字颜色:30 ———– 37

30:黑 34:蓝色 31:红 35:紫色 32:绿 36:深绿 33:黄 37:白色

[root@liruilong ~]34;\033[32m天气预报\033[0m" 32绿色字

监控硬件信息

显示服务器硬件信息

which ifconfig /usr/sbin/ifconfig [root@liruilong ~] vim /root/shell/day01/info.sh 34;\033[34m----------服务器硬件信息----------\033[0m" echo -e "\033[32m网卡信息如下:\033[0m" ifconfig ens33 | grep "inet" echo -e "\033[32m剩余内容容量信息如下: \033[0m" grep MemAvailable /proc/meminfo echo -e "\033[32m磁盘容量信息如下: \033[0m" df -h / echo -e "\033[32mCPU信息如下:\033[0m" grep "model name" /proc/cpuinfo [root@liruilong ~]运行脚本 ----------服务器硬件信息---------- 网卡信息如下: inet 192.168.4.5 netmask 255.255.255.0 broadcast 192.168.4.255 inet6 fe80::452e:bf37:6ef7:c2fa prefixlen 64 scopeid 0x20<link> 剩余内容容量信息如下: MemAvailable: 1238268 kB 磁盘容量信息如下: 文件系统 容量 已用 可用 已用% 挂载点 /dev/mapper/centos-root 50G 7.2G 43G 15% / CPU信息如下: model name : Intel(R) Core(TM) i7-1065G7 CPU @ 1.30GHz

shell脚本实现四则运算_shell脚本能做哪些事

在这里插入图片描述

计算例题

[root@liruilong ~]!/bin/bash 计算1+2+3,...,+n的和,可以使用n*(n+1)/2公式快速计算结果 read -p "请输入一个正整数:" num sum=$[num*(num+1)/2] echo -e "\033[32m$num以内整数的总和是:$sum \033[0m" [root@liruilong ~] vim /root/shell/day01/area.sh 34;请输入三角形底边长度:" bottom read -p "请输入三角形的高度:" hight A=$(echo "scale=2;1/2*$bottom*$hight" | bc) echo -e "\033[32m三角形的面积是:$A\033[0m" [root@liruilong ~] vim /root/shell/day01/tixingmianhi.sh 34;请输入梯形上底边长度:" a read -p "请输入梯形下底边长度:" b read -p "请输入梯形高度:" h A=$(echo "scale=2;($a+$b)*$h/2" | bc) echo -e "\033[32m梯形面积是:$A\033[0m" [root@liruilong ~]-x执行时测试 + read -p 请输入梯形上底边长度: a 请输入梯形上底边长度:32 + read -p 请输入梯形下底边长度: b 请输入梯形下底边长度:45 + read -p 请输入梯形高度: h 请输入梯形高度:7 ++ echo 'scale=2;(32+45)*7/2' ++ bc + A=269.50 + echo -e '\033[32m梯形面积是:269.50\033[0m' 梯形面积是:269.50 [root@liruilong ~]!/bin/bash 34;请输入圆的半径:" r A=`echo "scale=2;3.14*$r*2" | bc` echo -e "\033[32m圆的面积是:$A\033[0m" [root@liruilong ~]-x执行时测试 + read -p 请输入圆的半径: r 请输入圆的半径:25 ++ echo 'scale=2;3.14*25*2' ++ bc + A=157.00 + echo -e '\033[32m圆的面积是:157.00\033[0m' 圆的面积是:157.00

配置 YUM 源脚本

[root@liruilong ~]!/bin/bash 删除所有.repo文件 rm -rf /etc/yum.repos.d/* 34;mount /dev/cdrom /centos" >> /etc/rc.d/rc.local 34; name=centos7.5 baseurl=file:///centos enabled=1 gpgcheck=0" > /etc/yum.repos.d/centos.repo #yum 测试 yum clean all yum repolist

[root@liruilong ~]39;mount /dev/cdrom /centos' + echo ' name=centos7.5 baseurl=file:///centos enabled=1 gpgcheck=0' + yum clean all + yum repolist

七、字符串处理与变量初始化

字符串处理机制

子串截取

┌──(liruilongLiruilong)-[/mnt/c/Users/lenovo] └─$ name=liruilong ┌──(liruilongLiruilong)-[/mnt/c/Users/lenovo] └─$ echo $name liruilong ┌──(liruilongLiruilong)-[/mnt/c/Users/lenovo] └─$ echo ${#name} 9 ┌──(liruilongLiruilong)-[/mnt/c/Users/lenovo] └─$ echo ${name:0:3} lir ┌──(liruilongLiruilong)-[/mnt/c/Users/lenovo] └─$ echo ${name:3:3} uil ┌──(liruilongLiruilong)-[/mnt/c/Users/lenovo] └─$ echo ${name:3:-3} uil

子串替换

  • 替换1个结果:${变量/旧字串/新字串}
  • 替换全部结果:${变量//旧字串/新字串}

子串替换时,变量本身的值并不会变化,只会把变化的值输出到屏幕

phone=13812345678 [root@liruilong ~] / 替换变量中的第一个3 1X812345678 [root@liruilong ~] // 替换变量中所有3 1X812X45678 [root@liruilong ~]定义变量 [root@liruilong ~]查看变量的值 root:x:0:0:root:/root:/bin/bash [root@liruilong ~]替换单个root为大写 ROOT:x:0:0:root:/root:/bin/bash [root@liruilong ~]替换所有root为大写 ROOT:x:0:0:ROOT:/ROOT:/bin/bash

字串掐头

  • 从左向右: 最短匹配删除:${变量#关键词}
  • 从左向左:最长匹配删除:${变量关键词}

[root@liruilong ~]定义变量 [root@liruilong ~]查看变量的值 root:x:0:0:root:/root:/bin/bash [root@liruilong ~]*:} echo ${A*:} echo $A #变量A的值不会发生变化 root:x:0:0:root:/root:/bin/bash

字串去尾

  • 从右向左: 最短匹配删除:${变量%关键词}
  • 从右向左:最长匹配删除:${变量%%关键词}

[root@liruilong ~]定义变量 [root@liruilong ~]查看变量的值 root:x:0:0:root:/root:/bin/bash [root@liruilong ~]删除字串A中,最后一个 : 后的所有字符 root:x:0:0:root:/root [root@liruilong ~]删除字串A中,第一个 : 后的所有字符 root [root@liruilong ~]变量A的值不会发生变化 root:x:0:0:root:/root:/bin/bash

批量修改文件扩展名

[root@liruilong ~] touch {a,b,c,d,e,f}.txt [root@liruilong day03]!/bin/bash 批量修改目录下的以.txt结尾的文件为.doc结尾 for i in $(ls *.txt) do mv $i ${i%.*}.doc 脚本验证 [root@liruilong day03] ls [root@liruilong day03]!/bin/bash 脚本验证 [root@liruilong day03] ls

变量初始化::

变量初始化变量有值,则返回该变量的值 变量无值,则返回初始值 格式:${变量:-关键字}

[root@liruilong ~] echo ${X:-xyz} echo ${ABC:-xyz} #变量无值,输出该变量的初始值 xyz

创建系统用户

[root@liruilong ~]!/bin/bash 创建系统用户,未设置密码,会自动赋予用户初始密码12345 34;\033[32m$1\033[0m" } read -p "请输入用户名:" iname if [ -z "$iname" ];then color "未输入用户名,脚本将退出..." exit fi 34;请输入密码:" ipass ipass=${ipass:-123456} useradd "$iname" echo "$ipass" | passwd --stdin "$iname" sh /root/shell/day03/user3.sh 请输入用户名: 未输入用户名,脚本将退出... [root@liruilong ~]# sh /root/shell/day03/user3.sh 请输入用户名:zhang 请输入密码: 更改用户 zhang 的密码 。 passwd:所有的身份验证令牌已经成功更新。

一、使用sed修改配置

1.1 常用sed指令

常用sed指令p(print): 打印行 d(delete): 删除行 c(replace): 替换行 s(substitution): 替换关键词 =:打印行号

1.2 过滤数据

Print 指令

过滤网卡IP地址 [root@liruilong ~]39;/IPADDR/p' /etc/sysconfig/network-scripts/ifcfg-ens33 IPADDR=192.168.4.5 过滤内存信息 [root@liruilong ~]39;/Mem/p' Mem: 1865280 373344 1072176 10544 419760 1278920 过滤磁盘根分区信息(根分区是以/ 结尾的分区) [root@liruilong ~]39;/\/$/p' /dev/mapper/centos-root 50G 3.4G 47G 7% / 显示第1、3、6行内容 [root@liruilong ~]39;1p;3p;6p' /etc/passwd root:x:0:0:root:/root:/bin/bash daemon:x:2:2:daemon:/sbin:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync 打印第2行以外的所有其他行内容 [root@liruilong ~]39;2!p' /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4

1.3 删除数据

Delete 指令 (不使用-i 选项,源文件不会被修改)

删除/etc/hosts全文,没有定位条件等于匹配所有行 [root@liruilong ~] cat /etc/fstab > /tmp/fstab [root@liruilong ~]34;1,3d" /tmp/fstab [root@liruilong ~] sed '/dev/!d' /tmp/fstab 删除所有以 sed '/^39; /tmp/fstab 删除空白行 [root@liruilong ~]39;/^$/d' /tmp/fstab

1.4 替换行

Replace 指令(不使用 -i 选项,源文件不会被修改)

所有行替换为 123456 [root@liruilong ~]39;c 123456' /tmp/fstab 123456 123456 123456 123456 123456 123456 123456 123456 123456 123456 123456 123456 替换IP地址为 1.1.1.1 [root@liruilong ~] sed '/IPADDR/c IPADDR=1.1.1.1' $file TYPE=Ethernet PROXY_METHOD=none BROWSER_ONLY=no BOOTPROTO=none DEFROUTE=yes IPV4_FAILURE_FATAL=no IPV6INIT=yes IPV6_AUTOCONF=yes IPV6_DEFROUTE=yes IPV6_FAILURE_FATAL=no IPV6_ADDR_GEN_MODE=stable-privacy NAME=ens33 UUID=314ef20c-394e-4ef6-ba3b-0c6aaf47d1fc DEVICE=ens33 ONBOOT=yes IPADDR=1.1.1.1 PREFIX=24 替换/etc/hosts中包含127的行为 127.0.0.1 [root@liruilong ~] sed '/127/c 127.0.0.1' /etc/hosts 127.0.0.1 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 替换文件的第四行为 xxxx [root@liruilong ~]39;4c xxxx' /etc/shells /bin/sh /bin/bash /sbin/nologin xxxx /usr/bin/bash /usr/sbin/nologin /bin/tcsh /bin/csh

1.5 替换关键词

Substitution指令(不使用 -i 选项,源文件不会被修改)

通过echo命令定义测试文件 [root@liruilong ~]34;2046 2048 2046 2046 > 1001 2046 2999 1888 > 2046 2046 2046 2046" > test.txt

查看测试文件的内容 [root@liruilong ~] sed 's/2046/xxxx/' test.txt xxxx 2048 2046 2046 1001 xxxx 2999 1888 xxxx 2046 2046 2046 把每行中的所有的2046替换为xxxx [root@liruilong ~]39;s/2046/xxxx/g' test.txt xxxx 2048 xxxx xxxx 1001 xxxx 2999 1888 xxxx xxxx xxxx xxxx 把每行中的第2个2046替换为xxxx [root@liruilong ~]39;s/2046/xxxx/2' test.txt 2046 2048 xxxx 2046 1001 2046 2999 1888 2046 xxxx 2046 2046 把每行中的所有2046替换为(2046); &就代表被替换的参数 [root@liruilong ~]39;s/2046/(&)/g' test.txt (2046) 2048 (2046) (2046) 1001 (2046) 2999 1888 (2046) (2046) (2046) (2046) 把每行中的所有2046替换为2046-1111;&就代表被替换的参数 [root@liruilong ~]39;s/2046/&-1111/' test.txt 2046-1111 2048 2046 2046 1001 2046-1111 2999 1888 2046-1111 2046 2046 2046 把第2行中的所有2046替换为xxxx [root@liruilong ~]39;2s/2046/xxxx/g' test.txt 2046 2048 2046 2046 1001 xxxx 2999 1888 2046 2046 2046 2046 把第2行中的所有2046替换为空,等同于删除操作 [root@liruilong ~]39;2s/2046//g' test.txt 2046 2048 2046 2046 1001 2999 1888 2046 2046 2046 2046 只输出修改过的行 [root@liruilong ~]39;2s/2046/xxxx/p' test.txt 1001 xxxx 2999 1888

正则符号() 具有保留的功能

[root@liruilong ~]34;hello the world" | sed -r 's/^(.)(.*)(.)$/\3\2\1/' dello the worlh [root@liruilong ~]34;hello the world" | sed -r 's/^(.)(.*)(.)$/\3\1\2/' dhello the worl [root@liruilong ~]34;hello the world" | sed -r 's/^(.)(.*)(.)$/\3\3/' dd [root@liruilong ~]34;hello the world" | sed -r 's/^(.)(.*)(.)$/\3\3\2\1\1/' ddello the worlhh

1.8 打印行号

打印第2行的行号 [root@liruilong ~]39;2=' /etc/passwd 2 打印包含root的行号 [root@liruilong ~]39;/root/=' /etc/passwd 1 10 打印bash结尾的行的行号 [root@liruilong ~]39;/bash$/=' /etc/passwd 1 42 $代表最后一行,打印最后一行的行号 [root@liruilong ~]39;$=' /etc/passwd 42

二、sed 多行文本处理

2.1 文本块指令

i (insert): 插入 a (append): 追加 r (read): 读 取文件 | 导入文件内容 w (write): 文件另存为 | 导出文件内容

插入指令 Insert (插入,行前写入)

查看test.txt文件内容 [root@liruilong ~] sed '2i ABC_XYZ' test.txt 2046 2048 2046 2046 ABC_XYZ 1001 2046 2999 1888 2046 2046 2046 2046 在第3 行前插入 ABC_XYZ [root@liruilong ~]39;3i ABC_XYZ' test.txt 2046 2048 2046 2046 1001 2046 2999 1888 ABC_XYZ 2046 2046 2046 2046 在包含 2046的行前插入两行数据ABC\nXYZ,\n是换行符 [root@liruilong ~]39;/2046/i ABC\nXYZ' test.txt ABC XYZ 2046 2048 2046 2046 ABC XYZ 1001 2046 2999 1888 ABC XYZ 2046 2046 2046 2046 在包含 1888 的行前插入两行数据ABC\nXYZ,\n是换行符 [root@liruilong ~]39;/1888/i ABC\nXYZ' test.txt 2046 2048 2046 2046 ABC XYZ 1001 2046 2999 1888 2046 2046 2046 2046

Append(追加,行后写入)

在第2行后面插入 ABC_XYZ [root@liruilong ~]39;2a ABC_XYZ' test.txt 2046 2048 2046 2046 1001 2046 2999 1888 ABC_XYZ 2046 2046 2046 2046 在第3行后面插入 ABC_XYZ [root@liruilong ~]39;3a ABC_XYZ' test.txt 2046 2048 2046 2046 1001 2046 2999 1888 2046 2046 2046 2046 ABC_XYZ 在包含 2046的行后面插入两行数据ABC\nXYZ,\n是换行符 [root@liruilong ~]39;/2046/a ABC\nXYZ' test.txt 2046 2048 2046 2046 ABC XYZ 1001 2046 2999 1888 ABC XYZ 2046 2046 2046 2046 ABC XYZ 在包含 1888 的行后面插入两行数据ABC\nXYZ,\n是换行符 [root@liruilong ~]39;/1888/a ABC\nXYZ' test.txt 2046 2048 2046 2046 1001 2046 2999 1888 ABC XYZ 2046 2046 2046 2046

导入指令:Read (将其他文件的内容导入)

将/etc/hosts中的内容读入到 test.txt 文件第2行的后面 [root@liruilong ~]39;2r /etc/hosts' test.txt 2046 2048 2046 2046 1001 2046 2999 1888 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 2046 2046 2046 2046 将/etc/hosts中的内容读入到 test.txt 文件每一行数据的后面 [root@liruilong ~]39;r /etc/hosts' test.txt 2046 2048 2046 2046 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 1001 2046 2999 1888 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 2046 2046 2046 2046 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 将/etc/hosts中的内容读入到 test.txt 文件中包含 1888字串所在行的后面 [root@liruilong ~]39;/1888/r /etc/hosts' test.txt 2046 2048 2046 2046 1001 2046 2999 1888 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 2046 2046 2046 2046

导出指令:Write (将文件内容导出另存到其他文件)

将test.txt 文件的所有内容另存为一个新文件 copy_test.txt [root@liruilong ~]39;w copy_test.txt' test.txt 2046 2048 2046 2046 1001 2046 2999 1888 2046 2046 2046 2046 [root@liruilong ~]查看文件的内容 2046 2048 2046 2046 1001 2046 2999 1888 2046 2046 2046 2046 将test.txt 文件的 2到3行另存为新文件line.txt [root@liruilong ~]39;2,3w line.txt' test.txt 2046 2048 2046 2046 1001 2046 2999 1888 2046 2046 2046 2046 [root@liruilong ~]查看新文件的内容 1001 2046 2999 1888 2046 2046 2046 2046 将test.txt 文件中所有包含1888的行另存为新文件 1888.txt [root@liruilong ~]39;/1888/w /opt/1888.txt' test.txt 2046 2048 2046 2046 1001 2046 2999 1888 2046 2046 2046 2046 [root@liruilong ~]查看文件的内容 1001 2046 2999 1888

三、sed综合案例

点名器

一、awk基础语法

awk 编程语言/数据处理引擎 创造者:Aho、Weinberger、Kernighan 基于模式匹配检查输入文本,逐行处理并输出 通常用于在 Shell 脚本中,获取指定的数据 单独用时,可对文本数据做统计

awk 流程控制

格式1:前置命令| awk , (指令)' 格式2: awk ' {指令}, 文件…. 格式3: awk ,BEGIN{} {} END{}' 文件….

if语句

单分支if判断

awk '{指令}' 文件

如果UID大于等于1000时,i自加1;最后输出i的值,i作为变量默认值为0 [root@liruilong ~]39;{if($3>=1000){i++}} END{print i}' /etc/passwd 2 awk -F: '{if($1=="root"){print $1,$3}}' /etc/passwd root 0 uptime 10:53:35 up 2 min, 1 user, load average: 0.33, 0.33, 0.14 uptime | awk '{if($NF>0.01){print "CPUload:",$NF}}' CPUload: 0.13

双分支if判断

awk '{指令}' 文件

统计普通用户和系统用户的个数 普通用户的UID号大于等于1000;系统用户的UID小于1000 [root@liruilong ~]39;{if($3>=1000){i++} else{j++}} END{print "普通用户:"i,"系统用户:"j}' /etc/passwd 普通用户:3 系统用户:34 [root@liruilong ~] ls -l /etc/ | awk '{ if($1~/^-/){x++} else{y++} } END{print "普通文件个数:"x,"目录个数:"y}' 普通文件个数:122 目录个数:148

多分支if判断

awk '{指令}' 文件

39;{ if(){} else if(){} else{} } END{}' [root@liruilong ~]39;{ if($1~/^-/){x++} else if($1~/^d/){y++} else{z++} } END{print "普通文件:"x,"\n目录个数:",y,"\n其他:",z}' 普通文件:118 目录个数: 106 其他: 17 [root@liruilong ~]#

for循环

awk 的for 循环采用与C语言一样的语法格式: for(表达式1;表达式2;表达式3) {指令}

i=1,每循环一次i的值加1 [root@liruilong ~]39;BEGIN{ for(i=1;i<=5;i++) {print i} }' 1 2 3 4 5 i=5,每循环一次i的值减1 [root@liruilong ~]39;BEGIN{ for(i=5;i>=1;i--){print i} }' 5 4 3 2

awk 数组与应用案例

awk 数组的定义及使用

数组的下标可以是数字,也可以是字符串

awk 'BEGIN{ > name="jim";name="tom";print name,name > }' tom jim awk 'BEGIN{ > name="jim";name="tom";print name,name,name > }' tom tom jim

定义数组age,age的值为22,age的值为18

[root@liruilong ~]39;BEGIN{ > age["tom"]=22;age["jim"]=18;print age["tom"],age["jim"] > }' 22 18

遍历数组的值

awk 'BEGIN{ x=0;x=11;x=12;x=13;x=14; > for(i in x){print i,x} > }' 4 14 0 0 1 11 2 12 3 13

应用案例

分组统计

#IP为数组,数组的下表为access_log 第一列的ip地址; 数组对应的值为 ip地址出现的次数 [root@liruilong ~]39;{IP[$1]++} END{ for(i in IP){print i,IP} }' /root/access_log 172.40.1.14 1 172.40.1.1 1 172.40.1.16 4 172.40.1.17 6 172.40.1.18 3

统计每个系统账户登录的次数

[root@liruilong ~]39;{wh[$1]++} END{for(i in wh){print i,wh} }' root 2 [root@liruilong ~]#

awk 综合案例

ss命令

[root@liruilong ~] ss -atu 查看tcp和udp协议,以数字显示,端口都变成了数字模式 [root@liruilong ~]查看tcp和udp协议,以数字显示,端口都变成了数字模式,显示进程名和PID号 [root@liruilong ~]查看tcp和udp协议,以数字显示,端口都变成了数字模式,显示进程名和PID号,不显示标题行 [root@liruilong ~] ss -s 汇总所有的结果

过滤连接状态

[root@liruilong ~]!/bin/bash 所有TCP连接的个数 TCP_Total=$(ss -s | awk '$1=="TCP"{print $2}') 所有UDP连接的个数 UDP_Total=$(ss -s | awk '$1=="UDP"{print $2}') 所有处于 Listen 监听状态的 TCP 端口个数 TCP_Listen_Total=$(ss -antlpH | awk 'BEGIN{count=0} {count++} END{print count}') 所有处于 ESTABLISHED 状态的TCP连接个数 TCP_Estab_Total=$(ss -antpH | awk 'BEGIN{count=0} /^ESTAB/{count++} END{print count}') 所有处于 TIME-WAIT 状态的 tcp 连接个数 TCP_TIME_WAIT_Total=$(ss -antpH | awk 'BEGIN{count=0} /^TIME-WAIT/{count++} END{print count}') 显示TCP连接总数 echo "TCP连接总数:$TCP_Total" 显示UDP连接总数 echo "UDP连接总数:$UDP_Total" 显示处于LISTEN状态的TCP端口个数 echo "处于LISTEN状态的TCP端口个数:$TCP_Listen_Total" 显示处于ESTABLISHED状态的TCP连接个数 echo "处于ESTAB状态的TCP连接个数:$TCP_Estab_Total" 显示处于TIME-WAIT状态的TCP连接个数 echo "处于TIME-WAIT状态的TCP连接个数:$TCP_TIME_WAIT_Total" [root@liruilong ~]# sh /root/shell/day05/net.sh TCP连接总数:15 UDP连接总数:10 处于LISTEN状态的TCP端口个数:15 处于ESTAB状态的TCP连接个数:2 处于TIME-WAIT状态的TCP连接个数:0

循环嵌套

[root@liruilong ~] vim /root/shell/day06/star.sh 34;*" done echo echo 34;*" done echo done sh /root/shell/day06/star.sh ***** ***** ***** ***** ***** *****

循环嵌套

打印星星矩阵

[root@liruilong ~] vim /root/shell/day06/star.sh 34;*" done echo echo 34;*" done echo done

sh /root/shell/day06/star.sh ***** ***** ***** ***** ***** *****

排列与组合

[root@liruilong ~]!/bin/bash 34;${i}${j}" done done

打印形状

[root@liruilong ~]!/bin/bash 打印出上述图片形状 for((i=1;i<=6;i++)) do for((j=1;j<=i;j++)) do echo -ne "\033[46m \033[0m" done echo done [root@liruilong ~]!/bin/bash 打印出上述图片形状 for((i=1;i<=6;i++)) do for((j=6;j>=i;j--)) do echo -ne "\033[46m \033[0m" done echo done

带菜单的脚本

[root@liruilong ~]!/bin/bash echo "1.查看剩余内存容量." echo "2.查看根分区剩余容量." echo "3.查看cpu十五分钟负载." echo "4.查看系统进程数量." echo "5.查看系统账户数量." echo "6.退出." 34;请输入选项[1-6]:" key 39;/Mem/{print $NF}';; 2) df | awk '/\/$/{print $4}';; 3) uptime | awk '{print $NF}';; 4) ps -aux | wc -l;; 5) sed -n '$=' /etc/passwd;; 6) exit;; esac done

备份数据

备份日志

[root@liruilong ~]!/bin/bash 34;%Y%m%d"` if [ ! -f /tmp/log-$date.tar.gz ];then tar -zcPf /tmp/log-$date.tar.gz /var/log fi sh /root/shell/day06/bak_log.sh [root@liruilong ~]# ls /tmp/log-* /tmp/log-20200718.tar.gz

备份数据库

  • 逻辑备份

yum -y install mariadb mariadb-server [root@liruilong ~] ss -ntulpa | grep mysql tcp LISTEN 0 50 *:3306 *:* users:(("mysqld",pid=9561,fd=14)

mysqldump可以对数据库中的库进行备份 格式: mysqldump -u"用户名" --password="" 数据库名 > 备份名.sql [root@liruilong ~]# mysqldump mysql > mysql.sql

[root@liruilong ~]!/bin/bash ipass 指定登录密码,默认为空;db 指定要备份的数据库 date=$(date +"%Y%m%d") iuser=root ipass= db=mysql #文件在/tmp 下不存在时才会进行备份 if [ ! -f /tmp/$db-$date.sql ];then mysqldump -u$iuser --password="$ipass" $db > /tmp/$db-$date.sql fi

sh /root/shell/day06/mysqldump.sh [root@liruilong ~]# ls -l /tmp/mysql-* -rw-r--r-- 1 root root 514619 7月 18 12:54 /tmp/mysql-20200718.sql

  • 物理备份(buttaidong)

[root@liruilong ~]!/bin/bash 34;%Y%m%d") db_dir="/var/lib/mysql" db=mysql [ ! -d /tmp/$db ] && mkdir /tmp/$db for i in $(ls $db_dir/$db) do tar -zcf /tmp/$db/$i-$date.tar.gz $db_dir/$db/$i done sh /root/shell/day06/bak_mysql.sh [root@liruilong ~]# ls /tmp/mysql

mysql> show databases -> ; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | +--------------------+ 4 rows in set (0.00 sec) mysql> create databases liruilong; ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'databases liruilong' at line 1 mysql> create database liruilong; Query OK, 1 row affected (0.02 sec) mysql> use liruilong; Database changed mysql> create table demo(id int(2),name varchar(20)); Query OK, 0 rows affected (0.04 sec) mysql>

差异备份

嗯,这个有些复杂。。。

部署安装 inotifywait 监听软件

[root@liruilong ~]准备源码安装环境 [root@liruilong ~]解压tar包到当前目录下 源码安装必须先进入到源码包目录下 [root@liruilong ~] ./configure [root@liruilong inotify-tools-3.13]编译安装 [root@liruilong inotify-tools-3.13] ls /usr/local/bin/ inotifywait inotifywatch

部署httpd服务

安装apache的服务 [root@liruilong ~] systemctl restart httpd 查看apache的端口号 [root@liruilong ~] yum -y install httpd 重启服务 [root@node ~] netstat -ntulpa | grep httpd tcp6 0 0 :::80 :::* LISTEN 15364/httpd

生成密钥,发送到 node上

非交互式生成密钥 [root@liruilong ~]39;' -f /root/.ssh/id_rsa ssh-copy-id root@192.168.4.207

差异备份【inotify+rsync】

[root@liruilong ~]!/bin/bash from_dir 为要被同步的目录 from_dir="/var/www/html/" 将$from_dir下的内容,同步到服务器192.168.4.207的/var/www/html/目录下 rsync_cmd="rsync -az --delete $from_dir root@192.168.4.207:/var/www/html/" inotifywait监听 $from_dir 目录,目录下发生文件的变化时,执行同步操作,脚本后台运行 while inotifywait -rqq -e modify,move,create,delete,attrib $from_dir do $rsync_cmd done

sh /root/shell/day06/isync.sh & 16532 [root@liruilong ~]验证结果 [root@liruilong ~] ssh root@192.168.4.207 "ls /var/www/html" html passwd

安全脚本

HASH值

HASH值

  • HASH 值与文件名称、时间、大小等信息无关,仅与内容有关
  • MD5
  • SHA256

文件的内容只要不发生变化,HASH值就是唯一的 计算文件的hash值 [root@liruilong ~] cp /etc/passwd /root/pass [root@liruilong ~] sed -i '5d' /root/pass [root@liruilong ~]sha256sum和sha512sum都是计算hash值的,区别是长度不同 [root@liruilong ~] sha512sum /etc/passwd c42b1c3531cd9d45c669845906f033c19cb40d626febdccd1e4834f1feb40730e4d52e0317dfd3f5 7f7406a23c10901be8d65787398beeae4513d71838f34803 /etc/passwd

数据安全检测脚本

[root@liruilong ~]!/bin/bash #为/etc/下所有以 .conf 结尾的文件生成hash值,保存到/tmp/data.log文件中 for i in $(ls /etc/*.conf) do md5sum $i >> /tmp/data.log done

运行脚本,查看结果 [root@liruilong ~] cat /tmp/data.log

SSH配置

sshd配置

sshd主配置文件:

shell脚本实现四则运算_shell脚本能做哪些事

  • Port 3389 // 改用非标准端口
  • PermitRootLogin no // 禁止root登录
  • UseDNS no //不解析客户机地址
  • AllowUsers 账户名 //设置远程连接的白名单,多个用户空格分割

cp /etc/ssh/sshd_config /opt/ [root@liruilong ~]过滤包含 port 的行 [root@liruilong ~]34;port" /opt/sshd_config sed -n '/^//p' /opt/sshd_config Port 22 grep -i 'permitrootlogin' /opt/sshd_config sed -n '/^//p' /opt/sshd_config PermitRootLogin yes grep -i "usedns" /opt/sshd_config sed -n '/^//p' /opt/sshd_config UseDNS yes sed -i '/^//' /opt/sshd_config [root@liruilong ~]39;/^//' /opt/sshd_config [root@liruilong ~]39;/^//' /opt/sshd_config

[root@liruilong ~]!/bin/bash 安全的远程配置脚本 conf="/opt/sshd_config" sed -i '/^Port/s/22/1122/' $conf sed -i '/^PermitRootLogin/s/yes/no/' $conf sed -i '/^UseDNS/s/yes/no/' $conf sed -i '$a AllowUsers tom' $conf systemctl restart sshd

sh /root/shell/day06/ssh_conf.sh sed -n '/^Port/p' /opt/sshd_config Port 1122 [root@liruilong ~]39;/^PermitRootLogin/p' /opt/sshd_config PermitRootLogin no [root@liruilong ~]39;/^UseDNS/p' /opt/sshd_config UseDNS no [root@liruilong ~]39;$p' /opt/sshd_config AllowUsers tom

、格式化输出passwd

格式输出

格式化输出各式化输出/etc/passwd,效果如下 :

awk -F: 'BEGIN{print "用户名 UID 家目录"} {print $1,$3,$6}' /etc/passwd 用户名 UID 家目录 root 0 /root bin 1 /bin daemon 2 /sbin ...... awk -F: 'BEGIN{print "用户名 UID 家目录"} {print $1,$3,$6}' /etc/passwd | column -t 用户名 UID 家目录 root 0 /root bin 1 /bin daemon 2 /sbin

过滤系统账户对应的密码

  • 在 awk中可以通过 -v 选项调用 shell 中的变量

hello="nihao" awk -v tmp=$hello 'BEGIN{print tmp}' nihao

  • 从 /etc/passwd 中将所有能登陆的账户名提取出来
  • 从 /etc/shadow 中提取账户对应的密码

[root@liruilong ~]!/bin/bash 39;/bash$/{print $1}' /etc/passwd) for i in $USER do awk -F: -v iuser=$i '$1==iuser{print $1,$2}' /etc/shadow done 注意单独使用时,$1=="root",要加双引号,代表字符串 awk -F: '$1=="root"{print $1,$2}' /etc/shadow

shell脚本实现四则运算_shell脚本能做哪些事

在这里插入图片描述

sh /root/shell/day06/userpass.sh root $6$pAL3P7fovbgv4LEv$zwO6BZTMSfyfFcIZHO8S.TQc8RDuBtj4dj3wJ5CdH0clUue3G15.0C0PpytA wh9Lo.Dcxl1q0j6.z09yOGH32/ zhangzhao $6$mcBYSo/SxmOFm8l.$NxqB4us2UerMMPRPHn4u2v4BdFqkPBza/5NA1IV/Z3.knseF7sNS8.171OPx KULoW7KBYY6qyM0VNxF2r6I.h0

、综合案例

一键PXE+kickstart

PXE:

  • PXE,全名Pre-boot Execution Environment,预启动执行环境;
  • 通过网络接口启动计算机,不依赖本地存储设备(如硬盘)或本地已安装的操作系统;由Intel和Systemsoft公司于1999年9月20日公布的技术;
  • lient/Server的工作模式;PXE客户端会调用网际协议(IP)、用户数据报协议(UDP)、动态主机设定协议(DHCP)、小型文件传输协议(TFTP)等网络协议;
  • PXE客户端(client)这个术语是指机器在PXE启动过程中的角色。一个PXE客户端可以是一台服务器、笔记本电脑或者其他装有PXE启动代码的机器(我们电脑的网卡)。

shell脚本实现四则运算_shell脚本能做哪些事

在这里插入图片描述

1、启动步骤详解

1、服务器加电启动,从DHCP服务器获取IP地址并加载(PXEClient)。 2、通过TFTP服务器获取网络引导程序(pxelinux.0)。 3、引导程序读取配置文件(pxelinux.cfg本例中文件名为:default)。 4、引导程序加载文件系统初始化(initrd)程序和内核初始镜像(vmlinuz)、自动应答程序(ks.cfg)。 5、按自动应答文件中指定的网络安装方式,以FTP方式安装linux系统。

一键PXE+kickstart

  • 部署 PXE+kickstart 环境 dhcp 服务tftp 服务http 服务kickstart 配置

cat << EOF > hello world > i am come here > i love the world > EOF hello world i am come here i love the world cat > /opt/password << EOF > hello world > i am come here > i love the world > EOF cat /opt/password hello world i am come here i love the world [root@liruilong ~]!/bin/bash 定义变量,让方便后面的调用,和提高适用性 DHCP_NET=192.168.4.0 DHCP_NETMASK=255.255.255.0 DHCP_MINIP=192.168.4.100 DHCP_MAXIP=192.168.4.200 DHCP_ROUTER=192.168.4.254 DHCP_NEXT_SERVER=192.168.4.5 HTTP_IP=192.168.4.5 安装软件包 yum -y install httpd dhcp tftp-server syslinux 临时停用SELinux setenforce 0 配置 DHCP 服务 cat > /etc/dhcp/dhcpd.conf << EOF subnet $DHCP_NET netmask $DHCP_NETMASK { range $DHCP_MINIP $DHCP_MAXIP; option routers $DHCP_ROUTER; default-lease-time 600; max-lease-time 7200; next-server $DHCP_NEXT_SERVER; filename "pxelinux.0"; } EOF systemctl restart dhcpd systemctl enable dhcpd 配置httpd共享服务器 if [ ! -e /dev/cdrom ];then echo "未检测到系统光盘/dev/cdrom,请插入光盘后再试" exit fi [ -d /var/www/html/cdrom ] || mkdir /var/www/html/cdrom mount /dev/cdrom /var/www/html/cdrom systemctl start httpd 配置kickstart 文件 cat > /var/www/html/ks.cfg << EOF install keyboard 'us' rootpw --plaintext redhat url --url="http://$HTTP_IP/cdrom" lang en_US firewall --disabled auth --useshadow --passalgo=sha512 text selinux --disabled network --bootproto=dhcp --device=eth0 reboot timezone Asia/Shanghai bootloader --location=mbr zerombr clearpart --all --initlabel part /boot --fstype="xfs" --size=500 part / --fstype="xfs" --grow --size=1 %packages @base %end EOF 配置tftp服务 cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/ cp /var/www/html/cdrom/isolinux/* /var/lib/tftpboot/ [ -d /var/lib/tftpboot/pxelinux.cfg ] || mkdir /var/lib/tftpboot/pxelinux.cfg 部署菜单文件 cat > /var/lib/tftpboot/pxelinux.cfg/default << EOF default vesamenu.c32 timeout 100 label linux menu label ^Install CentOS 7 kernel vmlinuz append initrd=initrd.img ks=http://$HTTP_IP/ks.cfg EOF systemctl start tftp 临时清空防火墙规则 iptables -F sh /root/shell/day06/pxe.sh systemctl status dhcpd | grep Active Active: active (running) since 一 2020-07-20 12:06:31 CST; 16min ago [root@liruilong ~]# systemctl status tftp | grep Active Active: active (running) since 一 2020-07-20 12:05:35 CST; 17min ago [root@liruilong ~]# systemctl status httpd | grep Active Active: active (running) since 一 2020-07-20 12:05:34 CST; 17min ago

本文【shell脚本实现四则运算_shell脚本能做哪些事】由作者: 递归 提供,本站不拥有所有权,只提供储存服务,如有侵权,联系删除!
本文链接:https://www.cuoshuo.com/blog/4237.html

(0)
上一篇 2023-03-11 08:32:04
下一篇 2023-03-11 08:43:17

相关推荐

  • access数据库修复命令_access数据库备份和还原

    微软的产品并不是很稳定,这是有目共睹的。 因此编制程序,一定要记得备份!否则出了问题再修复解决就麻烦了。我也吃过这样的亏,希望后来的人不犯同样的错。 现在我推荐我所使用的方法,给大家。希望对大家有所帮助。 我使用的是用rar的命令行做压缩和备份。它能够在他人使用源文件的同时进行压缩和备份,不占空间,每次运行可自动备份成不同的文件等等。 方法一: 建立一个ba…

    2023-03-13
    800
  • c语言int类型占几个字节(int到底占几个字节)

    什么是指针 C语言里,变量存放在内存中,而内存其实就是一组有序字节组成的数组,每个字节有唯一的内存地址。CPU 通过内存寻址对存储在内存中的某个指定数据对象的地址进行定位。这里,数据对象是指存储在内存中的一个指定数据类型的数值或字符串,它们都有一个自己的地址,而指针便是保存这个地址的变量。也就是说:指针是一种保存变量地址的变量。前面已经提到内存其实就是一组有…

    2023-03-15
    400
  • 嵌入式家电是什么意思

    现代家居美学讲究严谨,家电流行嵌入式风格,尤其是要严丝合缝才算做得好。其实最难做嵌入式安装的就是冰箱,安装上突出一块儿或者两侧留缝都不太好。如何选择一款合适的嵌入式冰箱正成为需求新的需求趋势。 正装修或打算装修的业主们不要急,TCL冰洗将在2月21日召开春季发布会将会发布超薄零嵌系列冰箱,据说能轻松做到无缝嵌入哦。 先来问大家一个问题:你认为的“嵌入式”冰箱…

    2023-03-20
    000
  • 私有云公有云混合云基本概念_公有云有哪些

    1、公有云 公有云就类似于一个寄存点,你把东西存放在那里,只享受它服务的使用权。公有云通常指第三方提供商为用户提供的能够使用的云,公有云的核心属性是共享资源服务。优点是成本低,使用方便,扩展性好,不用担心安装和维护的问题。 百度云就是一个很好的例子。缺点也很明显,共享的资源都缺少一个数据的安全性。用户对云端的资源缺乏控制,并且所以用户的数据都存储在一起,这中…

    2023-03-11
    400
  • c语言流程图生成手机软件

    流程图制作软件哪个好?今天给大家分享两款好用的流程图制作软件。 一、GitMind GitMind是第一款要分享给大家的全平台流程图制作软件,软件支持在电脑、手机上同时使用。 主要功能: 在线制作流程图、思维导图、ER图、组织架构图、网络拓扑图、用例图等等十多种图形。 推荐理由: 完全免费在线使用 操作简单易上手 支持制作泳道图,拓扑图、数据流图、ER图等 …

    2023-03-13
    800
  • 平面设计经典实例教程

    构图是平面设计的必修课,怎样安排元素字体的大小、位置和关系?才能够突出主题,又显得生动有冲击力? 构图其实就是把所有元素有机地组织在一个画面里面,使之形成一个统一的整体。 对称构图就是把版面一分为二,可分为上下或者左右对称,画面给人平衡的感觉,结构平衡,相互对应,具有稳定、呼吸、相对的特点,可以使得画面显得安静、庄严。缺点是容易呆板、缺少变化。 主物体位于画…

    2023-03-17
    100
  • replace函数中间增加一个数_replace函数替换多个内容

    REPLACE函数在Excel或wps表格中的功能是将指定位置的特定数量的字符串用新字符串来代替。平时比较常见的例子就是将表格中的一些个人信息,比如人的名字,电话号码,用“*”来替换,以达到保护个人信息的目 这个函数的语法有以下参数:REPLACE(old_text, start_num, num_chars, new_text) old_text:要替换其…

    2023-03-08
    1800
  • c语言基础知识入门书籍推荐

    全篇干货,我敢保证对你绝对有用。C语言是一种通用的,面向过程的高级编程语言,他以易于理解,简洁灵活,语法易读,成为了目前世界上最流行和最具影响力的语言之一。 那么新手在学习c语言的入门阶段,该怎么快速巩固基础? 我把自己压箱底的宝贝书单总结了一下,我真的不知道当初自己为什么要和C语言这么较真,明明现在用Java比较多。 希望能减少大家四处搜索的时间吧。 1、…

    2023-03-08
    1100
  • 手机安卓root权限获取,手机怎么root权限

    Root,对于任何手机发烧友、玩机客、从事移动设备研发的人员来说,并不陌生,它代表绝大部分移动设备的使用者能够掌握到的最高权限。 从技术层次来讲,用户拥有了修改系统文件的权限,甚至可以控制账户、增加或删除硬件等,但对普通用户来说,最大的一个用处就是卸载“Root之前无法卸载的软件”,部分品牌商在手机出厂之前内置安装了一些无法卸载的软件,这些软件在手机Root…

    2023-03-16
    100
  • jsp注释方法_jsp调用Java中的一个方法

    前言:在CGI(通用网关接口)编程风行的日子,人们纷纷寻思简化并让其更加灵活的新方法和新技术,包括PHP、JSP、ASP。1997年SUN公司推出了servlet,1999年初,SUN公司推出了JSP,实际上在servlet基础上修改而成。JSP即Java服务器页面(Java Server Page),将HTML和JAVA代码使用某种方式结合起来,完成前后端…

    2023-03-09
    400

发表回复

登录后才能评论
返回顶部
错说博客上线啦!