Shell和Bush-Linux自动化运维
Shell和Bush—Linux自动化运维
前言
Hello,各位码友,大家好。感谢您点开这篇文章。希望在接下来的几分钟里您所看到的内容不辜负您宝贵的宝贵时间,也希望我的总结对您有所帮助。欢迎大家读完本文在下方评论区与我交流讨论互动,我在评论区等你们哦。
好啦,做好准备了吗?好戏开场啦!!!
自动化运维
什么是Shell?
一个完整的计算机体系结构包括软件和硬件,而软件又分为系统软件与应用软件,负责对硬件进行管理与操作的是系统软件的内核部分,用户是无法与硬件和内核打交道的,用户通过应用程序和部分系统软件发出指令(可能是通过浏览器发送一封邮件),这些指令会被翻译并且传递给内核,内核在得知用户的需求后调度硬件资源来完成操作。
在Linux的环境下,我们可以通过Shell与内核进行交流,并最终达到我们要使用计算机资源的目的。由于Linux的开放性特点,使得在Linux下对Shell的选择也很多,CentOS 7 系统中可以使用的Shell有/bin/sh、/bin/bash、/bin/tcsh、/bin/csh这几种,/etc/shells文件说明了当前系统有哪些可用的Shell。不同的Shell有不同的特点及炒作方式,这里以CentOS默认使用的Shell为例来开展本次的学习,也就是Bash。
Bash的功能简介
命令历史
Bash拥有自动记录命令历史的功能,用户执行的命令都会在注销时自动记录到自己家目录下的.bash_history
隐藏文件中。查看这些命令历史记录的方法有很多,可以通过直接打开文件来查看,也可以通过键盘的上下键来上翻或下翻历史记录,还可以通过history
命令来查看历史记录,所有的命令历史都有记录编号。命令历史能够记录的信息数量由HISTSIZE
变量所决定,CentOS 7 默认通过/etc/profile
文件定义了HISTSIZE=1000
,也就是做多可以记录最近所使用的1000条命令,当有第1001条命令执行时,第一条命令就会被覆盖,执行histort -c
命令可以清空所有的历史记录。
记录命令历史除了可以查看历史记录外,还可以在需要时直接调用历史记录再次执行该命令。
- 上下翻阅历史命令,找到合适的命令后海子街回车键即可执行
- 输入
!string
调用历史命令(string为关键字),如!242将直接调用命令历史的第242条记录并执行 - 通过
Ctrl+r
快捷键打开搜索功能,接着输入关键字,即可在命令历史中搜索相关的命令,按回车键来完成执行操作。如果没有搜索到合适的命令,按Esc键退出搜索。
命令别名
CentOS 7 系统中,我们可以直接使用ll
命令来显示文件的详细信息,其实系统中并没有ll
命令,它只是被提前定义好的一个别名而已,别名的好处是可以把本来很长的指令简化缩写,为常用且复杂的命令及选项创建别名可以大大提高日常工作效率。
[[email protected] ~]# alias #查看系统当前所有的别名
alias cp='cp -i'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
[[email protected] ~]# alias h5='head -5' #定义新的别名
[[email protected] ~]# unalias h5 #取消定义别名
管道与重定向
Bush的标准 输入设备时键盘、鼠标、手写板等设备,标准输出设备是显示器,一般我们通过键盘输入命令并执行,系统将返回信息显示在屏幕上,默认不论是正确的还是错误的信息都将会输出到显示器。标准输入的文件描述符为0,标准输出的文件描述符为1,错误输出的文件描述符为2。但是有时候我们饿需要改变这样的标准输入与输出方式,Linux中可以使用重定向符(<、>、<<、>>、|)重新定义输入和输出。
管道使得我们可以将多条命令连接在一起使用,他的作用是将一个命令的标准输出重定向给下一个命令,并作为该命令的标准输入。例如,使用ifconfig eno16777736|grep 'inet addr'
命令过滤包含IP地址的行,ifconfig
本身会输出大量的网络接口信息,由于这里使用了管道符号(|),所以ifconfig
命令的所有 输出都将作为grep
命令的输入内容,最终实现过滤包含IP地址的行。
对于标准的输出信息是输出到显示器,而有时候你可能不需要这些信息,有或者是暂时不需要这些信息。另外,对于输入,一般是通过键盘输入,而有事你或许希望可以从文件中读取输入信息。输出冲抵昂想可以使用>
、>>
符号,使用>
可以将输出导入到文件,如果文件不存在,则创建这个文件,如果文件已经存在,则将会覆盖文件内容;而使用>>
可以将输出追加至文件;对应错误信息的重定向需要使用2>
或2>>
符号实现。输入重定向可以使用<
符号,他可以帮助我们从文件中提取输入信息。
下面通过几个简单的实例演示重定向的使用方法
[[email protected] ~]# rpm -qa |grep gcc #查询计算机中是否安装了gcc软件
[[email protected] ~]# echo "pass" | passwd --stdin tom #设置tom的面为pass
[[email protected] ~]# ls #查看当前文件列表
[[email protected] ~]# ls > list.txt #将输出保存到list.txt,屏幕无输出
[[email protected] ~]# hostname >> list.txt #将主机名追加至list.txt文件末尾
[[email protected] ~]# mail -s test [email protected] < list.txt #发送邮件,邮件内容来自文件
[[email protected] ~]# ls -l abc initial-setup-ks.cfg #查看文件详细信息,abc并不存在
ls: 无法访问abc: 没有那个文件或目录
-rw-r--r--. 1 root root 1735 4月 25 08:31 initial-setup-ks.cfg
[[email protected] ~]# ls -l abc initial-setup-ks.cfg 2> error.txt
-rw-r--r--. 1 root root 1735 4月 25 08:31 initial-setup-ks.cfg #仅将错误重定向,不影响正确输出
[[email protected] ~]# ls -l sbc initial-setup-ks.cfg > all 2>&1 #标准输出余错误输出均导入至all
[[email protected] ~]# ls -l sbc initial-setup-ks.cfg >> all 2>&1 #标准输出与错误输出追加至all
[[email protected] ~]# ls -l sbc initial-setup-ks.cfg &> all #标准输出与错误输出均导入至all
快捷键
Bash提供了大量的快捷键为用户所使用,熟练掌握这些快捷键会提高工作效率。下面的表格中列出了常用的快捷键机器功能描述。
快捷键 | 功能描述 |
---|---|
Ctrl+a | 光标移动到行首 |
Ctrl+e | 光标移动到行尾 |
Ctrl+f | 光标右移一个字符 |
Ctrl+b | 光标左移一个字符 |
Ctrl+l | 清屏,相当于clear命令 |
Ctrl+u | 删除光标至行首的字符 |
Ctrl+k | 删除光标至行尾的字符 |
Ctrl+c | 终止进程 |
Ctrl+z | 挂起进程(jobs命令查看挂起进程) |
Ctrl+w | 删除光标前一个单词(以空格为分隔符) |
Alt+d | 删除光标后一个单词 |
Tab | 自动补齐 |
Bash使用技巧
重定向技巧
如果年编写了一个脚本实现自动修改系统账号的密码,那么默认当前密码修改成功后系统会出现successfully提示信息,如果需要修改20个账户面,则显示20条这样信息。像这样的案例大量的成功提示信息并不是我们的关注的重点,管理员更多的是关心错误提示。所以这时候可以考虑将标准正确输出屏蔽,Linux中提供了一个特殊设备/dev/null
,它很像太阳黑洞,任何东西向内写入都将永远消失。对大量的无意义的输出信息,可以通过冲抵昂想导入/dev/null
设备,命令如下:
[[email protected] ~]# echo "pass" | passwd --stdin root >/dev/null
标准输出与错误输出分离重定向,很多时候自动运行的脚本编写完成后,是在深夜服务器负载最低时以无人值守的方式运行的,name当管理员去检查脚本运行情况时,会希望看到哦呦哪些命令执行成功了,有哪些命令出现了问题,并且为了方便管理,需要将正确输出与错误输出分别保存在两个不同的记录文件中,这时候分离重定向就显得尤为重要。
下面检查系统中是否存在tom用户 ,如果存在,则将tom先关信息记录至user文件中,否则记录到error文件中。
[[email protected] ~]# id tom >> user 2>> error
命令序列使用技巧
在Linux中,我们可以使用控制字符(;、&&、||、&)来控制命令的执行方式。其中【&】控制符使得命令开启一个字Shell,并在后台执行;使用【;】控制字符可以把多个命令组合,但多个命令之间没有任何逻辑上的关系,仅按顺序执行;使用【&&】控制控制字符可以将多个命令组合,但仅当前一个命令执行失败才会执行【||】控制符的作用与【&&】刚好相反,仅当前一个命令执行失败才会执行【||】控制符后面的命令。
come on,我们来举几个例子
第一个栗子:
火狐浏览器通过前端启动,使用当前Shell将暂时无法使用。
[[email protected] ~]# firefox
第二个栗子:
后台运行浏览器,不影响当前Shell的使用
[[email protected] ~]# firefox &
第三个栗子:
所有命令按顺序执行(不管前面的命令是否成功,后面的命令一定正常执行)
[[email protected] ~]# ls /tmp ; ls /root ; ls /home
第四个栗子:
如果某个文件存在,则显示该文件内容,否则报错(仅当ls
执行成功才会执行cat
)
[[email protected] ~]# ls test.txt && cat test.txt
第五个栗子:
如果有gedit编辑器,则打开该程序,否则打开vim编辑器
[[email protected] ~]# gedit || vim
第六个栗子:
如果id tom
执行成功,则说明用户存在,屏幕将显示【Hi,tom】,否则将显示【No suchuser】
[[email protected] ~]# id tom &>/dev/null && echo "Hi tom" || echo "No such user"
第六个栗子首先通过【&>】重定向将id
命令的所有输出屏蔽,然后使用【&&】与【||】来判断id
命令是否执行成功,成功就显示问候语,否则显示没有该用户。
作业控制技巧
Bush环境中通过命令开启进程的时候使用【&】符号可以使该程序进入后台执行,以后随时可以使用jobs
命令查看这些后台进程,并且会为每个这样的进程分配一个编号,通过【fg<编号>】的形式可以将这些后台进程再次调回前台执行
[[email protected] ~]# firefox &
[[email protected] ~]# jobs
[[email protected] ~]# fg l
花括号的使用技巧
通过括号扩展可以生成命令行或脚本所需要的字符串,括号中可以包含连续的序列或使用逗号分隔的多个项目,连续的序列包括一个起点与一个终点,并使用【…】分隔。
来,我们一起来看一下语法格式
[[email protected] ~]# echo {a,b,c}
[[email protected] ~]# echo user{1,5,8}
[[email protected] ~]# echo {0..10}
[[email protected] ~]# echo {0..10..2}
[[email protected] ~]# echo a{2..-1}
[[email protected] ~]# mkdir /tmp/{dir1,dir2,dir3}
[[email protected] ~]# ls -ld /tmp/dir{1,2,3}
[[email protected] ~]# chmod 777 /tmp/dir{1,2}
本次分享就到这里,感谢您的宝贵时间!!!
希望有所帮助。