目录
一、前言
首先介绍系统内核和Shell终端的关系与作用,然后介绍Bash解释器的4大优势并学习Linux命令的执行方法。经验丰富的运维人员能够通过合理地组合适当的命令与参数,来更精准地满足工作需求,迅速得到自己想要的结果,还可以尽可能地降低系统资源消耗。
本文精挑细选出读者有必要首先学习的数十个Linux命令,它们与系统工作、系统状态、工作目录、文件、目录、打包压缩与搜索等主题相关。
二、强大好用的SHELL
一台完整的计算机是由运算器、控制器、存储器、输入/输出等多种硬件设备共同组成的,而能让各种硬件设备各司其职且又能协同运行的东西就是系统内核。Linux系统的内核负责完成对硬件资源的分配、调度等管理任务,对系统的正常运行起着十分重要的作用。
与修改Windows系统中的注册表类似,直接改动内核参数的难度比较大,而且一旦“手滑”还有可能导致系统直接崩溃。因此不建议同学们直接去编辑内核中的参数,而是用基于系统调用接口开发出来的程序或服务来管理计算机,以满足日常的工作需要。
如图2-1所示,人类是无法直接控制硬件的(想象一个人捧着块硬盘自言自语的滑稽场景)。硬件设备由系统内核直接管理,但由于内核的复杂性太高,在访问时存在较大的风险,因此用户不能直接访问内核。虽然通过调用系统提供的API(应用程序编程接口)就能实现某个功能,但哪怕实现“将一条信息通过互联网传输给别人”这样简单的任务,都要手动调用几十次API接口,使用起来太不切实际。而最外层的服务程序则是最贴近于用户端的,这些服务程序是集成了大量API接口的完整软件,微信、QQ就是这样的服务程序。
图2-1 用户与硬件
讲到这里,相信大家已经能够明白服务程序对用户和硬件所能发挥的作用了。如果把整台电脑比喻成人类社会,那么服务程序就是一名翻译官,负责将用户提出的需求转换成硬件能够接收的指令代码,然后再将处理结果反馈成用户能够读懂的内容格式。这样一来一回,用户就能使用硬件资源了。
看到被一层层“包裹”起来的硬件设备,大家有没有感觉像一只蜗牛的壳呢?英文中的壳叫作Shell,我们在行业中也将用户终端程序称之为Shell,方便好记。
Shell就是终端程序的统称,它充当了人与内核(硬件)之间的翻译官,用户把一些命令“告诉”终端程序,它就会调用相应的程序服务去完成某些工作。现在包括红帽系统在内的许多主流Linux系统默认使用的终端是Bash(Bourne-Again SHell)解释器,这个Bash解释器主要有以下4项优势:
通过上下方向键来调取执行过的Linux命令;
命令或参数仅需输入前几位就可以用Tab键补全;
具有强大的批处理脚本;
具有实用的环境变量功能。
大家可以在今后的学习和生产工作中细细体会Linux系统命令行的美妙之处,真正从心里爱上它们。
Tips
Shell与Bash是包含与被包含的关系。举例来说,在社会中有翻译官这个职业,它是由许多从业者共同组成的职业名称,而Bash则是其中一个出色的成员,是Shell终端程序中的一份子。
必须肯定的是,Linux系统中有些图形化工具(比如逻辑卷管理器[Logical Volume Manager,LVM])确实非常好用,极大地降低了运维人员出错的概率,值得称赞。但是,很多图形化工具其实只是调用了命令脚本来完成相应的工作,或往往只是为了完成某种特定工作而设计的,缺乏Linux命令原有的灵活性及可控性。再者,图形化工具相较于Linux命令行界面会更加消耗系统资源,因此经验丰富的运维人员甚至都不会给Linux系统安装图形界面,在需要开始运维工作时直接通过命令行模式远程连接过去。不得不说,这样做确实挺高效的。
三、 执行命令的必备知识
既然Linux系统中已经有了Bash这么好用的“翻译官”,那么接下来就有必要好好学习一下怎么跟它沟通了。要想准确、高效地完成各种任务,仅依赖于命令本身是不够的,还应该根据实际情况来灵活调整各种命令的参数。比如,我们切寿司时尽管可以用菜刀,但米粒一定会撒得满地都是,因此寿司刀上设计的用于透气的圆孔就是为了更好地适应场景而额外增加的参数。当您学完本书并具备一定的工作经验之后,一定能够领悟Linux命令的奥秘。
常见的执行Linux命令的格式是下面这样的。
命令名称 [命令参数] [命令对象]
命令名称:就是语法中的“动词”,表达的是想要做的事情,例如创建用户、查看文件、重启系统等操作。
命令参数:用于对命令进行调整,让“修改”过的命令能更好地贴合工作需求,达到事半功倍的效果。就像买衣服一样,衣服的尺码总会感觉偏大或偏小,要么只能将就着穿,要么就再裁剪修改一下,而这种对命令进行“裁剪”的行为就是加参数。例如创建一个编码为888的用户、仅查看文件的前20行、重启系统前先提醒其他用户等。参数可以用长格式(完整的选项名称),也可以用短格式(单个字母的缩写),两者分别用“--”与“-”作为前缀(示例请见表2-1)。
表2-1 Linux命令参数的长格式与短格式示例
长格式 | man --help |
短格式 | man -h |
命令对象:一般指要处理的文件、目录、用户等资源名称,也就是命令执行后的“承受方”。例如创建一位叫小明的用户、查看一个叫工资表的文件、重启一个IP为192.168.10.10的系统等。
Tips
命令名称、命令参数与命令对象之间要用空格进行分隔,且字母严格区分大小写。
在Linux相关的图书中,我们会约定俗成地将可选择的、可加或可不加的、非必需的参数使用中括号引起来,例如“man [命令参数]”;而命令所要求的、必须有的参数或对象值,则不带中括号。这样一来,读者可以更好地理解下面出现的命令格式。
在初学Linux系统时不会执行命令大多是因为参数比较复杂,参数值需要随不同的命令和实际工作情况而发生改变。所以有读者现在可能会想:“Linux系统中有那么多命令,我怎么知道某个命令是干嘛用的?在日常工作中遇到了一个不熟悉的Linux命令,我又怎样才能知道它有哪些可用参数呢?”接下来,我们就拿man这个命令作为本书中的第一个Linux命令教给读者去学习。对于真正的零基础读者,可以通过图2-2~图2-5来学习如何在RHEL 8系统中执行Linux命令。
默认的主机登录界面中只有我们刚刚新建的普通用户,因此在正式进入系统之前,还需要先单击“Not listed?”选项切换至root管理员身份。这是红帽RHEL 8系统为了避免用户乱使用权限而采取的一项小措施,如图2-2所示。
图2-2 切换至root管理员身份
如果使用默认的linuxprobe用户登录到主机中,那么本章后面的一些命令会因为权限不足而无法执行,我们需要有足够的权限才能完成接下来的实验。至于同学们关心的“root管理员和普通用户之间的区别,在生产环境时又该如何选择”的疑问,将会在第5章慢慢讲给大家。
登录成功后,单击桌面左上角的Activities按钮,在左侧弹出的菜单中单击命令行终端图标即可打开Bash解释器,如图2-3所示。
图2-3 打开命令行终端
在命令行终端中输入man man命令来查看man命令自身的帮助信息,如图2-4所示。
图2-4 查看man命令的帮助信息
敲击回车键后即可看到如图2-5所示的帮助信息。
图2-5 man命令的帮助信息
小试牛刀成功。大家是不是热情倍增!不过还是要注意Linux系统中的命令、参数、对象都是严格区分大小写的。比如,分别执行几次man命令,大家能看得出来哪个是正确的吗?
[root@linuxprobe ~]# Man bash: Man: command not found... Similar command is: 'man' [root@linuxprobe ~]# MAN bash: MAN: command not found... Similar command is: 'man' [root@linuxprobe ~]# man What manual page do you want?
在man命令帮助信息的界面中,所包含的常用操作按键及其作用如表2-2所示。
表2-2 man命令中常用按键以及作用
按键 | 作用 |
空格键 | 向下翻一页 |
PaGe down | 向下翻一页 |
PaGe up | 向上翻一页 |
home | 直接前往首页 |
end | 直接前往尾页 |
/ | 从上至下搜索某个关键词,如“/linux” |
? | 从下至上搜索某个关键词,如“?linux” |
n | 定位到下一个搜索到的关键词 |
N | 定位到上一个搜索到的关键词 |
q | 退出帮助文档 |
一般来讲,使用man命令查看到的帮助内容信息都会很长很多,如果读者不了解帮助文档信息的目录结构和操作方法,乍一看到这么多信息可能会感到相当困惑。man命令的帮助信息的结构及其代表意义如表2-3所示。
表2-3 man命令中帮助信息的结构以及意义
结构名称 | 代表意义 |
NAME | 命令的名称 |
SYNOPSIS | 参数的大致使用方法 |
DESCRIPTION | 介绍说明 |
EXAMPLES | 演示(附带简单说明) |
OVERVIEW | 概述 |
DEFAULTS | 默认的功能 |
OPTIONS | 具体的可用选项(带介绍) |
ENVIRONMENT | 环境变量 |
FILES | 用到的文件 |
SEE ALSO | 相关的资料 |
HISTORY | 维护历史与联系方式 |
需要多说一句的是,在输入命令前就已经存在的“[root@linuxprobe~]#”这部分内容是终端提示符,它用于向用户展示一些基本的信息—当前登录用户名为root,简要的主机名是linuxprobe,所在目录是~(这里的~是指用户家目录,第6章会讲解),#表示管理员身份(如果是$则表示普通用户,相应的权限也会小一些)。
额外的4个快捷键/组合键小技巧
Tab键:
在Bash解释器的快捷键中,Tab键绝对是使用频率最高的,它能够实现对命令、参数或文件的内容补全。例如,如果想执行reboot重启命令,但一时想不起来该命令的完整拼写,则可以这样输入:
[root@linuxprobe ~]# re<Tab键><Tab键> read redhat-access-insights rescan-scsi-bus.sh readarray reject reset readelf remotectl resize2fs readlink rename resizecons readmult renew-dummy-cert resizepart readonly renice resolvconf readprofile report-cli resolvectl realm reporter-rhtsupport restorecon realpath reporter-upload restorecon_xattr reboot report-gtk return recode-sr-latin repquota rev red request-key [root@linuxprobe ~]# reb<Tab键> [root@linuxprobe ~]# reboot
在上面的实验中,先输入了两个字母re,随后敲击了两下Tab键。由于以re开头的命令不止一个,所以系统将所有以re开头的命令全部显示了出来。而第二次输入reb后再敲击Tab键,由于此时没有以reb开头的其他命令,所以系统就显示出了完整的reboot重启命令。
对于文件名也是一样的操作—只需要输入前面的一部分名称,且不存在多个以这部分名称开头的文件名,系统就会自动补全。不仅速度快,而且避免了手动输入有可能出错的问题。
Ctrl+c组合键:当同时按下键盘上的Ctrl和字母c的时候,意味着终止当前进程的运行。假如执行了一个错误命令,或者是执行某个命令后迟迟无法结束,这时就可以冷静地按下Ctrl+c组合键,命令行终端的控制权会立刻回到我们手中。
下述命令的执行效果是每1s刷新一次系统负载情况(先不用管命令的作用),直到按下Ctrl+c组合键时才停止运行。
[root@linuxprobe ~]# watch -n 1 uptime Every 1.0s: uptime localhost.localdomain: Mon Sep 28 19:11:44 2020 19:11:44 up 59 min, 2 users, load average: 0.00, 0.00, 0.00 <Ctrl>+<c> [root@linuxprobe ~]#
Ctrl+d组合键:当同时按下键盘上的Ctrl和字母d的时候,表示键盘输入结束。
Ctrl+l组合键:当同时按下键盘上的Ctrl和字母l的时候,会清空当前终端中已有的内容(相当于清屏操作)。
从现在开始,本书后面的内容都是重磅内容。本书将会带领读者掌握大约150个常用的Linux命令,以及50多个热门的命令。这50多个热门的命令是以Linux命令大全网(www.linuxcool.com)的查询阅览量为基础筛选出来的。当然,将这些命令全都放到第2章讲完肯定不现实,所以刘遄老师根据10多年来的运维经验优先筛选出了10多个高频使用的基础命令。由于后面的章节中会反复用到这些命令,因此大家需要好好学习并掌握它们,这样才能在后面章节的学习中做到游刃有余。加油!
四、常用系统工作命令
您现在阅读的这本书是刘遄老师在经历了数十期的培训授课后总结而成的,您可能无法在本节中找到某些之前见过的命令。但不用担心,之所以这样安排,原因是我们在努力地将Linux命令与实战相结合,真正让读者在实操中理解技术,而不是单纯地把命令堆砌到书中让读者去硬背。
刘遄老师用了近一年的时间把最常用的Linux命令进行汇总、归纳、整理、分类后,把这些常用的命令合理安排到了后续章节中,然后采用以练代学的方式来加深读者的理解和掌握。从数年的培训成果反馈来看,这种方式相当有效,因此也相信这种方式肯定适合您的学习。
1.echo命令
echo命令用于在终端设备上输出字符串或变量提取后的值,语法格式为“echo [字符串] [$变量]”。
这是Linux系统中最常用的几个命令之一,它的操作却非常简单,执行“echo字符串”或“echo $变量”就行,其中$符号的意思是提取变量的实际值,以便后续的输出操作。
例如,把指定字符串“LinuxProbe.com”输出到终端屏幕的命令为:
[root@linuxprobe ~]# echo LinuxProbe.com
该命令会在终端屏幕上显示如下信息:
LinuxProbe.com
下面使用“$变量”的方式提取出变量SHELL的值,并将其输出到屏幕上:
[root@linuxprobe ~]# echo $SHELL /bin/bash
2.date命令
date命令用于显示或设置系统的时间与日期,语法格式为“date [+指定的格式]”。
用户只需在强大的date命令后输入以“+”号开头的参数,即可按照指定格式来输出系统的时间或日期,这样在日常工作时便可以把备份数据的命令与指定格式输出的时间信息结合到一起。例如,把打包后的文件自动按照“年-月-日”的格式打包成“backup-2020-9-1.tar.gz”,用户只需要看一眼文件名称就能大致了解到每个文件的备份时间了。date命令中常见的参数格式及其作用如表2-4所示。
表2-4 date命令中的参数及其作用
参数 | 作用 |
%S | 秒(00~59) |
%M | 分钟(00~59) |
%H | 小时(00~23) |
%I | 小时(00~12) |
%m | 月份(1~12) |
%p | 显示出AM或PM |
%a | 缩写的工作日名称(例如:Sun) |
%A | 完整的工作日名称(例如:Sunday) |
%b | 缩写的月份名称(例如:Jan) |
%B | 完整的月份名称(例如:January) |
%q | 季度(1~4) |
%y | 简写年份(例如:20) |
%Y | 完整年份(例如:2020) |
%d | 本月中的第几天 |
%j | 今年中的第几天 |
%n | 换行符(相当于按下回车键) |
%t | 跳格(相当于按下Tab键) |
按照默认格式查看当前系统时间的date命令如下所示:
[root@linuxprobe ~]# date Sat Sep 5 09:13:45 CST 2020
按照“年-月-日 小时:分钟:秒”的格式查看当前系统时间的date命令如下所示:
[root@linuxprobe ~]# date "+%Y-%m-%d %H:%M:%S" 2020-09-05 09:14:35
将系统的当前时间设置为2020年11月1日8点30分的date命令如下所示:
[root@linuxprobe ~]# date -s "20201101 8:30:00" Sun Nov 1 08:30:00 CST 2020
再次使用date命令并按照默认的格式查看当前的系统时间,如下所示:
[root@linuxprobe ~]# date Sun Nov 1 08:30:08 CST 2020
date命令中的参数%j可用来查看今天是当年中的第几天。这个参数能够很好地区分备份时间的早晚,即数字越大,越靠近当前时间。该参数的使用方式以及显示结果如下所示:
[root@linuxprobe ~]# date "+%j" 306
3.timedatectl命令
timedatectl命令用于设置系统的时间,英文全称为“time date control”,语法格式为“timedatectl [参数]”。
发现电脑时间跟实际时间不符?如果只差几分钟的话,我们可以直接调整。但是,如果差几个小时,那么除了调整当前的时间,还有必要检查一下时区了。timedatectl命令中常见的参数格式及作用如表2-5所示。
表2-5 timedatectl命令中的参数以及作用
参数 | 作用 |
status | 显示状态信息 |
list-timezones | 列出已知时区 |
set-time | 设置系统时间 |
set-timezone | 设置生效时区 |
查看系统时间与时区的方法如下:
[root@linuxprobe ~]# timedatectl status Local time: Sun 2020-09-06 19:51:22 CST Universal time: Sun 2020-09-06 11:51:22 UTC RTC time: Sun 2020-09-06 19:51:21 Time zone: Asia/Shangh