高级Linux运维工程师养成记-深入理解Linux命令

1991年8月25日,Linux操作系统诞生

历史上的今天 在29年前的今天,1991年8月25日(农历1991年7月16日),Linux操作系统诞生。 Linux操作系统的诞生、发展和成长过程始终依赖着五个重要支柱:UNIX 操作系统、MINIX 操作系统、GNU 计划、POSIX 标准和Internet 网络。 1981年IBM公司推出微型计算机IB

深入理解Linux命令

命令提示符

当使用账号登录Linux后,终端上会显示指定格式的命令提示符

CentOS8.2的命令提示符

[root@centos8 ~]# 

CentOS7.8的命令提示符

[root@centos7 ~]# 

Ubuntu Server20.04的命令提示符

guanglei@ubuntu-server:~$ 

命令提示符显示的格式由环境变量PS1决定的,使用echo $PS1查看命令提示符的默认配置

guanglei@ubuntu-server:~$ echo $PS1\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\u@\h:\w\$
[root@centos7 ~]# echo $PS1[\u@\h \W]\$
[root@centos8 ~]# echo $PS1[\u@\h \W]\$

CentOS系列(CentOS7.8,CentOS8.2)命令提示符的含义说明
\u 表示当前登录的账号,例如管理员登录时账号就是root
\h 表示当前登录的主机名,例如centos8.2登录时主机名就是centos8,不同的操作系统版本设置成了不同的主机名,用于区分系统版本
\W表示当前用户所在的目录,~表示当前用户的家目录,如果切换目录,则会替换成切换后的目录
$表示当前用户登录的账号类型,其中# 表示当前登录的用户是root用户,如果是普通用户登录,显示的是$

命令提示符的格式由PS1变量决定,我们可以修改PS1变量的值,从而来修改命令提示符的格式

CentOS8.2 自定义命令提示符

[root@centos8 ~]# PS1="\[\e[1;5;41;33m\][\u@\h \W]\\$\[\e[0m\]"

CentOS8.2命令提示符格式

命令提示符格式的说明

  • 31-37表示字体颜色
  • 41-47 表示背景颜色
  • 1 表示高亮
  • 5表示闪烁
  • \e 控制符\033
  • \u 当前用户
  • \h 主机名简称
  • \H 主机名
  • \w 当前工作目录
  • \W 当前工作目录基名
  • \t 24小时时间格式
  • \T 12小时时间格式
  • ! 命令历史数
  • 开机后命令历史数

CentOS7.8自定义命令提示符

[root@centos7 ~]# PS1="\[\e[1;32m\][\[\e[0m\]\t \[\e[1;33m\]\u\[\e[36m\]@\h\[\e[1;31m\] \W\[\e[1;32m\]]\[\e[0m\]\\$"

CentOS7.8自定义命令提示符

不过这种方式只会临时生效,一旦重新登录则恢复默认的命令提示符。我们可以使用echo结合重定向来将命令提示符的格式写入文件,让其永久生效。

[root@centos8 ~]# echo 'PS1="\[\e[1;32m\][\[\e[0m\]\t \[\e[1;33m\]\u\[\e[36m\]@\h\[\e[1;31m\] \W\[\e[1;32m\]]\[\e[0m\]\\$"' > /etc/profile.d/env.sh

自定义命令提示符

如果不想使用,则使用rm -rf删除该文件即可

[06:41:19 root@centos8 ~]#rm -rf /etc/profile.d/env.sh 

回到默认的命令提示符

企业运维场景通常会区分测试环境和生产环境,可以给不同的环境设置不同的命令提示符来避免误操作

Linux命令分类

在日常运维时需要使用Linux提供的大量命令,这些命令可以分为别名、内部命令,外部命令三种。
别名可以看做是某条命令的缩写,如果某条命令太长,就可以使用别名来命名,执行别名等价于执行命令。

内部命令是Shell自带的,例如pwd,cd,echo都是内部命令,内部命令在系统启动后由Shell加载到内存中。而外部命令是位于PATH变量定义的路径中,一般是对应某个磁盘路径的可执行程序。

tpye命令能够区分执行的命令是别名,内部命令,还是外部命令。

ls 用于查看文件,默认使用的是别名,即默认添加添加了长选项–color=auto

[root@centos8 ~]# type lsls is aliased to `ls --color=auto'

如果想要自己创建别名,可以使用alias 变量名=变量值 的形式创建。

在创建别名时,别名的名称切勿和系统的命令冲突

例如需要切换到/etc/sysconfig/network-scripts目录,使用cd 加上目录名,由于该目录名称太长,这里就可以创建一个cdnet的别名

[root@centos8 ~]# alias cdnet='cd /etc/sysconfig/network-scripts'

然后只要输入cdnet就可以直接切换到/etc/sysconfig/network-scripts目录了,pwd命令是用于查看当前用户所在的目录,因为命令提示符只会显示最后一级目录。

[root@centos8 ~]# cdnet[root@centos8 network-scripts]# pwd/etc/sysconfig/network-scripts

不过这种创建别名的方式只是临时的,因为别名的配置只是存在了内存中,没有写入配置文件,当重新登录系统后就无法使用,执行别名时bash shell会提示找不到命令。

如果想要永久使用,可以将别名的配置保存到家目录的.bashrc文件文件中,
修改文件可以使用nano .bashrc命令,

[root@centos8 ~]# nano .bashrc

其中nano是文本编辑器,类似于Windows的记事本,使用nano打开文件后,直接编辑别名,然后按Ctrl+x退出,然后按y保存修改,最后回车即可,

增加别名

修改后可以使用cat .bashrc查看修改后的结果

[root@centos8 ~]# cat .bashrc # .bashrc# User specific aliases and functionsalias rm='rm -i'alias cp='cp -i'alias mv='mv -i'alias cdnet='cd /etc/sysconfig/network-scripts'# Source global definitionsif [ -f /etc/bashrc ]; then	. /etc/bashrcfi

修改.bashrc文件后不会立即生效,如果让配置的别名生效,可以使用source .bashrc命令或者是. bashrc命令来让cdnet别名生效,只有生效后才能使用别名。

[root@centos8 ~]# cdnetbash: cdnet: command not found...[root@centos8 ~]# source .bashrc[root@centos8 ~]# cdnet[root@centos8 network-scripts]# pwd/etc/sysconfig/network-scripts

cd,pwd,echo等等都是shell内置的命令,也被称作内部命令

[root@centos8 ~]# type cdcd is a shell builtin[root@centos8 ~]# type pwdpwd is a shell builtin[root@centos8 ~]# type echoecho is a shell builtin

enable命令可以查看所有的命令

[root@centos8 network-scripts]# enable

enable还可以启用、禁用内部命令,其中禁用内部命令是enable -n command,启用内部命令是enable command

禁用内部命令echo

[root@centos8 ~]# enable -n echo[root@centos8 ~]# type echoecho is /usr/bin/echo

启用内部命令echo

[root@centos8 ~]# enable echo[root@centos8 ~]# type echoecho is a shell builtin

有些别名、内部命令会和外部命令重名,例如echo命令既是内部命令,又是外部命令,ls即是别名,也是外部命令,优先执行别名。

[root@centos8 ~]# type -a echoecho is a shell builtinecho is /usr/bin/echo

当执行echo的时候优先执行的是内部命令,如果想要执行外部命令,可以在外部命令的左边加上\或者使用”包含。

[root@centos8 ~]# 'echo' $PATH/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

ls默认是使用的别名,在查看文件时会给文件增加颜色,而如果想要执行外部命令ls,则可以使用\ls

[root@centos8 ~]# ls /etc[root@centos8 ~]# \ls /etc

而cat,hostname等等就是外部命令,使用type查看外部命令会输出该命令的完整路径
例如cat和hostname都是位于/usr/bin路径下的可执行程序

[root@centos8 ~]# type catcat is /usr/bin/cat[root@centos8 ~]# type hostnamehostname is /usr/bin/hostname

除了type查看路径以外,还可以使用whereis命令查看,该命令除了显示外部命令的路径以外,还会显示命令对应的帮助文档的路径。

[root@centos8 ~]# whereis lsls: /usr/bin/ls /usr/share/man/man1/ls.1.gz /usr/share/man/man1p/ls.1p.gz

在执行外部命令时,每次都要从PATH环境变量中查找对应的可执行程序,这个过程相对而言比较耗时,为了提高执行效率,Linux在执行外部命令时将其缓存起来,使用hash命令可以查看缓存的外部命令,其中hits表示缓存执行的次数,也就是说当执行外部命令时首先会从缓存中查找,如果找不到再到PATH路径下查找。

[root@centos8 ~]# hashhits	command   3	/usr/bin/nano   1	/usr/bin/cat   1	/usr/bin/whereis   5	/usr/bin/ls   7	/usr/bin/clear

如果缓存的命令的执行路径发生了变化,可以使用hash -d command 删除缓存

[root@centos8 ~]# hashhits	command   3	/usr/bin/nano   1	/usr/bin/cat   1	/usr/bin/whereis   5	/usr/bin/ls   7	/usr/bin/clear[root@centos8 ~]# hash -d nano[root@centos8 ~]# hashhits	command   1	/usr/bin/cat   1	/usr/bin/whereis   5	/usr/bin/ls   7	/usr/bin/clear

清空缓存可以使用hash -r命令实现。

Linux命令的执行过程

当运维人员在终端上输入命令并回车后,后台运行的shell程序会查找该命令所对应的可执行程序或者代码,并分析后提交给内核分配资源将其运行起来。

首先Shell会判断用户输入的是别名、内部命令还是外部命令,它们的执行顺序依次是别名、内部命令,外部命令,如果是外部命令,首先从缓存中查找命令的路径,如果缓存中没有找到,则从PATH中查找,如果别名,内部命令,缓存和外部命令都找不到,则会提示command not found。

Linux命令格式

Linux命令由命令[选项][参数]三部分组成,其中命令的选项和参数都是可选的

  • 命令是别名、外部命令或者内部命令
  • 选项用于启用或者关闭命令的某个或者某些功能,选项有短选项和长选项两种,其中短选项由 -和字符组成,例如 ls -l,id -u,短选项称为Unix风格,长选项由–和单词组成,例如ls –help,长选项相对于短选项更加直观的表达作用,长选项称为GNU风格。还有一种BSD风格的短选项,即不带-,命令后面直接跟字母,例如ps a

并不是每种命令都支持这三种风格,BSD风格使用相对较少,而Unix风格和GNU风格基本都支持。

  • 参数是命令作用的对象,例如文件名、用户名等等,例如hostname ittimeline.net ,ittimeline.net就是修改的主机名

需要注意的是:

  • 命令的多个选项以及参数和命令之间使用空白字符分隔 例如 ls -a -l
  • 命令的多个短选项可以合并使用,例如ls -al
  • 多个命令可以使用;符号隔开
  • 一个命令可以使用\分成多行,命令太长时使用,例如编译Nginx

不带选项和参数的命令用例

[root@centos8 ~]# lsanaconda-ks.cfg  initial-setup-ks.cfg  test.txt

带选项的命令用例

ls -a 用于显示以.开头的隐藏文件

[root@centos8 ~]# ls -a.                .bash_history  .bashrc  .cshrc     initial-setup-ks.cfg..               .bash_logout   .cache   .dbus      .tcshrcanaconda-ks.cfg  .bash_profile  .config  .esd_auth  .Xauthority

带多个选项的命令用例

ls -al 显示所有文件的完整信息

[root@centos8 ~]# ls -altotal 40dr-xr-x---.  5 root root  241 Aug 26 11:32 .dr-xr-xr-x. 18 root root  236 Aug 24 07:59 ..-rw-------.  1 root root 1591 Aug 24 08:08 anaconda-ks.cfg-rw-------.  1 root root 1467 Aug 26 11:32 .bash_history-rw-r--r--.  1 root root   18 May 11  2019 .bash_logout-rw-r--r--.  1 root root  176 May 11  2019 .bash_profile-rw-r--r--.  1 root root  224 Aug 26 11:40 .bashrcdrwx------.  3 root root   19 Aug 24 22:33 .cachedrwx------.  4 root root   31 Aug 25 16:51 .config-rw-r--r--.  1 root root  100 May 11  2019 .cshrcdrwx------.  3 root root   25 Aug 24 22:33 .dbus-rw-------.  1 root root   16 Aug 25 16:51 .esd_auth-rw-r--r--.  1 root root 1701 Aug 24 22:36 initial-setup-ks.cfg-rw-r--r--.  1 root root  129 May 11  2019 .tcshrc-rw-------.  1 root root  340 Aug 26 11:32 .Xauthority

带长选项的命令用例

ls –help 显示命令的帮助信息

[root@centos8 ~]# ls --help

带选项和参数的命令用例

ls -l initial-setup-ks.cfg 查看指定文件的完整信息

[root@centos8 ~]# ls -l initial-setup-ks.cfg -rw-r--r--. 1 root root 1701 Aug 24 22:36 initial-setup-ks.cfg

带选项和参数的命令用例

[root@centos8 ~]# id -u guanglei1000

一行执行多个命令用例

[root@centos8 ~]# hostname;uname -r;whocentos8.ittimeline.net4.18.0-193.el8.x86_64root     pts/0        2020-07-27 10:18 (10.0.0.1)guanglei tty2         2020-07-27 04:50 (tty2)root     pts/1        2020-07-27 05:46 (10.0.0.1)

一条命令放在多行执行用例

[root@centos8 ~]# wh\> o\> ami\> root

短选项和长选项等价的命令示例

free –human 等价于 free -h

[root@centos8 ~]# free --human              total        used        free      shared  buff/cache   availableMem:          7.8Gi       722Mi       6.5Gi        10Mi       534Mi       6.8GiSwap:         4.0Gi          0B       4.0Gi[root@centos8 ~]# free -h              total        used        free      shared  buff/cache   availableMem:          7.8Gi       722Mi       6.5Gi        10Mi       534Mi       6.8GiSwap:         4.0Gi          0B       4.0Gi

ls -a 等价于 ls –all

[root@centos8 ~]# ls -a.                .bash_history  .bashrc  .cshrc     initial-setup-ks.cfg..               .bash_logout   .cache   .dbus      .tcshrcanaconda-ks.cfg  .bash_profile  .config  .esd_auth  .Xauthority[root@centos8 ~]# ls --all.                .bash_history  .bashrc  .cshrc     initial-setup-ks.cfg..               .bash_logout   .cache   .dbus      .tcshrcanaconda-ks.cfg  .bash_profile  .config  .esd_auth  .Xauthority

想要强行中断执行中的命令,可以使用快捷键ctrl+c,可能会丢失数据

在终端上输入yes命令,该命令就是不停的输出y,如果中断执行,使用ctrl+c

[root@centos8 ~]#  yes

而和ctrl+c作用类似的还有ctrl+d,ctrl+d可以注销登录,除此以外在执行交互式命令时,还能实现正常结束命令的执行。

在终端上输入bc命令,此时会等待用户输入数据,如果此时想要正常退出,则可以使用ctrl+d

[root@centos8 ~]# bcbc 1.07.1Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006, 2008, 2012-2017 Free Software Foundation, Inc.This is free software with ABSOLUTELY NO WARRANTY.For details type `warranty'. 

Linux命令帮助

日常运维的工作中会会使用到几百种命令,而最好记的记忆方式就是经常使用,在使用中记忆。如果记不住,那么就要学会查帮助,查帮助的能力决定了技术的能力。
Linux命令获取帮助可以通过如下几种方式进行

  1. whatis
  2. command –help 大多数命令都带了–help选项查看帮助
  3. man 命令帮助手册
  4. /usr/share/doc 命令帮助文档
  5. Red Hat document 红帽官方文档
  6. 其他软件的官方站点、文档
  7. 搜索引擎(Google,baidu)

whatis

whatis命令用于查看指定命令的简要说明,例如初学者如果不知道rm命令的作用,就可以使用whatis命令查看

[root@centos7 ~]# whatis rmrm (1)               - remove files or directoriesrm (1p)              - remove directory entries

whatis在查看命令的帮助时依赖数据库,如果没有生成数据库(例如CentOS8就没有生成),则无法使用

[root@centos8 ~]# whatis rmrm: nothing appropriate.[root@centos8 ~]# whatis lsls: nothing appropriate.

可以使用mandb命令创建数据库

[root@centos8 ~]# mandb

数据库创建成功之后再次使用whereis命令查看

[root@centos8 ~]# whatis lsls (1)               - list directory contentsls (1p)              - list directory contents

命令帮助

命令分为内部命令和外部命令,它们查看帮助的方法是不相同的,内部命令直接使用help command来查看其帮助。

查看enable命令的帮助信息

help命令会列出命令的功能以及常用选项的说明

[root@centos8 ~]# help enable

如果help命令不能满足需求,可以使用man bash 列出所有内部命令的帮助信息

man bash的内容累计3000多行

[root@centos8 ~]# man bash

外部命令可以使用–help选项获取命令的帮助信息

查看date命令的帮助信息

[root@centos8 ~]# date --help

显示完整日期和时间

[root@centos8 ~]# date '+%F %T'2020-08-01 09:30:34

修改时间为10天后的日期后还原修改的时间

[root@centos8 ~]# date -s '+10 day'Tue Aug 11 09:39:33 CST 2020[root@centos8 ~]# date -s '-10 day'Sat Aug  1 09:39:39 CST 2020

显示昨天的日期时间

[root@centos8 ~]# date -d yesterdayFri Jul 31 09:32:42 CST 2020

显示明天的日期

[root@centos8 ~]# date -d tomorrowSun Aug  2 09:33:10 CST 2020

显示10天后的日期

[root@centos8 ~]# date -d '10 day'Tue Aug 11 09:34:35 CST 2020

man命令

man命令概述

当使用whereis查看命令可执行程序的路径时,如果是外部命令还会列出该命令的帮助手册,通常存放在/usr/share/man路径下
例如ls命令的帮助手册位于/usr/share/man/man1/ls.1.gz路径下

[root@centos8 ~]# whereis lsls: /usr/bin/ls /usr/share/man/man1/ls.1.gz /usr/share/man/man1p/ls.1p.gz

如果想要查看外部命令的帮助手册,可以使用man命令,而且几乎所有的命令都可以使用man查看,内部命令可以使用man bash查看,因为内部命令都内置在bash shell中。

man命令章节

而帮助手册是按照不同的章节存放的

  • man 1表示用户命令
  • man 2 表示系统调用
  • man 3 表示C库调用
  • man 4 表示设备文件以及特殊文件
  • man 5 表示配置文件格式
  • man 6 表示游戏
  • man 7表示杂项
  • man 8 表示管理类的命令
  • man 9 表示Linux内核API
[root@centos8 ~]# ls /usr/share/manca  de  hu  ja     man1   man2   man3p  man4x  man6   man7x  man9   nl         pt     sk  ukcs  es  id  ko     man1p  man2x  man3x  man5   man6x  man8   man9x  overrides  pt_BR  sv  zh_CNda  fr  it  man0p  man1x  man3   man4   man5x  man7   man8x  mann   pl         ru     tr  zh_TW

作为Linux运维工程师通常关注man1,man5,man8三个章节。C语言程序员关注man3,Linux系统人员关注man 2
在使用man命令查看帮助时,最好是指定章节,查看对应的帮助手册。因为某些命令既是外部命令,又会是配置文件
如果不指定章节的话使用man command 时默认列出的是最小的章节(即第一章)

[root@centos8 ~]# man passwd

如果想要查看passwd对应的配置文件格式,可以使用man 5 passwd查看

[root@centos8 ~]# man 5 passwd

man 5 passwd

如果不知道命令的章节,可以使用whatis passwd查看

[root@centos8 ~]# whatis passwdopenssl-passwd (1ssl) - compute password hashespasswd (1)           - update user's authentication tokenspasswd (5)           - password file

其中passwd(1)表示用户命令,用于修改用户的密码,而passwd(5)表示配置文件格式。

如果想要查看man命令的man帮助,首先使用whatis man查看对应的章节

[root@centos8 ~]# whatis manman (7)              - macros to format man pagesman (1)              - an interface to the on-line reference manualsman (1p)             - display system documentation

然后可以使用man 1 man 查看

[root@centos8 ~]# man 1 man

查看date命令的man帮助

[root@centos8 ~]# whatis datedate (1)             - print or set the system date and timedate (1p)            - write the date and time[root@centos8 ~]# man 1 date

man命令搜索

在使用man命令查看帮助时,经常会使用到搜索,如果想要搜索某个关键字,可以使用/keyword来搜索某个关键字,默认是从当前位置向文件的尾部搜索,而且不区分大小写。

当匹配到多个时,可以使用n键获取下一个匹配的关键字,使用N获取上一个匹配的关键字。

man命令快捷键

man命令的空格键是向文件的尾部翻屏,b键是向文件的首部翻屏。q表示退出帮助。

man命令常用选项

man命令提供了-a选项查看命令的所有章节帮助。

[root@centos8 ~]# man -a passwd--Man-- next: passwd(1ssl) [ view (return) | skip (Ctrl-D) | quit (Ctrl-C) ]--Man-- next: passwd(5) [ view (return) | skip (Ctrl-D) | quit (Ctrl-C) ]

man -f 可以显示命令的章节,等价于whatis

[root@centos8 ~]# man -f passwdopenssl-passwd (1ssl) - compute password hashespasswd (1)           - update user's authentication tokenspasswd (5)           - password file[root@centos8 ~]# whatis passwdopenssl-passwd (1ssl) - compute password hashespasswd (1)           - update user's authentication tokenspasswd (5)           - password file

man -w 显示命令的帮助手册路径

[root@centos8 ~]# man -w date/usr/share/man/man1/date.1.gz

man帮助的段落说明

在查看man帮助手册时,有几个段落

  • NAME 表示名称以及简要说明
  • SYNOPSIS 表示用法格式说明[] 表示可选内容<>表示必选内容a|b 二选一{} 表示分组… 表示同一个内容可以出现多次
  • DESCRIPTION 表示详细说明
  • OPTIONS 表示选项说明
  • EXAMPLES 表示示例
  • FILES 表示相关文件
  • AUTHOR 表示作者
  • COPYRIGHT 表示版本信息
  • REPORTING BUGS 表示bug信息
  • SEE ALSO 表示其他帮助参考信息

本地帮助文档

Linux系统上安装的软件自带的文档都位于/usr/share/doc目录下,其常见的文档有README,INSTALL,CHANGES等文件。

[root@centos8 ~]# ls  /usr/share/doc

通过在线文档获取帮助

如果不是Linux发行版的软件,而是额外安装的,通常可以去官网获取帮助信息
例如从Nginx官网获取帮助信息

Docker官网

除此以外还可以使用Google,Baidu等搜索引擎获取帮助。

【云技术在线】为您提供以下专业技术服务:

上云服务:上云架构设计,大流量高并发架构设计,混合云架构设计,上云迁移,云上容灾,跨国云访问加速等;

安全服务:等保咨询及实施,渗透测试,漏洞扫描,木马查杀,安全加固,应急响应,DDOS/CC防护,勒索病毒防护,安全托管等;

运维服务:Linux系统运维,数据恢复及备份,负载均衡集群搭建及维护,数据库集群搭建及维护,网站运行环境搭建及维护,系统性能调优,中间件性能调优,数据库性能调优,数据库读写分离,分库分表,性能(压力)测试,7*24小时监控及故障应急响应,故障排查,大流量高并发活动护航等。