image.png
Shell(终端或壳):人与内核(硬件)之间的翻译官,用户把一些命令“告诉”终端,它就会调用相应的程序服务去完成某些工作。现在包括[红帽]系统在内的许多主流Linux系统默认使用的终端是Bash(Bourne-Again SHell)解释器。
Linux系统使用了非同步的磁盘/内存数据传输模式, 同时又是个多用户多任务的环境, 所以不能随便的不正常关机,可能会造成磁盘数据的损毁、文件系统混乱。

Linux命令结构

命令名称 [命令参数] [命令对象]
PS:命令名称、命令参数、命令对象之间用空格分隔

  • 命令对象一般是指要处理的文件、目录、用户等资源
  • 命令参数可以用长格式(完整的选项名称),也可以用短格式(单个字母的缩写),两者分别用--与-作为前缀 例:--help -h

Linux必知必会的命令

man
快捷键
    1、空格键      #向下翻一页
    
    2、PaGe down       #向下翻一页
    
    3、PaGe up    #向上翻一页
    
    4、home    #直接前往首页

    5、end    #直接前往尾页

    6、/        #从上至下搜索某个关键词,如“/linux”

    7、?        #从下至上搜索某个关键词,如“?linux”
    
    8、n        #定位到下一个搜索到的关键词

    9、N        #定位到上一个搜索到的关键词
    
    10、q    #退出帮助文档
    
2、帮助信息
    1、NAME    命令的名称
    2、SYNOPSIS    参数的大致使用方法
    3、DESCRIPTION    介绍说明
    4、EXAMPLES    演示(附带简单说明)
    5、OVERVIEW    概述
    6、DEFAULTS    默认的功能
    7、OPTIONS    具体的可用选项(带介绍)
    8、ENVIRONMENT    环境变量
    9、FILES    用到的文件
    10、SEE ALSO    相关的资料
    11、HISTORY    维护历史与联系方式
echo

*结构:echo [字符串 | $变量]

1、echo "helloWorld"

2、echo $PATH
date

*结构:date [选项] [+指定的格式]
*场景:日志、备份数据等

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键)

1、date

2、date "+%Y-%m-%d %H:%M:%S"
wget

*结构:wget [参数] 下载地址

wget命令的参数以及作用

    -b    后台下载模式
    -P    下载到指定目录
    -t    最大尝试次数
    -c    断点续传
    -p    下载页面内所有资源,包括图片、视频等
    -r    递归下载

1、wget命令递归下载网站内的所有页面数据以及文件
       wget -r -p http://www.baicu.com
ps

*结构:ps [参数]
*场景:搭配管道符,用来抓取与某个指定服务进程相对应的PID号码

ps命令的参数以及作用
    -a    显示所有进程(包括其他用户的进程)
    -u    用户以及其他详细信息
    -x    显示没有控制终端的进程

Linux系统中,5种常见的进程状态:
**R(运行):进程正在运行或在运行队列中等待。

**S(中断):进程处于休眠中,当某个条件形成后或者接收到信号时,则脱离该状态。

**D(不可中断):进程不响应系统异步信号,即便用kill命令也不能将其中断。

**Z(僵死):进程已经终止,但进程描述符依然存在, 直到父进程调用wait4()系统函数后将进程释放。

**T(停止):进程收到停止信号后停止运行。

image.png

top

*结构:top
*场景:动态地监视进程活动与系统负载等信息,顶配版Windows任务管理器
image.png

第1行:系统时间、运行时间、登录终端数、系统负载(三个数值分别为1分钟、5分钟、15分钟内的平均值,数值越小负载越低)。

第2行:进程总数、运行中的进程数、睡眠中的进程数、停止的进程数、僵死的进程数。

第3行:用户占用资源百分比、系统内核占用资源百分比、改变过优先级的进程资源百分比、空闲的资源百分比等。其中数据均为CPU数据并以百分比格式显示,例如“88.2 id”意味着有88.2%的CPU处理器资源处于空闲。

第4行:物理内存总量、内存空闲量、内存使用量、作为内核缓存的内存量。

第5行:虚拟内存总量、虚拟内存空闲量、虚拟内存使用量、已被提前加载的内存量。
pidof

*结构:pidof [参数] [服务名称]
*场景:查询某个指定服务进程的PID值

1、pidof sshd
kill

*结构:kill [参数] [进程PID]
*场景:终止某个指定PID的服务进程

1、kill 123  
killall

*结构:killall [参数] [服务名称]
*场景:终止某个指定名称的服务所对应的全部进程

1、pidof httpd    killall httpd   #终止所有httpd服务的进程 
ifconfig

*结构:ifconfig [网络设备] [参数]
*场景:查看本机当前的网卡配置与网络状态,主要查看:网卡名称、inet参数后面的IP地址、ether参数后面的网卡物理地址(又称为MAC地址),以及RX、TX的接收数据包与发送数据包的个数及累计流量
image.png

uname

*结构:uname [-a]
*场景:查看系统内核与系统版本等信息

1、uname -a

2、cat /etc/redhat-release   #系统详细详细
uptime

*结构:uptime
*场景:查看系统负载信息,显示当前系统时间、系统已运行时间、启用终端数量以及平均负载值等信息。平均负载值指的是系统在最近1分钟、5分钟、15分钟内的压力情况;负载值越低越好,尽量不要长期超过1,在生产环境中不要超过5。
image.png

free

*结构:free [-h]
*场景:查看当前系统中内存的使用量信息
image.png

who

*结构:who [参数]
*场景:查看当前登入主机的用户终端信息

last

*结构:last [参数]
*场景:查看所有系统的登录记录

history

*结构:history [-c]
*场景:查看显示历史执行过的命令

历史命令会被保存到用户家目录中的.bash_history文件中
1、ctrl+r   #搜索命令

2、!12   #执行第12个命令

3、!!   #执行上一个命令

4、history -c  #清空当前用户在本机上执行的Linux命令历史记录信息
find

*结构:find [查找路径] 寻找条件 操作
*场景:按照指定条件来查找文件

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 …… {}\;    后面可跟用于进一步处理搜索结果的命令
    

1、find /etc/ -name "host*" -print   #获取host开头的文件

2、find / -perm -4000 -print   #在整个系统中搜索权限中包括SUID权限的所有文件

3、find / -user www -exec cp -a {} /root/findresults/ \;    #找出所有归属于www用户的文件并复制到/root/findresults目录
PS:“-exec {}   \;”参数,其中的{}表示find命令搜索出的每一个文件,并且命令的结尾必须是“\;”
    
grep

*结构:grep [选项] [文件]
*场景:在文本中执行关键词搜索

grep命令的参数及其作用
    -b    将可执行文件(binary)当作文本文件(text)来搜索
    -c    仅显示找到的行数
    -i    忽略大小写
    -n    显示行号
    -v    反向选择——仅列出没有“关键词”的行。
    
1、grep /sbin/nologin /etc/passwd      #查找出当前系统中不允许登录系统的所有用户信息  
tar

*结构:tar [选项] [文件]
*场景:对文件进行打包压缩或解压

tar命令的参数及其作用
    -c    创建压缩文件
    -x    解开压缩文件
    -t    查看压缩包内有哪些文件
    -z    用Gzip压缩或解压
    -j    用bzip2压缩或解压
    -v    显示压缩或解压的过程
    -f    目标文件名(必须放到参数最后)
    -p    保留原始的权限与属性
    -P    使用绝对路径来压缩
    -C    指定解压到的目录
    
1、tar -czvf 压缩包名称.tar.gz 要打包的目录
2、tar -xzvf 压缩包名称.tar.gz 解压的目录
file

*结构:file 文件名
*场景:查看文件的类型

1、file test.txt
dd

*结构:dd [参数]
*场景:按照指定大小和个数的数据块来复制文件或转换文件

/dev/zero设备文件,这个文件不会占用系统存储空间,但却可以提供无穷无尽的数据

dd命令的参数及其作用
    if    输入的文件名称
    of    输出的文件名称
    bs    设置每个“块”的大小
    count    设置要复制“块”的个数
    
 1、dd if=/dev/zero of=560_file count=1 bs=560M   #取出一个大小为560MB的数据块,然后保存成名为560_file的文件
 
 2、 dd if=/dev/cdrom of=RHEl-server-7.com.iso   #把光驱设备中的光盘制作成iso格式的镜像文件
rm

*结构:rm [选项] 文件
*场景:删除文件或目录

rm -rf 123
mv

*结构:mv [选项] 源文件 [目标路径|目标文件名]
*场景:剪切文件或将文件重命名

mv 123 123
cp

*结构:cp [选项] 源文件 目标文件
*场景:复制文件或目录

cp命令的参数及其作用
    -p    保留原始文件的属性
    -d    若对象为“链接文件”,则保留该“链接文件”的属性
    -r    递归持续复制(用于目录)
    -i    若目标文件存在则询问是否覆盖
    -a    相当于-pdr(p、d、r为上述参数)
    
Linux系统中,复制操作具体分为3种情况:

> 如果目标文件是目录,则会把源文件复制到该目录中;
> 如果目标文件也是普通文件,则会询问是否要覆盖它;
> 如果目标文件不存在,则执行正常的复制操作。   
1、cp 123 456    
mkdir

*结构:mkdir [选项] 目录
*场景:创建空白的目录

mkdir -p 123
touch

*结构:touch [选项] [文件]
*场景:创建空白文件或设置文件的时间

touch命令的参数及其作用
    -a    仅修改“读取时间”(atime)
    -m    仅修改“修改时间”(mtime)
    -d    同时修改atime与mtime
    
1、touch 123
diff

*结构:diff [参数] 文件
*场景:比较多个文本文件的差异

  
1、diff -c 123 345
cut

*结构:cut [参数] 文本
*场景:按“列”提取文本字符

1、cut -d: -f1 /etc/passed   #提取出passwd文件中的用户名信息,即提取以冒号(:)为间隔符号的第一列内容
stat

*结构:stat 文件名称
*场景:查看文件的具体存储信息和时间等信息

1、stat 123
wc

*结构:wc [参数] 文本
*场景:统计指定文本的行数、字数、字节数

wc的参数以及作用
    -l    只显示行数
    -w    只显示单词数
    -c    只显示字节数
    
1、wc -l /etc/passwd
tr

*结构:tr [原始字符] [目标字符]
*场景:替换文本文件中的字符

1、cat 123 | tr [a-z][A-Z]    #把某个文本内容中的英文全部替换为大写
tail

*结构:tail [选项] [文件]
*场景:查看纯文本文档的后N行或持续刷新内容

1、tail -f 123.log
head

*结构:head [选项] [文件]
*场景:查看纯文本文档的前N行

1、head -n 20 123.log
more

*结构:more [选项]文件
*场景:查看纯文本文件(内容较多的);空格键或回车键向下翻页

1、more 123.log
cat

*结构:cat [选项] [文件]
*场景:查看纯文本文件(内容较少的)

1、cat -n 123.log  #显示行号
ls

*结构:ls [选项] [文件]
*场景:显示目录中的文件信息

1、ls -al  #显示所有文件的详细信息
cd

*结构:cd [目录名称]
*场景:切换工作路径

1、cd /etc/123
pwd

*结构:pwd [选项]
*场景:切换工作路径

1、pwd
sosreport

*结构:sosreport
*场景:收集系统配置及架构信息并输出诊断文档

1、sosreport
sed

*结构:sed:字符流编辑=====每次修改一行数据,擅长“行”操作
*场景:
*功能【增、删、改、查】:擅长行操作+修改文件内容
*原理:将行内容读取到内存中处理,不是直接操作文件,源文件还是放在硬盘的block里,更新的内容可以利用参数刷新到磁盘中

1、sed -i "s#123#112#g"  #123替换为112
awk

*结构:awk
*场景:字符流编辑=====每次修改一列数据,擅长“列”操作

1、sed -i "s#123#112#g"  #123替换为112
tree

*结构:tree 目录
*场景:查看目录结构

1、tree /   #查看根目录结构
xargs

*结构:xargs
*场景:给命令传递参数的一个过滤器,可以将管道或标准输入(stdin)数据转换成命令行参数,也能够从文件的输出中读取数据;可以将单行或多行文本输入转换为其他格式,例如多行变单行,单行变多行。

1、find /sbin -perm +700 |xargs ls -l 
输入输出重定向

标准输入重定向(STDIN,文件描述符为0):默认从键盘输入,也可从其他文件或命令中输入。

标准输出重定向(STDOUT,文件描述符为1):默认输出到屏幕。

错误输出重定向(STDERR,文件描述符为2):默认输出到屏幕。

输入重定向中用到的符号及其作用
    命令 < 文件    将文件作为命令的标准输入
    命令 << 分界符    从标准输入中读入,直到遇见分界符才停止
    命令 < 文件1 > 文件2    将文件1作为命令的标准输入并将标准输出到文件2
    
输出重定向中用到的符号及其作用
    命令 > 文件    将标准输出重定向到一个文件中(清空原有文件的数据)
    命令 2> 文件    将错误输出重定向到一个文件中(清空原有文件的数据)
    命令 >> 文件    将标准输出重定向到一个文件中(追加到原有内容的后面)
    命令 2>> 文件    将错误输出重定向到一个文件中(追加到原有内容的后面)
    命令 >> 文件 2>&1 
或
    命令 &>> 文件    将标准输出与错误输出共同写入到文件中(追加到原有内容的后面)
    
PS:重定向中的标准输出模式,可以省略文件描述符1不写,而错误输出模式的文件描述符2必须写


实例:
    ls -l xxxx 2> error.txt    #输出错误消息到文件
转义字符

反斜杠(\):使反斜杠后面的一个变量变为单纯的字符串。

单引号(''):转义其中所有的变量为单纯的字符串。

双引号(""):保留其中的变量属性,不进行转义处理。

反引号(``):把其中的命令执行后返回结果。

1、echo "hello $variable"   #输出结果为hello demo

2、echo 'hello \$varibale' #输出结果为$varibale
环境变量

PS:linux中变量一般大写,约定大于配置的思路

linux命令执行步骤:
    1、判断用户是否以绝对路径或相对路径的方式输入命令(如/bin/ls),如果是的话则直接执行
    2、检查用户输入的命令是否为“别名命令”,格式为“alias 别名=命令”
    3、Bash解释器判断用户输入的是内部命令还是外部命令。内部命令是解释器内部的指令,会被直接执行;而用户在绝大部分时间输入的是外部命令,这些命令交由步骤4继续处理。可以使用“type命令名称”来判断用户输入的命令是内部命令还是外部命令。
    4、系统在多个路径中查找用户输入的命令文件,而定义这些路径的变量叫作PATH,作用是告诉Bash解释器待执行的命令可能存放的位置,然后Bash解释器就会乖乖地在这些位置中逐个查找。PATH是由多个路径值组成的变量,每个路径值之间用冒号间隔,对这些路径的增加和删除操作将影响到Bash解释器对Linux命令的查找
    
PS:为什么不能将当前目录(.)添加到PATH中? ” 
原因:可以将当前目录(.)添加到PATH变量中,从而在某些情况下可以让用户免去输入命令所在路径的麻烦。但是,如果黑客在比较常用的公共目录/tmp中存放了一个与ls或cd命令同名的木马文件,而用户又恰巧在公共目录中执行了这些命令,那么就极有可能中招
 Linux系统中最重要的10个环境变量
    HOME    用户的主目录(即家目录)
    SHELL    用户在使用的Shell解释器名称
    HISTSIZE    输出的历史命令记录条数
    HISTFILESIZE    保存的历史命令记录条数
    MAIL    邮件保存路径
    LANG    系统语言、语系名称
    RANDOM    生成一个随机数字
    PS1    Bash解释器的提示符
    PATH    定义解释器搜索用户执行命令的路径
    EDITOR    用户默认的文本编辑器 
    
    
 1、export TESTCOMMAND   #提升变量的作用域为全局变量,保证所有用户都可以看到,因为linux是多用户,多任务的OS系统,所以每个用户都是一个独立的存在,具有隔离性 
Linux 系统启动过程

image.png

*   内核的引导:
        当计算机打开电源后,首先是BIOS开机自检,按照BIOS中设置的启动设备(通常是硬盘)来启动。操作系统接管硬件以后,首先读入 /boot 目录下的内核文件。
*   运行 init:
        init 进程是系统所有进程的起点,你可以把它比拟成系统所有进程的老祖宗,没有这个进程,系统中任何进程都不会启动。init 程序首先是需要读取配置文件 /etc/inittab。
        许多程序需要开机启动。它们在Windows叫做"服务"(service),在Linux就叫做"守护进程"(daemon)。
init进程的一大任务,就是去运行这些开机启动的程序。但是,不同的场合需要启动不同的程序,比如用作服务器时,需要启动Apache,用作桌面就不需要。Linux允许为不同的场合,分配不同的开机启动程序,这就叫做"运行级别"(runlevel)。也就是说,启动时根据"运行级别",确定要运行哪些程序。

Linux系统有7个运行级别(runlevel):
*   运行级别0:系统停机状态,系统默认运行级别不能设为0,否则不能正常启动
*   运行级别1:单用户工作状态,root权限,用于系统维护,禁止远程登陆
*   运行级别2:多用户状态(没有NFS)
*   运行级别3:完全的多用户状态(有NFS),登陆后进入控制台命令行模式
*   运行级别4:系统未使用,保留
*   运行级别5:X11控制台,登陆后进入图形GUI模式
*   运行级别6:系统正常关闭并重启,默认运行级别不能设为6,否则不能正常启动

*   系统初始化:
        在init的配置文件中有这么一行: si::sysinit:/etc/rc.d/rc.sysinit 它调用执行了/etc/rc.d/rc.sysinit,而rc.sysinit是一个bash shell的脚本,它主要是完成一些系统初始化的工作,rc.sysinit是每一个运行级别都要首先运行的重要脚本。它主要完成的工作有:激活交换分区,检查磁盘,加载硬件模块以及其它一些需要优先执行任务。
        这一行表示以5为参数运行/etc/rc.d/rc,/etc/rc.d/rc是一个Shell脚本,它接受5作为参数,去执行/etc/rc.d/rc5.d/目录下的所有的rc启动脚本,/etc/rc.d/rc5.d/目录中的这些启动脚本实际上都是一些连接文件,而不是真正的rc启动脚本,真正的rc启动脚本实际上都是放在/etc/rc.d/init.d/目录下。
而这些rc启动脚本有着类似的用法,它们一般能接受start、stop、restart、status等参数。
/etc/rc.d/rc5.d/中的rc启动脚本通常是K或S开头的连接文件,对于以 S 开头的启动脚本,将以start参数来运行。而如果发现存在相应的脚本也存在K打头的连接,而且已经处于运行态了(以/var/lock/subsys/下的文件作为标志),则将首先以stop为参数停止这些已经启动了的守护进程,然后再重新运行。这样做是为了保证是当init改变运行级别时,所有相关的守护进程都将重启。至于在每个运行级中将运行哪些守护进程,用户可以通过chkconfig或setup中的"System Services"来自行设定。
*   建立终端:
        rc执行完毕后,返回init。这时基本系统环境已经设置好了,各种守护进程也已经启动了。init接下来会打开6个终端,以便用户登录系统。在inittab中的以下6行就是定义了6个终端:
        
1:2345:respawn:/sbin/mingetty tty1 
2:2345:respawn:/sbin/mingetty tty2 
3:2345:respawn:/sbin/mingetty tty3 
4:2345:respawn:/sbin/mingetty tty4 
5:2345:respawn:/sbin/mingetty tty5 
6:2345:respawn:/sbin/mingetty tty6
在2、3、4、5的运行级别中都将以respawn方式运行mingetty程序,mingetty程序能打开终端、设置模式。同时它会显示一个文本登录界面,这个界面就是我们经常看到的登录界面,在这个登录界面中会提示用户输入用户名,而用户输入的用户将作为参数传给login程序来验证用户的身份。
*   用户登录系统
       
*   (1)命令行登录
*   (2)ssh登录
*   (3)图形界面登录

init程序的类型:

*   **SysV:** init, CentOS 5之前, 配置文件: /etc/inittab。
*   **Upstart:** init,CentOS 6, 配置文件: /etc/inittab, /etc/init/*.conf。
*   **Systemd:** systemd, CentOS 7,配置文件: /usr/lib/systemd/system、 /etc/systemd/system。
Linux 关机

正确的关机流程为:sync > shutdown > reboot > halt
不管是重启系统还是关闭系统,首先要运行 sync 命令,把内存中的数据写到磁盘中

Linux图形模式与文字模式的切换方式
Linux预设提供了六个命令窗口终端机让我们来登录。

默认我们登录的就是第一个窗口,也就是tty1,这个六个窗口分别为tty1,tty2 … tty6,你可以按下Ctrl + Alt + F1 ~ F6 来切换它们。

如果你安装了图形界面,默认情况下是进入图形界面的,此时你就可以按Ctrl + Alt + F1 ~ F6来进入其中一个命令窗口界面。

当你进入命令窗口界面后再返回图形界面只要按下Ctrl + Alt + F7 就回来了。

如果你用的vmware 虚拟机,命令窗口切换的快捷键为 Alt + Space + F1~F6. 如果你在图形界面下请按Alt + Shift + Ctrl + F1~F6 切换至命令窗口。
系统启动流程
centos6:
    1、加电BIOS自检——检测硬件是否正常
    2、MBR引导——读取磁盘MBR的信息,引导系统启动
    3、grup菜单——选择启动的内核/进行重置密码等
    4、加载系统内核信息——使用内核控制硬件
    5、系统第一个进程运行起来init——控制其它进程(串行控制)
    6、加载系统运行级别/etc/inittab
    7、初始化脚本运行——初始化系统
    8、运行特殊的脚本——服务运行脚本
    9、运行mingett进程——显示登陆界面
    
 centos7  
    1、加电BIOS自检——检测硬件是否正常
    2、MBR引导——读取磁盘MBR的信息,引导系统启动
    3、grup菜单——选择启动的内核/进行重置密码等
    4、加载系统内核信息——使用内核控制硬件
    5、系统第一个进程启动systemmd(并行启动其它进程)
    6、读取加载target文件
        /etc/systemd/system/default.target
    7、读取系统初始化文件
        /usr/lib/systemd/system/sysinit.target
    8、加载/etc/systemd/system 实现服务开机自启

撸猫鼠
10 声望1 粉丝

下一篇 »
Shell脚本