教程:Shell编程(上)丨你不知道的玩法~
优采云 发布时间: 2022-11-26 16:43教程:Shell编程(上)丨你不知道的玩法~
一、前言
1 为什么要学习壳牌?什么是外壳?Shell 脚本语言是实现 Linux/UNIX
系统管理和自动化运维所必需的重要工具,Linux/UNIX 系统的底层和基础应用软件的核心主要涉及 shell 脚本的内容。每个合格的Linux系统管理员或运维工程师都需要精通编写shell脚本语言,并能够阅读系统附带的shell脚本内容和各种软件。只有这样,才能提高运维人员的工作效率,适应复杂的工作环境,减少不必要的重复工作,为个人职场发展打下更好的基础。
shell 是命令解释器,位于操作系统的最外层,负责直接与用户对话,将用户的输入解释给操作系统,并处理各种操作系统的输出,输出屏幕返回给用户。
2 什么是外壳脚本?
命令、变量和流控制语句是有机组合在一起的。
Shell 脚本擅长处理纯文本类型的数据,而在 Linux 中,几乎所有的配置文件、日志都是纯文本类型的文件。
3 脚本语言的类型
(1) 编译语言
定义:指使用专用编译器将一个高级语言源代码翻译成二进制机器码(带有操作数、指令和相应的格式),可以由硬件平台针对特定的操作平台(操作系统)直接运行,这个过程称为编译(./configure make makeinstall);编译后的可执行文件(.exe)可以在相应的平台上运行(可移植性差,但效率高)。
典型的编译语言有C、C++等。
(2) 解释性语言
定义:指使用专门的解释器将源程序逐行解释为特定平台的机器码并立即执行的语言;相当于将一种编译语言的编译链接过程混合在一起,同时完成。解释
型语言的执行效率较低,没有解释器就无法运行,但它们更容易跨平台,只需要提供特定的解释器。
常见的解释语言是Python(也是一种脚本语言)和Ruby。
(3) 脚本语言
定义:一种计算机编程语言,旨在缩短传统的编辑-编译-链接-运行过程。
特点:程序代码是最终的执行文件,但这个过程需要解释器的参与,所以脚本语言与解释语言有很大的关系。脚本语言通常是解释和执行的,程序是文本文件。
典型的脚本语言是JavaScript,Python,shell等。
其他常用的脚本语句类型:
PHP是一种Web程序和脚本语言。它是一种脚本语言,更侧重于网页开发(前端显示),例如:Dedecms,discuz。PHP 程序还可以处理系统日志、配置文件等,PHP 也可以调用系统命令。
Perl 脚本语言。比shell脚本强大得多,语法灵活复杂,实现方法多,不易阅读,团队协作困难,但仍然是一种很好的脚本语言,大量的程序软件。MHA是高度可用的,由Perl编写。
Python,不仅可以做脚本程序开发,还可以实现Web程序和软件的开发。在过去的两年里,越来越多的公司会要求Python。
shell脚本和php/perl/python语言有什么区别和优势?shell 脚本
的优点是可以处理操作系统的底层业务(Linux 系统内部的应用程序由 shell 脚本完成),因为有大量的 Linux 系统命令支持它。超过 2000 个命令是 shell 脚本编程的强大支持,尤其是 grep、awk、sed 等。例如:一键式软件安装、优化、监控报警脚本,常规业务应用,shell开发更简单快捷,符合简单、易用、高效运维的原则。
PHP和Python的优势在于运维工具的开发,Web界面管理工具,Web服务开发等。处理一键式软件安装、优化、报警脚本。Php/Python 也可以用于常规业务应用程序。但是开发效率和复杂性比使用 shell 要差得多。
系统环境说明
[root@oldboy scripts]# cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)
[root@oldboy scripts]# uname -r
3.10.0-693.el7.x86_64
[root@oldboy scripts]# getenforce
Disabled
[root@oldboy scripts]# systemctl status firewalld.service
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
Active: inactive (dead)
Docs: man:firewalld(1)
4 系统中的外壳
在系统中查看命中解释器
[root@oldboy ~]# cat /etc/shells
/bin/sh/bin/bash/sbin/nologin/usr/bin/sh/usr/bin/bash/usr/sbin/nologin
流行操作系统的默认外壳
Linux is Bourne Again shell (bash) 2.Solaris 和 FreeBSD 默认使用 Bourne shell(sh)3。在AIX下是Korn Shell (ksh) 4.HP-UX默认为POSIX shell(sh)。
[root@oldboy ~]# echo $SHELL
/bin/bash
砰
砰版
[root@oldboy scripts]# bash -version
GNU bash, 版本 4.2.46(2)-release (x86_64-redhat-linux-gnu)
Copyright (C) 2011 Free Software Foundation, Inc.
许可证 GPLv3+: GNU GPL 许可证版本3或者更高
这是自由软件,您可以自由更改和重新分发它。在法律允许的范围内不提供保证
Bash 外壳漏洞
使用 命令 env x='() { :;}; echo be careful' bash -c "echo this is a test"
如果返回结果为一行,则为正常,
[root@oldboy ~]# env x='() { :;}; echo be careful' bash -c "echo this is a test"
this is a test
#解决办法 升级当前的bash版本
yum install update bash
sh和bash之间的关系
[root@oldboy ~]# ll /bin/sh
lrwxrwxrwx. 1 root root 4 11月 13 11:15 /bin/sh -> bash
/bin 和 /user/bin 之间的关系
[root@oldboy ~]# ll /bin -d
lrwxrwxrwx. 1 root root 7 11月 13 11:15 /bin -> usr/bin
2.剧本写作规范
1 脚本存储在统一目录中
[root@oldboy ~]# mkdir -p /server/scripts/
[root@oldboy ~]# cd /server/scripts/
2 选择口译员
注意格式:开头的“#!”字符也称为幻数,在执行 bash 脚本时,内核会响应“#!解释器确定使用哪个程序来解释脚本的内容。
<p>[root@oldboy scripts]# head -1 /etc/init.d/*
==> /etc/init.d/functions /etc/init.d/netconsole /etc/init.d/network