Linux基础命令(一)
1. 系统状态检测命令
1.1 查看网络信息
ifconfig 命令用于获取网卡配置与网络状态等信息,格式为“ifconfig [网络设备] [参数]”
主要查看的
是网卡名称、inet 参数后面的 IP 地址、ether 参数后面的网卡物理地址(又称为 MAC 地址),
以及 RX、TX 的接收数据包与发送数据包的个数及累计流量(即下面加粗的信息内容):

$ ifconfig
1.2 查看内核及系统版本
uname 命令用于查看系统内核与系统版本等信息,格式为“uname [-a]”
在使用 uname 命令时,一般会固定搭配上-a 参数来完整地查看当前系统的内核名称、主
机名、内核发行版本、节点名、系统时间、硬件名称、硬件平台、处理器类型以及操作系统
名称等信息。
$ uname -a
输出结果为
Linux localhost.localdomain 3.10.0-1160.45.1.el7.x86_64 #1 SMP Wed Oct 13 17:20:51 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
如果要查看当前系统版本的详细信息,则需要查看 redhat-release 文件,其命令以及相应的结果如下:
$ cat /etc/redhat-release
输出结果为:
CentOS Linux release 7.9.2009 (Core)
1.3 查看系统负载
uptime 用于查看系统的负载信息
uptime 命令可以显示当前系统时间、系统已运行时间、启用终端数量以
及平均负载值等信息。平均负载值指的是系统在最近 1 分钟、5 分钟、15 分钟内的压力情
况(下面加粗的信息部分);负载值越低越好,尽量不要长期超过 1,在生产环境中不要超过 5
$ uptime
输出结果:
16:37:06 up 47 min, 2 users, load average: 0.01, 0.04, 0.05
1.4 查看当前系统内存使用量
格式为“free [-h]”。
为了保证 Linux 系统不会因资源耗尽而突然宕机,运维人员需要时刻关注内存的使用量。
在使用 free 命令时,可以结合使用-h 参数以更人性化的方式输出当前内存的实时使用量信息。
$ free
输出结果:
total used free shared buff/cache available
Mem: 3861280 1214488 1328980 29516 1317812 2355768
Swap: 2097148 0 2097148
$ free -h
输出结果:
内存总量 已用量 可用量 远程共享量 磁盘缓存内存量
total used free shared buff/cache available
Mem: 3.7G 1.2G 1.3G 28M 1.3G 2.2G
Swap: 2.0G 0B 2.0G
1.5 查看等入住机用户信息
$ who
输出结果:
用户名 终端设备 登陆时间
qy :0 2021-11-15 15:51 (:0)
qy pts/0 2021-11-15 15:54 (:0)
1.6 查看所有系统的登记记录
使用 last 命令可以查看本机的登录记录。但是,由于这些信息都是以日志文件的形式保
存在系统中,因此黑客可以很容易地对内容进行篡改。千万不要单纯以该命令的输出信息而
判断系统有无被恶意入侵!
last
执行结果:
qy pts/0 :0 Mon Nov 15 15:54 still logged in
qy pts/0 :0 Mon Nov 15 15:53 - 15:53 (00:00)
qy pts/0 :0 Mon Nov 15 15:52 - 15:53 (00:01)
1.7 显示历史执行命令
执行 history 命令能显示出当前用户在本地计算机
中执行过的最近 1000 条命令记录。如果觉得 1000 不够用,还可以自定义/etc/profile 文件中的
HISTSIZE 变量值。在使用 history 命令时,如果使用-c 参数则会清空所有的命令历史记录。
还可以使用“!编码数字”的方式来重复执行某一次的命令。总之,history 命令有很多有趣的
玩法等待您去开发。
$ history
执行结果:
237 uname -a
238 cat /etc/redhat-release
239 uptime
240 free
241 free -h
242 who
243 last
244 history
历史命令会被保存到用户家目录中的.bash_history 文件中。Linux 系统中以点(.)开
头的文件均代表隐藏文件,这些文件大多数为系统服务文件,可以用 cat 命令查看其文件
内容。
$ cat ~/.bash_history
要清空当前用户在本机上执行的 Linux 命令历史记录信息,可执行如下命令:
$ history -c
1.8 收集系统配置及架构信息,并输出诊断文档
当 Linux 系统出现故障需要联系技术支持人员时,大多数时候都要先使用这个命令来简
单收集系统的运行状态和服务配置信息,以便让技术支持人员能够远程解决一些小问题,亦
或让他们能提前了解某些复杂问题。在下面的输出信息中,加粗的部分是收集好的资料压缩
文件以及校验码,将其发送给技术支持人员即可:
$ sosreport # 执行完毕后一路回车,生成对应/var/tmp/目录下的压缩包 和md5值
2. 工作目录切换命令
2.1 pwd 显示当前工作目录
$ pwd
输出结果:
/etc
2.2 cd 切换工作路径
可以通过 cd 命令迅速、灵活地切换到不同的工作目录。
除了常见的切换目录方式,还可以使用“cd -”命令返回到上一次所处的目录,
使用“cd..”命令进入上级目录,以及使用“cd ~”命令切换到当前用户的家目录,亦或使用
“cd ~username”切换到其他用户的家目录。例如,可以使用“cd 路径”的方式切换进/etc 目录中
$ cd /etc
2.3 ls 显示目录的文件信息
参数:
-a # 显示全部文件(包括隐藏文件)
-l # 查看文件属性,大小等详细信息
将这两个参数整合之后,再执行ls命令即可查看当前目录中的所有文件并输出这些文件的属性信息
如果想要查看目录属性信息,则需要额外添加一个-d 参数。例如,可使用如下命令查看
/etc 目录的权限与属性信息:
$ ls -ld /etc
输出结果:
drwxr-xr-x. 150 root root 12288 11月 15 11:11 /etc/
3. 文本编辑命令
3.1 cat 查看小文件
$ cat 文件名
3.2 more 查看大文件
如果需要阅读长篇小说或者非常长的配置文件,那么“小猫咪”可就真的不适合了。因
为一旦使用 cat 命令阅读长篇的文本内容,信息就会在屏幕上快速翻滚,导致自己还没有来得
及看到,内容就已经翻篇了。因此对于长篇的文本内容,推荐使用 more 命令来查看。more
命令会在最下面使用百分比的形式来提示您已经阅读了多少内容。您还可以使用空格键或回
车键向下翻页:
more 文件名
3.3 head 查看文本前N行
$ head -n 20 文件名 # 查看文件的前20行
3.4 tail 查看文本后N行/持续刷新的内容
需要查看文本内容的最后 20 行,这时就需要用到
tail 命令了。tail 命令的操作方法与 head 命令非常相似,只需要执行“tail -n 20 文件名”命令
就可以达到这样的效果。tail 命令最强悍的功能是可以持续刷新一个文件的内容,当想要实时
查看最新日志文件时,这特别有用,此时的命令格式为“tail -f 文件名”
$ tail -n 20 文件名
3.5 tr 替换文本文件中的字符
我们想要快速地替换文本中的一些词汇,又或者把整个文本内容都进行替
换,如果进行手工替换,难免工作量太大,尤其是需要处理大批量的内容时,进行手工替换
更是不现实。这时,就可以先使用 cat 命令读取待处理的文本,然后通过管道符(详见第 3
章)把这些文本内容传递给 tr 命令进行替换操作即可。例如,把某个文本内容中的英文全部
替换为大写:
cat 文件名 | tr 需要替换的字符
3.6 wc 统计文本行数,字数,字节数
参数:
-l # 只显示行数
-w # 只显示单词数
-c # 只显示字节数
Linux 系统中,passwd 是用于保存系统账户信息的文件,要统计当前系统中有多少个
用户,可以使用下面的命令来进行查询
wc -l /etc/passwd
3.7 stat 查看文件的具体存储信息和时间
命令 stat anaconda-ks.cfg 会显示出文件的三种时间状态(已加粗):
Access、Modify、Change。这三种时间的区别将在下面的 touch命令中详细详解:
$ stat anaconda-ks.cfg
输出结果:
文件:"anaconda-ks.cfg"
大小:2926 块:8 IO 块:4096 普通文件
设备:803h/2051d Inode:33574980 硬链接:1
权限:(0600/-rw-------) Uid:( 0/ root) Gid:( 0/ root)
最近访问:2021-11-15 17:18:57.795865120 +0800
最近更改:2021-06-29 18:40:05.423049296 +0800
最近改动:2021-06-29 18:40:05.423049296 +0800
创建时间:-
3.8 cut 按列提取文本字符
Linux 系统中,如何准确地提取出最想要的数据,这也是我们应该重点学习的内容。一般
而言,按基于“行”的方式来提取数据是比较简单的,只需要设置好要搜索的关键词即可。但是
如果按列搜索,不仅要使用-f 参数来设置需要看的列数,还需要使用-d 参数来设置间隔符号。
passwd 在保存用户数据信息时,用户信息的每一项值之间是采用冒号来间隔的,接下来我们使用
下述命令尝试提取出 passwd 文件中的用户名信息,即提取以冒号(:)为间隔符号的第一列内容:
$ cut -d: -f1 /etc/passwd
输出结果
root
bin
daemon
adm
lp
sync
shut
3.9 diff 比较多个文本文件的差异
使用 diff 命令时,不仅可以使用--brief 参数来确认两个文件是否不同,还可以使用-c
参数来详细比较出多个文件的差异之处,这绝对是判断文件是否被篡改的有力神器。例如,
先使用 cat 命令分别查看 diff_A.txt 和 diff_B.txt 文件的内容,然后进行比较:
比较后的结果,判断文件是否相同:
diff --brief 文件1 文件2
-c 参数描述文件内容具体的不同:
diff -c 文件1 文件2
4 文件目录管理命令
4.1 touch 创建空白文件或设置文件时间
格式为“touch [选项] [文件]”
比如,touch linuxprobe 命令可以创建出一个名为 linuxprobe 的空白文本文件。对 touch 命
令来讲,有难度的操作主要是体现在设置文件内容的修改时间(mtime)、文件权限或属性
的更改时间(ctime)与文件的读取时间(atime)上面
参数:
-a # 仅修改"读取时间(atime)"
-m # 仅修改"修改时间(mtime)"
-d # 同时修改atime 和 mtime
我们先使用 ls 命令查看一个文件的修改时间,然后修改这个文件,最后再通过 touch
命令把修改后的文件时间设置成修改之间的时间(很多黑客就是这样做的呢):
$ touch -d text.txt

4.2 mkdir 创建空白目录,
格式为“mkdir [选项] 目录”。
在 Linux 系统中,文件夹是最常见的文件类型之一。除了能创建单个空白目录外,mkdir
命令还可以结合-p 参数来递归创建出具有嵌套叠层关系的文件目录。
$ mkdir linuxdir
$ mkdir -p a/b/c/e # 递归创建目录
4.3 cp 复制文件或目录
格式为“cp [选项] 源文件 目标文件”。
如果目标文件是目录,则会把源文件复制到该目录中;
如果目标文件也是普通文件,则会询问是否要覆盖它;
如果目标文件不存在,则执行正常的复制操作。
参数:
-p # 保留原始文件的属性
-d # 若对象为"链接文件",则保留该"链接文件"的属性
-r # 递归持续复制(用于目录)
-i # 若目标文件存在则询问是否覆盖
-a # 相当于 -pdr(p,d,r为上述参数)
接下来,使用 touch 创建一个名为 install.log 的普通空白文件,然后将其复制为一份名为
x.log 的备份文件,最后再使用 ls 命令查看目录中的文件:
touch installer.log
cp installer.log x.log
4.4 mv 剪切文件或将文件重命名
格式为“mv [选项] 源文件 [目标路径|目标文件名]”
剪切操作不同于复制操作,因为它会默认把源文件删除掉,只保留剪切后的文件。如果
在同一个目录中对一个文件进行剪切操作,其实也就是对其进行重命名:
mv x.log linux.log # 重命名
4.5 rm 删除文件或目录
格式为“rm [选项] 文件”。
在 Linux 系统中删除文件时,系统会默认向您询问是否要执行删除操作,如果不想总是
看到这种反复的确认信息,可在 rm 命令后跟上-f 参数来强制删除。另外,想要删除一个目录,
需要在 rm 命令后面一个-r 参数才可以,否则删除不掉。
rm 文件名
rm -r 删除目录
rm -rf # 不询问,强制删除
4.6 dd 按照指定大小和个数的数据块来复制或转换文件
格式为“dd [参数]"
dd 命令是一个比较重要而且比较有特色的一个命令,它能够让用户按照指定大小和个数
的数据块来复制文件的内容。当然如果愿意的话,还可以在复制过程中转换其中的数据。Linux
系统中有一个名为/dev/zero 的设备文件,每次在课堂上解释它时都充满哲学理论的色彩。因
为这个文件不会占用系统存储空间,但却可以提供无穷无尽的数据,因此可以使用它作为 dd
命令的输入文件,来生成一个指定大小的文件。
参数:
if # 输入的文件名称
of # 输出的文件名称
bs # 设置每个"块"的大小
count # 设置要复制"块"的个数
例如我们可以用 dd 命令从/dev/zero 设备文件中取出一个大小为 560MB 的数据块,然后
保存成名为 560_file 的文件。在理解了这个命令后,以后就能随意创建任意大小的文件了:
dd if=/dev/zer of=560_file count=1 bs=560M
dd 命令的功能也绝不仅限于复制文件这么简单。如果您想把光驱设备中的光盘制作成 iso 格
式的镜像文件,在 Windows 系统中需要借助于第三方软件才能做到,但在 Linux 系统中可以直接
使用 dd 命令来压制出光盘镜像文件,将它编程一个可立即使用的 iso 镜像:
dd if=/dev/cdrom of=RHEL-server-7.0-x86_64-LinuxProbe.Com.iso
考虑到有些读者会纠结 bs 块大小与 count 块个数的关系,下面举一个吃货的例子进行
解释。假设小明的饭量(即需求)是一个固定的值,用来盛饭的勺子的大小即 bs 块大小,
而用勺子盛饭的次数即 count 块个数。小明要想吃饱(满足需求),则需要在勺子大小(bs
块大小)与用勺子盛饭的次数(count 块个数)之间进行平衡。勺子越大,用勺子盛饭的次数
就越少。有上可见,bs 与 count 都是用来指定容量的大小,只要能满足需求,可随意组合搭
配方式。
4.7 file 查看文件类型
格式为“file 文件名”。
在 Linux 系统中,由于文本、目录、设备等所有这些一切都统称为文件,而我们又不能
单凭后缀就知道具体的文件类型,这时就需要使用 file 命令来查看文件类型了。
file 文件名
5. 打包压缩与搜索命令
5.1 tar 文件压缩或解压
格式为“tar [选项] [文件]”
在 Linux 系统中,常见的文件格式比较多,其中主要使用的是.tar 或.tar.gz 或.tar.bz2 格式,我
们不用担心格式太多而记不住,其实这些格式大部分都是由 tar 命令来生成的
参数:
-c # 创建压缩文件
-x # 解开压缩文件
-t # 查看压缩包内有哪些文件
-z # 用Gzip 压缩或解压
-j # 用bzip2 压缩或解压
-v # 显示压缩或解压过程
-f # 目标文件名
-p # 保留原始的权限与属性
-P # 使用绝对路径来压缩
-C # 指定解压到的目录
-c 参数用于创建压缩文件,-x 参数用于解压文件,因此这两个参数不能同时使用。
-z 参数指定使用 Gzip 格式来压缩或解压文件,-j 参数指定使用 bzip2 格式来压缩或解
压文件。用户使用时则是根据文件的后缀来决定应使用何种格式参数进行解压。在执行某些
压缩或解压操作时,可能需要花费数个小时,如果屏幕一直没有输出,您一方面不好判断打
包的进度情况,另一方面也会怀疑电脑死机了,因此非常推荐使用-v 参数向用户不断显示压
缩或解压的过程。-C 参数用于指定要解压到哪个指定的目录。-f 参数特别重要,它必须放到
参数的最后一位,代表要压缩或解压的软件包名称。
一般使用“tar -czvf 压缩包名称.tar.gz 要打包的目录”
命令把指定的文件进行打包压缩;相应的解压命令为“tar -xzvf 压
缩包名称.tar.gz”。
。下面我们来逐个演示下打包压缩与解压的操作。先使用 tar 命令把/etc 目录
通过 gzip 格式进行打包压缩,并把文件命名为 etc.tar.gz:
tar -czvf etc.tar.gz /etc # 打包/etc目录,指定文件名为etc.tar.gz
接下来将打包后的压缩包文件指定解压到/root/etc 目录中 先使用 mkdir 命令来创建
/root/etc 目录
mkdir /root/etc
tar xzvf etc.tar.gz -C /root/etc # -C 指定解压到指定目录
5.2 grep 文本中进行关键字搜索,并显示匹配结果
格式为“grep [选项] [文件]”
参数:
-b # 将可执行文件当做文本文件来搜索
-c # 仅显示找到的行数
-i # 忽略大小写
-n # 显示行数
-v # 反向选择--仅列出没有"关键词"的行
两个最最常用的参数:-n 参数用来显示搜索到信息的行号;-v 参数用于反选信息(即没有包含关键词的所有信息行)
在 Linux 系统中,/etc/passwd 文件是保存着所有的用户信息,而一旦用户的登录终端被
设置成/sbin/nologin,则不再允许登录系统,因此可以使用 grep 命令来查找出当前系统中不允
许登录系统的所有用户信息:
grep /sbin/nologin /etc/passwd
5.3 find 按照指定文件来查找文件
find [查找路径] 寻找条件 操作
在 Linux 系统中,搜索工作一般都是通过 find 命令来完成的,它可以使用不同的文件特性作
为寻找条件(如文件名、大小、修改时间、权限等信息),一旦匹配成功则默认将信息显示到
屏幕上。
-name # 匹配名称
-perm # 匹配权限(mode 为完全匹配,-mode 为包含即可)
-user # 匹配所有者
-group # 匹配所有组
-mtime -n +n # 匹配修改内容的时间(-n 指 n 天以内,+n 指 n 天以前)
-atime-n +n # 匹配访问文件的时间(-n 指 n 天以内,+n 指 n 天以前)
-ctime -n +n # 匹配修改文件权限的时间(-n 指 n 天以内,+n 指 n 天以前)
-nouser # 匹配无所有者的文件
-nogroup # 匹配无所有组的文件
-newer f1 !f2 # 匹配比文件 f1 新但比 f2 旧的文件
--type b/d/c/p/l/f # 匹配文件类型(后面的字幕参数依次表示块设备、目录、字符设备、管道、链接文件、文本文件)
-size # 匹配文件的大小(+50KB 为查找超过 50KB 的文件,而-50KB 为查找小于50KB 的文件)
-prune # 忽略某个目录
-exec …… {}\; # 后面可跟用于进一步处理搜索结果的命令(下文会有演示)
这里需要重点讲解一下-exec 参数重要的作用。这个参数用于把 find 命令搜索到的结果交
由紧随其后的命令作进一步处理,它十分类似于第 3 章将要讲解的管道符技术,并且由于 find
命令对参数的特殊要求,因此虽然 exec 是长格式形式,但依然只需要一个减号(-)。
根据文件系统层次标准(Filesystem Hierarchy Standard)协议,Linux 系统中的配置文件
会保存到/etc 目录中(详见第 6 章)。如果要想获取到该目录中所有以 host 开头的文件列表,
可以执行如下命令:
find /etc -name "host*" -print
如果要在整个系统中搜索权限中包括 SUID 权限的所有文件(详见第 5 章),只需使用
-4000 即可:
find / -perm -4000 -print
在整个文件系统中找出所有归属于 linuxprobe 用户的文件并复制到 /root/findresults 目录
该实验的重点是“-exec {} ;”参数,其中的{}表示 find 命令搜索出的每一个文
件,并且命令的结尾必须是“;”。完成该实验的具体命令如下:
find / -user linuxprobe -exec cp -a {} /root/findresults/ \;
复习题
1.在 RHEL 7 系统及众多的 Linux 系统中,最常使用的 Shell 终端是什么?
答:Bash(Bourne-Again SHell)解释器。
2.执行 Linux 系统命令时,添加参数的目的是什么?
答:为了让 Linux 系统命令能够更贴合用户的实际需求进行工作。
3.Linux 系统命令、命令参数及命令对象之间,普遍应该使用什么来间隔?
答:应该使用一个或多个空格进行间隔。
4.请写出用 echo 命令把 SHELL 变量值输出到屏幕终端的命令。
答:echo $SHELL。
5.简述 Linux 系统中 5 种进程的名称及含义。
答:在 Linux 系统中,有下面 5 种进程名称。
¾
R(运行):进程正在运行或在运行队列中等待。
¾
S(中断):进程处于休眠中,当某个条件形成后或者接收到信号时,则脱离该状态。
¾
D(不可中断):进程不响应系统异步信号,即便用 kill 命令也不能将其中断。
¾
Z(僵死):进程已经终止,但进程描述符依然存在, 直到父进程调用 wait4()系统函数
后将进程释放。
¾
T(停止):进程收到停止信号后停止运行。
6.请尝试使用 Linux 系统命令关闭 PID 为 5529 的服务进程。
答:执行 kill 5529 命令即可;若知道服务的名称,则可以使用 killall 命令进行关闭。
7.使用 ifconfig 命令查看网络状态信息时,需要重点查看的 4 项信息分别是什么?
答:这 4 项重要信息分别是网卡名称、IP 地址、网卡物理地址以及 RX/TX 的收发流量数
据大小。
8.使用 uptime 命令查看系统负载时,对应的负载数值如果是 0.91、0.56、0.32,那么最近 15
分钟内负载压力最大的是哪个时间段?
答:通过负载数值可以看出,最近 1 分钟内的负载压力是最大的。
9.使用 history 命令查看历史命令的执行记录时,命令前面的数字除了排序外还有什么用处?
答:还可以用“!数字”的命令格式重复执行某一次的命令记录,从而避免了重复输入较
长命令的麻烦。
10.若想查看的文件具有较长的内容,那么使用 cat、more、head、tail 中的哪个命令最
合适?
答:文件内容较长,使用 more 命令;反之使用 cat 命令。
11.在使用 mkdir 命令创建有嵌套关系的目录时,应该加上什么参数呢?
答:应该加上-p 递归迭代参数,从而自动化创建有嵌套关系的目录。
12.在使用 rm 命令删除文件或目录时,可使用哪个参数来避免二次确认呢?
答:可使用-f 参数,这样即可无需二次确认。
13.若有一个名为 backup.tar.gz 的压缩包文件,那么解压的命令应该是什么?
答:应该用 tar 命令进行解压,执行 tar -xzvf backup.tar.gz 命令即可。
14.使用 grep 命令对某个文件进行关键词搜索时,若想要进行文件内容反选,应使用什么
参数?
答:可使用-v 参数来进行匹配内容的反向选择,即显示出不包含某个关键词的行。
6. 管道符,重定向与环境变量
6.1 输入输出重定向
简而言之,输入重定向是指把文件导入到命令中,而输出重定向则是指把原本要输出到
屏幕的数据信息写入到指定文件中。在日常的学习和工作中,相较于输入重定向,我们使用
输出重定向的频率更高,所以又将输出重定向分为了标准输出重定向和错误输出重定向两种
不同的技术,以及清空写入与追加写入两种模式。
-
标准输入重定向(STDIN,文件描述符为 0):默认从键盘输入,也可从其他文件或命
令中输入。 -
标准输出重定向(STDOUT,文件描述符为 1):默认输出到屏幕
-
错误输出重定向(STDERR,文件描述符为 2):默认输出到屏幕
比如我们分别查看两个文件的属性信息,其中第二个文件是不存在的,虽然针对这两个
文件的操作都分别会在屏幕上输出一些数据信息,但这两个操作的差异其实很大:
[root@linuxprobe ~]# touch linuxprobe
[root@linuxprobe ~]# ls -l linuxprobe
-rw-r--r--. 1 root root 0 Aug 5 05:35 linuxprobe
[root@linuxprobe ~]# ls -l xxxxxx
ls: cannot access xxxxxx: No such file or directory
在上述命令中,名为 linuxprobe 的文件是存在的,输出信息是该文件的一些相关权限、
所有者、所属组、文件大小及修改时间等信息,这也是该命令的标准输出信息。而名为 xxxxxx
的第二个文件是不存在的,因此在执行完 ls 命令之后显示的报错提示信息也是该命令的错误
输出信息。那么,要想把原本输出到屏幕上的数据转而写入到文件当中,就要区别对待这两
种输出信息。
对于输入重定向来讲,用到的符号及其作用如表
符号 作用
命令 < 文件 将文件作为命令的标准输入
命令 << 分界符 从标准输入中读入,直到遇见分界符才停止
命令 < 文件 1 > 文件 2 将文件 1 作为命令的标准输入并将标准输出到文件 2
对于输出重定向来讲,用到的符号及其作用如表
符号 作用
命令 > 文件 将标准输出重定向到一个文件中(清空原有文件的数据)
命令 2> 文件 将错误输出重定向到一个文件中(清空原有文件的数据)
命令 >> 文件 将标准输出重定向到一个文件中(追加到原有内容的后面)
命令 2>> 文件 将错误输出重定向到一个文件中(追加到原有内容的后面)
命令 >> 文件 2>&1 或 命令 &>> 文件 将标准输出与错误输出共同写入到文件中(追加到原有内容的后面)
对于重定向中的标准输出模式,可以省略文件描述符 1 不写,而错误输出模式的文件描述符 2
是必须要写的。
通过标准输出重定向将 man bash 命令原本要输出到屏幕的信息
写入到文件readme.txt 中,然后显示readme.txt 文件中的内容。具体命令如下:
man bash > readme.txt # 将手册中 bash 描述细腻系 输出到readme.txt
首先通过覆盖写入模式向 readme.txt 文件写入一行数据(该文件
中包含上一个实验的 man 命令信息),然后再通过追加写入模式向文件再写入一次数据,其
命令如下:
echo "hello world" > readme.txt # 覆盖写入
echo "hello man" >> readme.txt # 追加写入
ls -l original-ks.cfg > readme.txt # 将执行ls -l 的结果覆盖输出到readme.txt 文件中
ls -l origissnal-ks.cfg > readme.txt # 当文件不存在时,会报错,不会输出到文件中
# 如果想把错误信息写入到文件中时应该怎么操作呢?
ls -l origissnal-ks.cfg 2> readme.txt # 操作符:2>
# 输入重定向的作用是把文件直接导入到命令中,接下来使用输入重定向把readme.txt文件导入给wc -l命令,统计一下文件中的内容行数
wc -l < readme.txt
6.2 管道命令符
管道符的作用:"把前一个命令原本要输出到屏幕的数据当作是后一个命令的标准输入"
找出被限制登录用户的命令是 grep "/sbin/nologin" /etc/passwd;
统计文本行数的命令则是 wc -l。
将上述两个命令合并成一条:
grep "sbin/nologin" /etc/passwd | wc -l # 先将结果查出来,当做标准输出,然后通过ws -l 命令统计
这个管道符就像一个法宝,我们可以将它套用到其他不同的命令上,比如用翻页的形
式查看/etc 目录中的文件列表及属性信息(这些内容默认会一股脑儿地显示到屏幕上,根本
看不清楚):
ls -l /etc/ | more
在修改用户密码时,通常都需要输入两次密码以进行确认,这在编写自动化脚本时将成为一个非常致命的缺陷。通过把管道符和 passwd 命令的--stdin 参数相结合,我们可以用一条命令来完成密码重置操作:
echo "linuxprobe" | passwd --stdin root
比如,在发送电子邮件时,默认采用交互式的方式来进行,我们完全可以利用一条结合了管道符的命令语句,
把编辑好的内容与标题一起“打包”,最终用这一条命令实现邮件的发送。
echo "Content" | mail -s "subject" linuxprobe
su - linuxprobe
mail
6.3 命令行通配符
如果就记得一个文件的开头几个字母,想遍历查找出所有以这个关键词开头的文件,该怎么操作呢?
ls -l /dev/sda*
如果只想查看文件名为 sda 开头,但是后面还紧跟其他某一个字符的文件的相关信息,
该怎么操作呢?这时就需要用到问号来进行通配了。
ls -l /dev/sda?
除了使用[0-9]来匹配 0~9 之间的单个数字,也可以用[135]这样的方式仅匹配这三个指定
数字中的一个,若没有匹配到,则不会显示出来:
ls -l /dev/sda[0-9]
ls -l /dev/sda[135]
6.4 常用转义字符
4 个最常用的转义字符如下所示。
反斜杠(\):使反斜杠后面的一个变量变为单纯的字符串。
单引号(''):转义其中所有的变量为单纯的字符串。
双引号(""):保留其中的变量属性,不进行转义处理。
反引号(``):把其中的命令执行后返回结果。
我们先定义一个名为 PRICE 的变量并赋值为 5,然后输出以双引号括起来的字符串与变
量信息:
PRICE=50 # linux中以全大写定义变量
echo "Price is $PRICE" # 输出变量
接下来,我们希望能够输出“Price is $5”,即价格是 5 美元的字符串内容,但碰巧美元
符号与变量提取符号合并后的$$作用是显示当前程序的进程 ID 号码,于是命令执行后输出的
内容并不是我们所预期的:
echo "price is $$PRICE"
price is 37135PRICE # 当前程序的进程号
要想让第一个“$”乖乖地作为美元符号,那么就需要使用反斜杠(\)来进行转义,将
这个命令提取符转义成单纯的文本,去除其特殊功能。
echo "Price is \$$PRICE"
而如果只需要某个命令的输出值时,可以像命令这样,将命令用反引号括起来,达到
预期的效果。例如,将反引号与 uname -a 命令结合,然后使用 echo 命令来查看本机的 Linux
版本和内核信息:
echo `uname -a`
6.5 环境变量
在用户执行了一条命令之后,Linux 系统中到底发生了什么事情呢?简单来说,命令在 Linux 中的
执行分为 4 个步骤。
第1步:判断用户是否以绝对路径或相对路径的方式输入命令(如/bin/ls),如果是的话则直接执行。
第2步:Linux 系统检查用户输入的命令是否为“别名命令”,即用一个自定义的命令名称来替换原本的命令名称。可以用 alias 命令来创建一个属于自己的命令别名,格式为“alias 别名=命令”。若要取消一个命令别名,则是用 unalias 命令,格式为“unalias 别名”。
alias rm='rm -i'
unalias rm
第3步:Bash 解释器判断用户输入的是内部命令还是外部命令。内部命令是解释器内部的指令,会被直接执行;而用户在绝大部分时间输入的是外部命令,这些命令交由步骤 4 继续处理。可以使用“type 命令名称”来判断用户输入的命令是内部命令还是外部命令。
第4步:系统在多个路径中查找用户输入的命令文件,而定义这些路径的变量叫作 PATH,可以简单地把它理解成是“解释器的小助手”,作用是告诉 Bash 解释器待执行的命令可能存放的位置,然后 Bash 解释器就会乖乖地在这些位置中逐个查找。PATH 是由多个路径值组成的变量,每个路径值之间用冒号间隔,对这些路径的增加和删除操作将影响到 Bash 解释器对Linux 命令的查找。
echo $PATH # 输出所有的命令存放路径
PATH = $PATH:/root/bin # 添加一个环境变量
为什么不能将当前目录(.)添加到 PATH 中呢?
答: 尽管可以将当前目录(.)添加到 PATH 变量中,从而在某些情况下可以让用户免去输入命令
所在路径的麻烦。但是,如果黑客在比较常用的公共目录/tmp 中存放了一个与 ls 或 cd 命令同
名的木马文件,而用户又恰巧在公共目录中执行了这些命令,那么就极有可能中招了。
所以,作为一名态度谨慎、有经验的运维人员,在接手了一台 Linux 系统后一定会在执
行命令前先检查 PATH 变量中是否有可疑的目录,
另外读者从前面的 PATH 变量示例中是否也感觉到环境变量特别有用呢。我们可以使用 env 命令来查看到 Linux 系统中所有的环境变量,下面是一些常用的环境变量
变量名称 作用
HOME 用户的主目录(即家目录)
SHELL 用户在使用的 Shell 解释器名称
HISTSIZE 输出的历史命令记录条数
HISTFILESIZE 保存的历史命令记录条数
MAIL 邮件保存路径
LANG 系统语言、语系名称
RANDOM 生成一个随机数字
PS1 Bash 解释器的提示符
PATH 定义解释器搜索用户执行命令的路径
EDITOR 用户默认的文本编辑器
Linux 作为一个多用户多任务的操作系统,能够为每个用户提供独立的、合适的工作运
行环境,因此,一个相同的变量会因为用户身份的不同而具有不同的值。例如,我们使用下
述命令来查看 HOME 变量在不同用户身份下都有哪些值(su 是用于切换用户身份的命令)
echo $HOME
su root
echo $HOME
其实变量是由固定的变量名与用户或系统设置的变量值两部分组成的,我们完全可以自
行创建变量,来满足工作需求。例如设置一个名称为 WORKDIR 的变量,方便用户更轻松地
进入一个层次较深的目录:
mkdir /home/workdir
WORKDIR=/home/workdir
cd WORKDIR
pwd
但是,这样的变量不具有全局性,作用范围也有限,默认情况下不能被其他用户使用。
如果工作需要,可以使用 export 命令将其提升为全局变量,这样其他用户也就可以使用它了:
# root权限设置全局变量
export WORKDIR
复习题
1.把 ls 命令的正常输出信息追加写入到 error.txt 文件中的命令是什么?
答:ls >> error.txt
2.请简单概述管道符的作用。
答:把左面(前面)命令的输出值作为右面(后面)命令的输入值以便进一步处理信息。
3.Bash 解释器的通配符中,星号(*)代表几个字符?
答:零个或多个。
4.PATH 变量的作用是什么?
答:设定解释器搜索所执行的命令的路径。
5.使用什么命令可以把名为 LINUX 的一般变量转换成全局变量?
答:export LINUX。
7.Vim编辑器和shell命令脚本
7.1 vim编辑器
Vim编辑器的三种模式
命令模式:控制光标移动,可对文本进行复制、粘贴、删除和查找等工作。
输入模式:正常的文本录入。
末行模式:保存或退出文档,以及设置编辑环境。

在每次运行 Vim 编辑器时,默认进入命令模式,此时需要先切换到输入模式后再进行文
档编写工作,而每次在编写完文档后需要先返回命令模式,然后再进入末行模式,执行文档
的保存或退出操作。在 Vim 中,无法直接从输入模式切换到末行模式。
命令 作用
dd 删除(剪切)光标所在整行
5dd 删除(剪切)从光标处开始的 5 行
yy 复制光标所在整行
5yy 复制从光标处开始的 5 行
n 显示搜索命令定位到的下一个字符串
N 显示搜索命令定位到的上一个字符串
u 撤销上一步的操作
p 将之前删除(dd)或复制(yy)过的数据粘贴到光标后面
末行模式主要用于保存或退出文件,以及设置 Vim 编辑器的工作环境,还可以让用户执
行外部的 Linux 命令或跳转到所编写文档的特定行数。要想切换到末行模式,在命令模式中
输入一个冒号就可以了。
命令 作用
:w 保存
:q 退出
:q! 强制退出(放弃对文档的修改内容)
:wq! 强制保存退出
:set nu 显示行号
:set nonu 不显示行号
:命令 执行该命令
:整数 跳转到该行
:s/one/two 将当前光标所在行的第一个 one 替换成 two
:s/one/two/g 将当前光标所在行的所有 one 替换成 two
:%s/one/two/g 将全文中的所有 one 替换成 two
?字符串 在文本中从下至上搜索该字符串
/字符串 在文本中从上至下搜索该字符串
输入模式
可以分别使用 a、i、o 三个键从命令模式切换到输入模式。其中,a 键 与 i 键分别是在光标后面一位和光标当前位置切换到输入模式,而 o 键则是在光标的下面再创建一个空行,此时可敲击 a 键进入到编辑器的输入模式,
7.2 文本编辑 -- 配置主机名称
为了便于在局域网中查找某台特定的主机,或者对主机进行区分,除了要有 IP 地址外,
还要为主机配置一个主机名,主机之间可以通过这个类似于域名的名称来相互访问。在 Linux
系统中,主机名大多保存在/etc/hostname 文件中,接下来将/etc/hostname 文件的内容修改为
“linuxprobe.com”,步骤如下。
第1步:使用 Vim 编辑器修改“/etc/hostname”主机名称文件。
第2步:把原始主机名称删除后追加“linuxprobe.com”。注意,使用 Vim 编辑器修改主机名称文件后,要在末行模式下执行:wq!命令才能保存并退出文档。
第3步:保存并退出文档,然后使用 hostname 命令检查是否修改成功。
7.3 文本编辑 -- 配置网卡信息
网卡 IP 地址配置的是否正确是两台服务器是否可以相互通信的前提。在 Linux 系统中,
一切都是文件,因此配置网络服务的工作其实就是在编辑网卡配置文件,
在 RHEL 5、RHEL 6 中,网卡配置文件的前缀为 eth,第 1 块网卡为eth0,第 2 块网卡为 eth1;以此类推。而在 RHEL 7 中,网卡配置文件的前缀则以 ifcfg 开始,加上网卡名称共同组成了网卡配置文件的名字,例如 ifcfg-eno16777736;好在除了文件名变化外也没有其他大的区别。
现在有一个名称为 ifcfg-eno16777736 的网卡设备,我们将其配置为开机自启动,并且 IP
地址、子网、网关等信息由人工指定,其步骤应该如下所示。
第1步:首先切换到/etc/sysconfig/network-scripts 目录中(存放着网卡的配置文件)。
第2步:使用 Vim 编辑器修改网卡文件 ifcfg-eno16777736,逐项写入下面的配置参数并
保存退出。由于每台设备的硬件及架构是不一样的,因此请读者使用 ifconfig 命令自行确认各
自网卡的默认名称。
设备类型:TYPE=Ethernet
地址分配模式:BOOTPROTO=static
网卡名称:NAME=eno16777736
是否启动:ONBOOT=yes
IP 地址:IPADDR=192.168.10.10
子网掩码:NETMASK=255.255.255.0
网关地址:GATEWAY=192.168.10.1
DNS 地址:DNS1=192.168.10.1
第3步:重启网络服务并测试网络是否联通。
进入到网卡配置文件所在的目录,然后编辑网卡配置文件,在其中填入下面的信息:
TYPE=Ethernet
BOOTPROTO=static
NAME=eno16777736
ONBOOT=yes
IPADDR=192.168.10.10
NETMASK=255.255.255.0
GATEWAY=192.168.10.1
DNS1=192.168.10.1
执行重启网卡设备的命令(在正常情况下不会有提示信息),然后通过 ping 命令测试网络能否
联通。由于在 Linux 系统中 ping 命令不会自动终止,因此需要手动按下 Ctrl-c 键来强行结束进程。
systemctl restart network # 重启网卡设备
7.4 配置Yum 软件仓库
Yum 软件仓库的作用是为了进一步简化 RPM 管理软件的难度以及自动分析
所需软件包及其依赖关系的技术。搭建并配置 Yum 软件仓库的大致步骤如下所示。
第1步:进入到/etc/yum.repos.d/目录中(因为该目录存放着 Yum 软件仓库的配置文件)
第2步:使用 Vim 编辑器创建一个名为 rhel7.repo 的新配置文件(文件名称可随意,但后
缀必须为.repo),逐项写入下面加粗的配置参数并保存退出(不要写后面的中文注释)。
[rhel-media] :Yum 软件仓库唯一标识符,避免与其他仓库冲突。
name=linuxprobe:Yum 软件仓库的名称描述,易于识别仓库用处。
baseurl=file:///media/cdrom:提供的方式包括 FTP(ftp://..)、HTTP(http://..)、本地
(file:///..)。 ¾
enabled=1:设置此源是否可用;1 为可用,0 为禁用。
gpgcheck=1:设置此源是否校验文件;1 为校验,0 为不校验。
gpgkey=file:///media/cdrom/RPM-GPG-KEY-redhat-release:若上面参数开启校
验,那么请指定公钥文件地址。
第3步:按配置参数的路径挂载光盘,并把光盘挂载信息写入到/etc/fstab 文件中。
第4步:使用“yum install httpd -y”命令检查 Yum 软件仓库是否已经可用。进入/etc/yum.repos.d 目录中后创建 Yum 配置文件:
cd /etc/yum.repos.d/
vim rhel7.repo
# 加入一下行
[rhel7]
name=rhel7
baseurl=file:///media/cdrom
enabled=1
gpgcheck=0
创建挂载点后进行挂载操作,并设置成开机自动挂载。尝试使用 Yum 软件仓库来安装 Web 服务,出现 Complete!则代表配置正确:
mkdir -p /media/cdrom
mount /dev/cdrom /media/cdrom

浙公网安备 33010602011771号