Linux - 基础
注意:本文章只针对CentOS来讲解,其他系统如Ubuntu可能命令之间具有差异。
1. 安装
2. Linux基础命令
2.1 Linux目录结构
2.1.1 根目录
在Windows系统中,有多个盘符,比如C盘、D盘等,但是在Linux下则没有这个概念,只有一个根目录:/
,所有的文件都在它下面:
Linux的目录结构是一个树形结构,由于Windows系统中存在多个盘符,所以可以理解为多个树。
对于路径的描述方式来看:
- Linux:目录之间的层级关系使用:
/
来表示,描述层级关系时,往往以/
开头,表示根目录下的文件。 - Windows:目录之间的层级关系使用:
\
来表示,描述层级关系时,往往以盘符开头。
2.1.2 HOME目录
HOME目录,一般我们成为家目录,是每个Linux操作用户在Linux系统中的个人账户目录,路径在:/home/用户名
;
在Linux系统的命令行终端启动的时候,默认加载的就是当前登录用户的HOME目录,并且把它作为当前的工作目录:
进入方式:命令行输入cd
回车即可。
2.2 Linux命令基础
无论什么命令,用于什么用途,在Linux中,命令有其通用的格式:command [-options] [parameter]
- command:命令本身
- -options:[可选,非必填]命令的一些选项,可以通过选项控制命令的行为细节。
- parameter:[可选,非必填]命令参数,多用于命令的指向目标等
注意:语法中的
[]
表示为可选的意思。
示例:ls -l /home
:ls是命令本身,-l是选项,/home是参数;意思就是以列表的形式显示/home目录下的内容。
2.3 ls命令
ls
命令的作用是列出目录下的内容,语法细节:ls [-a -l -h] [Linux路径]
命令选项:
- -a:表示all的意思,列出全部文件(包括隐藏文件/文件夹)
- -l:以列表(竖向排列)的形式展示内容,并展示更多信息
- -h:配合-l,以更加人性化的方式显示文件大小,其实就是带上了大小的单位。
示例:
当不使用选项和参数,直接使用ls命令本体,表示:以平铺形式,列出当前工作目录下的内容
以列表的形式查看文件:ls -l
显示全部文件包括隐藏文件:ls -a
注意观察,里面有一些文件是以.
开头的,这种以点开头的文件就是隐藏文件,和Windows中的隐藏文件是一个道理。
更加人性化的显示文件大小:ls -l -h
在语法中的选项其实还是可以组合使用的,比如学习的-a
和-l
可以组合使用:ls -l -a
、ls -la
、ls -al
上述三种写法都是一样的,表示同时应用-l
和-a
的功能。
除了选项本身可以组合以外,选项和参数也是可以一起使用的:ls -la 路径
:
还有一种简写形式:ll
,等价于ls -l
:
2.4 cd&pwd命令
2.4.1 cd命令
cd命令的作用是切换当前的工作目录。
当Linux终端(命令行)打开的时候,会默认以用户的HOME
目录作为当前的工作目录,我们可以通过cd
命令来更改当前所在的工作目录。
cd命令来自英文:Change Directory
。
语法:cd [Linux路径]
- cd命令无需选项,只有参数,表示要切换到哪个目录下
- cd命令直接执行,不写参数,表示回到当前用户的HOME目录
示例:
进入home目录:
可见当前的工作目录已经切换为了home目录。
回到当前用户的home目录:
2.4.2 pwd命令
pwd命令的作用是查看当前工作目录。
pwd命令来自英文:Print Work Directory
语法:pwd
- pwd命令无需选项、无需参数,直接输入pwd即可。
2.5 相对路径和绝对路径
相对路径,非
/
开头的称之为相对路径相对路径表示以当前目录作为起点,去描述路径,如
test/a.txt
,表示当前工作目录内的test文件夹内的a.txt文件绝对路径,以
/
开头的称之为绝对路径绝对路径从根开始描述路径
2.6 特殊路径符
.
,表示当前目录,比如./a.txt
,表示当前文件夹内的a.txt
文件..
,表示上级目录,比如../
表示上级目录,../../
表示上级的上级目录~
,表示用户的HOME目录,比如cd ~
,即可切回用户HOME目录
现在我们查看一下我当前的绝对路径:
返回上层目录:
回到当前用户的HOME目录:
可见:cd ~
和cd 回车
其实效果是一样的,都是回到当前用户的HOME目录。
2.7 mkdir命令
mkdir命令的作用:创建新的目录(文件夹)
mkdir来自英文:Make Directory
语法:mkdir [-p] Linux路径
- 其中参数为必填选项,表示创建的文件夹路径,相对路径或绝对路径都可以
-p
选项可选,表示自动创建不存在的父目录,适用于创建连续多层级的目录
创建文件夹,以相对路径方式:
创建多层级的目录:
可见,如果想要创建多层级的目录,必须带上选项
-p
,这样才会自动创建不存在的父目录。
注意:
这里我使用mkdir创建test.txt是一个文件夹,并不是文件,虽然有.txt后缀,mkdir命令只能是创建文件夹(目录)。
创建文件夹需要修改权限,请确保操作均在HOME目录内,不要在HOME外操作;涉及到权限问题,HOME外无法成功,root用户除外。
后续我们会讲解权限管控的知识
2.8 文件操作命令
2.8.1 touch命令
功能:创建文件,并非文件夹,比如.txt
、.doc
等
语法:touch Linux路径
- touch命令无选项,参数必填,表示要创建的文件路径,不过路径的最后一级必须为具体的文件,相对、绝对、特殊路径符均可以使用。
使用touch命令创建文件:
文件和文件夹是如何区分的呢?
2.8.2 cat命令
功能:查看文件内容。
语法:cat Linux路径
- cat同样没有选择,只有参数,参数表示被查看的文件路径,相对、绝对、特殊路径符均可以使用。
查看文件内容:
2.8.3 more命令
功能:查看文件内容。
与cat命令的区别:
cat命令是直接将内容全部显示出来
more命令支持翻页,如果文件内容过多,可以一页一页显示。
查看的过程中,使用空格来翻页;通过q退出查看。
语法:more Linux路径
- 同样没有选项,只有必填参数,参数为被查看的文件路径,相对、绝对、特殊路径符均可以使用。
使用more命令查看文件内容:
2.8.4 cp命令
功能:用于复制文件\文件夹。
来自于英文:copy
语法:cp [-r] 参数1 参数2
- -r:用于复制文件夹使用,表示递归复制。
- 参数1:Linux路径,表示被复制的文件或文件夹。
- 参数2:Linux路径,表示要复制去的地方。
参数1和参数2都可以是相对、绝对、特殊路径符。
复制文件:
可见,我使用:cp test.text test_back.text
命令,将当前目录下的test.text文件复制到当前目录下的test_back.text
文件中,可见我之前是没有test_back.text
文件的,所以,cp命令其实还有一个隐藏的功能,重命名文件。
复制文件夹:
复制文件夹必须加上-r
选项,否则文件夹复制失败,因为文件夹里面可能还有文件夹或者文件,你必须使用递归参数-r
来递归复制。
2.8.5 mv命令
功能:移动文件\文件夹。
来自英文:move
语法:mv 参数1 参数2
- 参数1:Linux路径,表示被移动的文件或文件夹。
- 参数2:Linux路径,表示要移动去的地方,如果目录不存在则进行改名,确保目标存在
文件夹移动:
2.8.6 rm命令
功能:删除文件\文件夹
来自英文:remove
语法:rm [-r -f] 参数1 参数2 参数3 ... 参数N
-r:选项表示递归参数,用于删除文件夹,同cp命令类似
-f:选项表示
force
,强制删除(不会弹出确认提示信息)。普通用户删除内容不会弹出提示,只有root管理员用户删除内容会有提示,所以普通用户一般用不到
-f
选项参数1 参数2 参数3 … 参数N表示要删除的文件或文件夹路径,按照空格隔开。
-r
和-f
可以组合起来使用:-rf
删除文件夹,非强制删除:
强制删除文件夹:
可见加上了
-f
之后,并不会出现提示。
不使用-r
选项来删除文件夹:
可见,要想删除文件夹必须使用-r
选项,表示递归删除,原理和cp命令类似。
rm命令还支持通配符:支持通配符*
,用来做模糊匹配。
符号*
表示通配符,即匹配任意内容(包含空),示例:
test*
:表示匹配任何以test开头的内容。*test
:表示匹配任何以test结尾的内容。*test*
:表示匹配任何包含test的内容。
通配符使用:
注意:
如下命令千万不要再root用户中执行:
rm -rf /
rm -rf /*
这两者的效果等同于在Windows上执行C盘格式化。
2.9 查找命令
2.9.1 which命令
which
命令是Linux
系统中用于确定给定命令的位置的实用工具。它会搜索系统的PATH
环境变量中列出的目录,以确定命令的位置。
语法:which [选项] [命令名称]
常用选项:
-a
或--all
:显示所有匹配的命令。默认情况下,which
只会显示找到的第一个命令。-h
或--help
:显示帮助信息。-V
或--version
:显示版本信息。查找某些常用命令:
查询所有匹配的命令:
注意:
- which命令只是用来查找各个Linux命令的本体文件在哪里,并不适用于查找文件。
which
命令仅在命令在系统PATH变量定义的路径中可执行时有效。如果命令不在PATH中,或者不是可执行的,which
将无法找到它。which
命令用于定位可执行文件,而不是shell内置命令或函数。
2.9.2 find命令
功能:查找指定的文件
语法:find [起始目录] [选项] [操作]
[起始目录]
:指定开始搜索的目录,默认为当前目录。[选项]
:控制搜索行为的选项。[操作]
:指定要在搜索到的文件上执行的操作。
常用选项:
-name
:按文件名匹配。-type
:按文件类型匹配,例如f
表示普通文件,d
表示目录,l
表示符号链接等。-user
:按文件所有者匹配。-group
:按文件所属组匹配。-size
:按文件大小匹配,可以使用+
表示大于,-
表示小于,c
表示字节,k
表示千字节,M
表示兆字节等。-exec
:对搜索到的文件执行指定的命令
常用操作:
-print
:将搜索到的文件名输出到标准输出。-delete
:删除搜索到的文件。-exec
:对搜索到的文件执行指定的命令。-ls
:类似于ls -l
,输出搜索到的文件的详细信息。-amin n
:查找在 n 分钟内被访问过的文件。-atime n
:查找在 n*24 小时内被访问过的文件。-cmin n
:查找在 n 分钟内状态发生变化的文件(例如权限)。-ctime n
:查找在 n*24 小时内状态发生变化的文件(例如权限)。-mmin n
:查找在 n 分钟内被修改过的文件。-mtime n
:查找在 n*24 小时内被修改过的文件。
示例:
搜索当前目录下的所有文件:
find .
搜索指定目录下的文件名为
test
的文件:find 指定目录 -name "test"
查询指定目录下的普通文件有哪些:
find 指定目录 -type f
查询指定目录下指定所有者的文件:
find 指定目录 -user 所有者名称
查询指定目录下指定所属组的文件:
find 指定目录 -group 所有组名称
查询指定目录下指定大小的文件:
find 指定目录 -size 文件大小
查询指定目录下文件大小大于10k的文件:
删除搜索到的文件:
find 指定目录 选项 -delete
对搜索到的文件执行指定的命令:
例如:
find 指定目录 选项 -exec gzip {} \;
注意:
在使用
-exec
选项时,{}
表示搜索到的文件名,\;
表示命令结束。当使用
-exec
选项时,对于每个匹配到的文件,都会执行一次指定的命令,可能会影响性能。
其他的举例就不列举了,可自行测试。
2.10 grep命令
grep
命令是一个强大的文本搜索工具,常用于在文件中搜索指定模式的文本,并将匹配到的行输出到标准输出。grep
的名称来自于全局正则表达式打印(Global Regular Expression Print
)的缩写。
语法:grep [选项] 关键字 文件路径
。
- 关键字为必填的,表示要过滤的关键字,带有空格或者其他符号的关键字,建议使用英文双引号包裹起来。
常用选项:
-i
或--ignore-case
:忽略大小写。-v
或--invert-match
:仅输出不匹配的行。-n
或--line-number
:输出匹配行的行号。-r
或--recursive
:递归地搜索子目录中的文件。-l
或--files-with-matches
:仅显示包含匹配的文件名。-c
或--count
:仅显示匹配的行数。
示例:
在文件中搜索指定字符串:
grep "grep" grep.md
查询grep.md文件中的grep关键字:
在多个文件中搜索指定字符串:
grep "grep" grep.md grep2.md
查询grep.md和grep2.md文件中的grep关键字:
在文件夹中递归搜索:
grep -r "grep" myLinuxFolder/
对于要查找文件夹里面的内容,同样的要加上
-r
选项,和cp、rm命令同一个道理:忽略大小写搜索:
grep -i "GRep" grep.md
使用
-i
选项来实现忽略大小写搜索:输出不匹配的行:
grep -v "grep" grep.md
使用-v参数来输出不匹配的行,相当于取反了:
显示匹配行的行号:
grep -n "grep" grep.md
使用
-n
选项来显示匹配行的行号:仅显示包含匹配的文件名:
grep -l "grep" grep.md grep2.md
使用-l选项来仅显示包含匹配的文件名,直白点就是显示文件内容中有匹配关键字的文件:
仅显示匹配的行数:
grep -c "grep" grep.md
使用
-c
选项来仅显示匹配的行数:
2.11 wc命令
wc命令通常指的是一个用于统计文件中字数、行数、字符数的命令。wc
的名称代表 “word count
“,但它不仅限于计算单词数量,还可以执行其他统计任务。
语法:wc [选项] 文件路径
常见选项:
-c
:统计字节数。-w
:统计单词数。-l
:统计行数。-m
:统计字符数(对多字节字符可能不准确)。-L
:输出文件中最长行的长度。
示例:
统计文件中的行数:
wc -l grep.md
统计文件中的单词数:
wc -w grep.md
统计文件中的字符数:
wc -m grep.md
统计文件中的字节数:
wc -c grep.md
同时统计行数、单词数和字符数:
wc grep.md
统计多个文件的总行数:
wc -l grep.md grep2.md
2.12 管道符
管道符:|
。
含义:将管道符左边命令的结果作为右边命令的输入。
也就是只要能参数内容输出的命令,都可以和管道符配合。
语法:command1 | command2
例如:
统计文件的行数:
cat grep.md | wc -l
可见结果一致,都是27行
查找文件中的关键字:
cat grep.md | grep "grep"
可见结果一致。
查找某个文件或文件夹:
ls -l | grep grep.md
2.13 echo命令
echo
是一个常用于在命令行中输出文本或变量值的命令。复杂的内容可以使用引号包裹。
语法:echo [选项] 输出的内容
常用选项:
-n
:不输出末尾的换行符。默认情况下,echo
会自动在输出文本后添加换行符。-e
:允许使用转义字符。
转义字符:
\n
:换行符\t
:制表符\\
:反斜杠\"
:双引号\'
:单引号
基本用法:
输出文本
echo "hello,world"
不输出末尾的换行符
echo -n "hello,world"
转义字符
echo -e "hello\nworld"
变量替换
在
echo
命令中,你也可以使用变量来输出内容:name="John" echo "Hello, $name!"
重定向
echo
命令也可以与重定向一起使用,将输出内容写入文件而不是屏幕。echo "hello world" > 文件名称
这里的
>
符号称为重定向符。
注意事项
- 引号的使用: 在
echo
命令中,字符串可以用双引号或者不用引号。双引号内的特殊字符会被解释,而单引号内的字符串会被视为纯文本输出。- 可移植性: 尽管
echo
在大多数现代的Linux系统上都支持丰富的特性,但是由于历史原因,不同系统上的echo
命令可能存在一些微妙的行为差异。如果你的脚本需要在不同的系统上运行,最好是使用printf
来代替echo
,因为printf
的行为在不同系统上更一致。- 输出问题: 当你需要输出一些复杂的文本,特别是包含特殊字符时,最好使用
printf
命令,因为它提供了更丰富的格式化选项,更可靠地处理各种输出情况。
2.14 反引号
在Linux系统中,反引号 ` (grave accent)的主要作用是执行包裹在其中的命令,并将其输出结果作为字符串返回。这种操作被称为命令替换。
基本用法:
result=`command`
或者使用更现代的语法:
result=$(command)
这里的 command
可以是任何合法的Linux命令,包括系统命令、自定义脚本等等。当命令被执行时,反引号或$()
中的命令将被执行,并且其输出结果将被捕获并赋值给 result
变量。
举例说明:
current_date=`date`
echo "The current date is: $current_date"
上面的代码中,date
命令用于获取当前的日期和时间,反引号将 date
命令包裹起来,将其执行结果赋值给 current_date
变量,然后通过 echo
命令输出。
嵌套使用:
命令替换可以嵌套使用,这意味着可以在一个命令替换内部再使用另一个命令替换。
file_size=$(wc -c $(ls | head -n 1))
echo "The size of the first file is: $file_size"
在上面的例子中,ls | head -n 1
用于获取当前目录下的第一个文件名,然后 wc -c
命令用于计算该文件的字节数。整个命令将第一个文件的字节数赋值给 file_size
变量,并输出。
对于上面的echo命令,我们来直观的看看:
注意事项:
- 使用反引号或
$()
进行命令替换时,建议避免使用多层嵌套,以保持代码的可读性。- 在需要处理文件名或路径时,最好将命令替换的结果使用双引号引起来,以防止空格或其他特殊字符引起的问题。例如:
$(command)
应该写成"$result"
。- 虽然反引号是标准的用法,但
$()
更容易阅读和理解,并且在嵌套和转义上更方便,因此更推荐使用$()
。
2.15 重定向符
在Linux系统中,重定向符号是一种用于控制命令输入和输出的特殊符号。通过重定向符号,可以将命令的输入、输出或错误流定向到文件或其他命令中。
以下是Linux系统中常用的重定向符号:
>
(输出重定向)>
符号用于将命令的标准输出重定向到指定文件,如果目标文件已存在,则会被覆盖。command > 文件
>>
(追加重定向)>>
符号用于将命令的标准输出追加到指定文件的末尾,而不是覆盖文件内容。command >> 文件
<
(输入重定向)<
符号用于将文件内容作为命令的输入。command < 文件
|
(管道)|
符号用于将一个命令的输出传递给另一个命令的输入,构成管道。command1 | command2
&>
或2>
(错误重定向)&>
或2>
符号用于将命令的错误输出重定向到指定文件。command 2> 文件
2>>
(追加错误重定向)2>>
符号用于将命令的错误输出追加到指定文件的末尾。command 2>> 文件
&>>
(错误和输出都追加重定向)&>>
符号用于将命令的标准输出和错误输出都追加到指定文件的末尾。command &>> 文件
|&
(管道错误)|&
符号用于将命令的标准输出和错误输出合并,然后传递给另一个命令的输入。command1 |& command2
注意:
- 重定向符号可以组合使用,以满足特定的需求。
- 使用重定向符号时,务必小心,以免意外覆盖或丢失数据。
- 在使用输入重定向时,文件的内容将作为命令的标准输入,而不是文件名本身。
2.16 tail命令
tail
命令是一个常用的用于查看文件末尾内容的命令,在 Linux 系统中非常常见。它的主要功能是显示文件的末尾部分,默认情况下显示文件的最后 10 行。
基本语法:tail [选项] [文件名]
常用选项以及示例:
-n
:后面跟上行数,指定要显示的行数。tail -n 20 filename.txt
这个命令将显示
filename.txt
文件的最后 20 行。-f
:实时追踪文件内容的变化,并在文件末尾不断显示新增的内容。tail -f filename.log
这个命令会实时显示
filename.log
文件的最新内容,并持续更新,非常适合查看日志文件。我先在会话1中向文件输入一部分内容:
然后我开启另外一个会话2,来查看该文件内容:
之后再会话1中追加文件内容,然后切换回会话2查看:
可见监控成功。确实是实时显示的。
-c
:后面根上字节数,表示显示指定字节数的内容。tail -c 1000 filename.txt
这个命令会显示
filename.txt
文件的最后 1000 字节的内容。
注意:
tail
命令默认显示文件的最后 10 行,可以通过-n
选项指定显示的行数。- 使用
-f
选项时,tail
命令会持续监听文件的变化,直到手动中断(例如按下Ctrl + C
组合键)。- 当使用
-c
选项时,tail
命令会按字节而不是行来显示文件的内容。- 在某些系统中,
tail
命令可能还支持其他选项,可以通过man tail
命令查看完整的选项列表和说明。
2.17 vi编辑器
vi/vim
是visual interface
的简称,是Linux中最经典的文本编辑器。
同图形化界面中的文本编辑器一样,vi
是命令行下对文本文件进行编辑的绝佳选择。
vim
是vi
的加强版本,兼容vi
的所有指令,不仅能编辑文本,而且还具有shll
程序编辑的功能,可以不同颜色的字体来辨别语法的正确性,极大方便了程序的设计和编辑性。
语法:vim 文件
由于vim兼容全部的vi功能,后续全部使用vim命令。
注意:
- 如果文件路径表示的文件不存在,那么此命令会用于编辑新文件。
- 如果文件路径表示的文件存在,那么此命令用于编辑已有文件。
2.17.1 vi/vim三种工作模式
vi 和 vim 是常用的文本编辑器,它们都有三种主要模式:命令模式 (Command mode)、插入模式 (Insert mode)、以及底行模式 (Ex mode)。
**命令模式 (Command mode)**:
在这个模式下,你可以执行一系列的编辑命令,比如移动光标、复制、粘贴、删除、查找替换等。这是 vi 和 vim 默认的启动模式。
在命令模式下,按键输入会被解释为编辑命令,而不是输入文本。
一些常用的命令包括:
命令 描述 i
在当前光标位置进入插入模式 a
在当前光标位置之后进入插入模式 I
在当前行开头进入插入模式 A
在当前行结尾进入插入模式 o
在当前光标下一行进入插入模式 O
在当前光标上一行进入插入模式 ESC
任何情况下输入ESC都能够回到命令模式 键盘上、键盘k 向上移动光标 键盘上、键盘j 向下移动光标 键盘左、键盘h 向左移动光标 键盘右、键盘l 向右移动光标 0
移动光标到当前行开头 $
移动光标到当前行结尾 page(PgUp)
向上翻页 pagedown(PgDn)
向下翻页 /
进入搜索模式 n
向下继续搜索 N
向上继续搜索 dd
删除光标所在行内容 ndd
n是数字,表示删除当前光标下n行 yy
复制当前行 nyy
n是数字,复制当前行和下面n行 p
粘贴复制内容 u
撤销修改 ctrl+r
反向撤销修改 gg
跳到首行 G
跳到行尾 dG
从当前行开始,向下全部删除 dgg
从当前行开始,向上全部删除 d$
从当前光标开始,删除到本行的末尾 d0
从当前光标开始,删除到本行的开头 **插入模式 (Insert mode)**:
在这个模式下,你可以像在普通文本编辑器中一样输入文本。
按下
i
键进入插入模式,光标将出现在当前位置,你可以在这里开始键入文本。退出插入模式并返回命令模式的方法包括按下
Esc
键或者Ctrl+[
。**底行模式 (Ex mode)**:
在这个模式下,你可以执行更高级的编辑命令,比如保存文件、退出编辑器、执行搜索替换等。
按下
:
键后,底行命令提示符会出现在编辑器的底部,你可以在这里输入命令。一些常用的底行命令包括:
命令 描述 :wq
保存并退出 :q
仅退出 :q!
强制退出 :w
仅保存 :set nu
显示行号 :set paste
设置粘贴模式
这三种模式在 vi 和 vim 中可以相互切换,使得编辑文本更加高效和灵活。
流程:
- 使用vi/vim进入文件的时候,最开始是命令模式
- 当你输入i的时候,就切换为了插入模式,此时,你可以任意编辑文本,当你想要回到命令模式的时候,按下
ESC
即可。 - 当你完成了编辑操作之后,你可以使用
:xxx
命令来执行底线模式,比如保存、强制退出等。
2.18 命令选项
我们学习的一系列Linux命令,它们所拥有的选项都是非常多的。
比如,简单的ls命令就有:-a -A -b -c -C -d -D -f -F -g -G -h -H -i -I -k -l -L -m -n -N -o -p -q -Q -r-R -s -S -t -T -u -U -v -w -x -X -1等选项,可以发现选项是极其多的。
笔记中, 并不会将全部的选项都进行讲解,否则,一个ls命令就可能花费很大的篇幅。
笔记中,会对常见的选项进行讲解, 足够满足绝大多数的学习、工作场景。
查看命令的帮助:
可以通过:命令 --help
查看命令的帮助手册
查看命令的详细手册:
可以通过:man 命令
查看某命令的详细手册
2.19 su和exit命令
su
命令在 Linux 系统中用于切换用户身份。它允许当前登录的用户以另一个用户的身份登录系统,并在新用户的环境中执行命令。通常,su
命令被用来切换到超级用户(root)账户,以执行需要特权的操作。下面是 su
命令的详细解释:
语法:su [选项] [用户名]
参数
用户名
:可选参数,表示要切换到的目标用户的用户名。如果未提供用户名,则默认切换到超级用户(root)账户。
选项:
-c <命令>
:允许在切换用户后立即执行指定的命令,然后返回原用户身份。-l
或--login
:表示以登录 shell 的方式切换用户,这会模拟完全登录,包括重新读取目标用户的环境变量和启动文件。-
或-p
:与-l
选项相同,表示以登录 shell 的方式切换用户。-s <shell>
:指定要使用的 shell,而不是目标用户的默认 shell。这在执行脚本或在其他 shell 中执行命令时非常有用。
工作原理:
- 如果未提供用户名,则
su
命令默认将用户切换到超级用户(root)账户。 - 如果提供了用户名,则
su
命令将尝试切换到指定的用户账户。用户需要输入目标用户的密码(如果有)以进行身份验证。 - 一旦成功切换到目标用户,用户就可以在该用户的上下文中执行命令和操作。
- 用户可以通过输入
exit
命令或按下Ctrl+D
来退出目标用户身份,返回原用户身份。
示例:
切换到超级用户(root):
su
切换到另一个用户(例如,切换到用户名为
username
的用户):su username
在切换用户后执行一个命令(例如,以
username
用户的身份执行ls
命令):su username -c "ls"
以登录 shell 的方式切换用户(模拟完全登录):
su - username
注意事项:
- 在切换用户时,针对普通用户切换到其他用户,请确保输入正确的密码以进行身份验证,否则切换将失败。如果是从root用户切换到其他子用户,则无需密码,可以直接切换。
- 切换到超级用户(root)账户时要格外小心,因为超级用户具有系统的完全权限,可以对系统进行任何更改,包括潜在的破坏性操作。
- 建议在完成需要超级用户权限的任务后尽快返回到普通用户身份,以减少意外更改系统的风险。
2.20 sudo命令
在Linux系统中,sudo
是一个十分重要的命令,它允许普通用户以超级用户(通常是root
)的权限执行特定的命令。
在Unix和Linux系统中,超级用户(也称为root
用户)拥有对系统的完全访问权限。然而,在日常使用中,直接使用root
账户可能会带来一些安全风险。因此,sudo
命令允许系统管理员授予普通用户执行特定命令的权限,而无需暴露root
账户的凭证。
语法:sudo [选项] [命令]
其中,[命令]
是要执行的命令,而[选项]
通常用来指定不同的配置或行为。例如:
sudo apt-get update
:以超级用户权限运行apt-get update
命令,用于更新软件包列表。sudo shutdown -r now
:以超级用户权限立即重启系统。sudo nano /etc/hosts
:以超级用户权限使用nano编辑器编辑/etc/hosts
文件。
注意:并不是所有的普通用户都可以使用sudo命令,我们需要为普通用户配置sudo认证。
配置:
sudo
的配置文件是/etc/sudoers
。这个文件决定了哪些用户或用户组可以使用sudo
以及可以执行哪些命令。
sudoers
文件使用visudo
命令编辑,这个命令会在编辑过程中进行语法检查,避免错误导致系统不安全。- 通常,系统管理员可以配置
sudoers
文件以允许特定用户或用户组使用sudo
命令。例如,可以通过username ALL=(ALL) ALL
配置让特定用户拥有sudo
的全部权限。
配置步骤:
切换到root用户,执行
visudo
命令,会自动通过vi编辑器打开/etc/sudoers
,或者直接执行:vim /etc/sudoers
在文件的最后添加权限,例如:
nxz ALL=(ALL) NOPASSWD:ALL
表示赋予nxz用户所有权限,并且执行sudo命令的时候无需输入密码。
最后通过
wq
保存
安全性考虑:
sudo
命令的使用可以追溯到每个用户,这有助于追踪谁以超级用户权限执行了什么操作。- 正确配置
sudoers
文件是确保系统安全性的关键。如果配置不当,可能会导致恶意用户获得超级用户权限,从而危及系统安全。 - 需要注意的是,即使是使用
sudo
命令,用户也应当仔细审查要执行的命令,避免意外或不必要的系统变更。
2.21 用户与用户组
在Linux系统中,可以配置多个用户和用户组,其中,一个用户可以存在于多个用户组中
图示:
同时,从上图也可以看出,在Linux的权限管控中,权限的管控分为两个角度:
- 针对用户的权限管控
- 针对用户组的权限管控
比如,针对某个文件,可以控制某个用户可访问,也可控制某一个用户组中的所有用户可访问。所以,我们在这小节学习Linux的用户和用户组的基础命令,为后面权限的学习大侠基础。
2.21.1 新增用户命令
在Linux系统中,useradd
和adduser
是用于创建新用户账户的两个常用命令。虽然它们的功能相似,但它们在不同的Linux发行版中可能会有一些细微的差异。以下是对这两个命令的详细解释:
useradd
命令:
useradd
命令是一个较低级别的工具,通常在大多数Linux系统上可用。它通常用于创建新用户账户,但它不会自动创建用户的家目录或设置默认的登录Shell。以下是useradd
命令的一般语法:
useradd [options] username
一些常用的选项包括:
-c, --comment COMMENT
:为用户添加一段注释,描述用户的信息。-d, --home HOME_DIR
:指定用户的家目录。-g, --gid GROUP
:指定用户的初始组,不指定,则会创建同名的组并且自动加入。-G, --groups GROUPS
:指定用户附加到的附加组。多个组之间用逗号分隔。-m, --create-home
:创建用户的家目录。-s, --shell SHELL
:指定用户的登录Shell。-u, --uid UID
:设置用户的UID。
例如,要创建一个名为”john”的新用户,可以使用以下命令:
useradd -m john
adduser
命令:
adduser
命令是一个更高级别的工具,它通常在Debian及其衍生发行版中可用(如Ubuntu)。它是对useradd
的一个包装器,提供了更友好的界面,并自动执行一些配置任务,如创建家目录、设置默认Shell等。以下是adduser
命令的一般语法:
adduser [options] username
一些常用的选项包括:与useradd
命令相似,adduser
也支持大多数useradd
的选项,如-c
、-d
、-g
等。
adduser
命令不需要使用-m
选项来创建用户的家目录,因为它会自动创建。另外,adduser
命令还会交互式地提示您输入用户的一些信息,如密码、全名等。
例如,要使用adduser
创建一个名为”jane”的新用户,可以简单地运行以下命令:
adduser jane
区别和建议:
useradd
是更通用的命令,在各种Linux发行版中都可用,但使用它需要手动处理一些配置任务,如创建家目录和设置默认Shell。
adduser
是Debian及其衍生发行版中的推荐选择,它提供了更友好的界面,并自动执行一些配置任务,使用户创建过程更加简单。
一般建议在Debian及其衍生发行版中使用adduser
,在其他Linux系统中使用useradd
。
2.21.2 删除用户命令
userdel
命令是用于删除用户账户的Linux命令。当您不再需要某个用户账户时,可以使用userdel
命令将其从系统中删除。但请注意,删除用户账户不会删除与该账户关联的文件和目录,包括家目录等。以下是userdel
命令的详细解释:
命令语法:
userdel [options] username
常用选项:
-f, --force
:强制删除用户,即使用户当前已登录。-r, --remove
:删除用户时,同时删除用户的家目录及其内容。
示例:
删除用户:最基本的用法是只指定用户名,这将删除指定用户账户:
userdel username
强制删除用户:有时用户可能正在登录,此时您需要使用
-f
选项来强制删除用户账户:userdel -f username
删除用户及其家目录:如果要删除用户的同时也删除其家目录及其内容,可以使用
-r
选项:userdel -r username
注意事项:
- 删除用户账户是一个敏感操作,请务必小心使用,并确保您了解所做更改的影响。
- 在删除用户之前,最好确保用户不再需要该账户,并且备份或迁移其数据(如果需要的话)。
- 使用
-r
选项删除用户时,将连同用户的家目录一起删除,这可能导致数据丢失,所以请谨慎使用该选项。
2.21.3 修改用户属性命令
当您在Linux系统中需要修改用户账户的属性时,可以使用usermod
命令。usermod
命令允许您修改用户账户的各种属性,如用户名、用户ID (UID)、所属组、家目录、登录Shell等。以下是usermod
命令的一般语法:
usermod [options] username
这里是一些常用的选项:
-c, --comment COMMENT
:为用户添加一段注释,描述用户的信息。-d, --home HOME_DIR
:指定用户的家目录。-e, --expiredate EXPIRE_DATE
:设置用户账户的过期日期,格式为YYYY-MM-DD
。-g, --gid GROUP
:将用户添加到指定的初始组。-G, --groups GROUPS
:指定用户附加到的附加组。多个组之间用逗号分隔。-l, --login NEW_LOGIN
:修改用户的登录名。-s, --shell SHELL
:修改用户的登录Shell。-u, --uid UID
:设置用户的UID。
下面是一些常见的用例示例:
修改用户的登录Shell:您可以使用
-s
选项来修改用户的登录Shell。例如,将用户”john”的Shell修改为bash:usermod -s /bin/bash john
修改用户的家目录:使用
-d
选项可以更改用户的家目录。例如,将用户”jane”的家目录修改为/home/jane_new
:usermod -d /home/jane_new jane
将用户添加到附加组:使用
-G
选项可以将用户添加到指定的附加组。例如,将用户”john”添加到组”newgroup”:usermod -G newgroup john
修改用户的注释信息:使用
-c
选项可以添加或修改用户的注释信息。例如,为用户”john”添加一个描述:usermod -c "John Smith, Developer" john
2.21.4 更改用户密码命令
passwd
命令用于更改用户的密码。它允许用户在Linux系统上更改自己的密码,或者如果具有适当的权限,允许超级用户(root用户)更改其他用户的密码。以下是passwd
命令的详细解释:
命令语法:
passwd [options] [username]
参数和选项:
- 如果不指定用户名,则
passwd
命令将更改当前用户的密码。 - 如果指定了用户名,则
passwd
命令将更改指定用户的密码。 - 如果以root用户身份执行
passwd
命令,则可以更改任何用户的密码,而不需要知道其当前密码。
示例:
更改当前用户密码:
passwd
运行这个命令后,系统会提示您输入当前用户的密码,然后提示您输入新密码和确认新密码。
更改其他用户的密码:
passwd username
这将更改指定用户的密码。如果您是超级用户,不需要知道该用户的当前密码即可执行此操作。
2.21.5 显示用户和组命令
id
命令用于显示用户和组的标识号(UID
和GID
),以及用户所属的附加组。id
命令的一般语法如下:
id [options] [username]
如果不指定用户名,则默认显示当前用户的标识号。以下是该命令的一些常用选项:
-u, --user
:仅显示用户的UID。-g, --group
:仅显示用户所属的主要组的GID。-G, --groups
:显示用户所属的附加组的GID列表。-n, --name
:以名称而不是数字形式显示标识号(仅在附加组选项时可用)。
示例:
显示当前用户的标识号:
id
这将显示当前用户的UID、主要组的GID以及附加组的GID列表。
显示指定用户的标识号:
id username
这将显示指定用户的UID、主要组的GID以及附加组的GID列表。
仅显示指定用户的UID:
id -u username
这将仅显示指定用户的UID。
仅显示指定用户所属的主要组的GID:
id -g username
这将仅显示指定用户所属的主要组的GID。
显示指定用户所属的附加组的GID列表:
id -G username
这将显示指定用户所属的附加组的GID列表。
2.21.6 显示用户信息
finger
命令用于显示关于用户或某些用户的信息,包括登录名、真实姓名、终端、登录时间、用户ID、用户主目录和最后一次消息。它允许您查看当前登录系统的用户列表以及有关这些用户的信息。以下是finger
命令的详细解释:
命令语法:
finger [options] [username]
如果不指定用户名,则finger
命令默认显示当前系统上所有用户的信息。
常用选项:
-s
:显示短格式的用户信息,仅显示用户名、真实姓名、终端、登录时间和登录IP地址。-l
:显示长格式的用户信息,显示更详细的用户信息,包括用户ID、用户主目录等。
示例:
显示当前系统上所有用户的信息:
finger
这将显示当前系统上所有用户的信息,包括用户名、真实姓名、终端、登录时间等。
显示指定用户的信息:
finger username
这将显示指定用户的信息,包括用户名、真实姓名、终端、登录时间等。
显示指定用户的短格式信息:
finger -s username
这将显示指定用户的短格式信息,包括用户名、真实姓名、终端、登录时间和登录IP地址。
显示指定用户的长格式信息:
finger -l username
这将显示指定用户的长格式信息,包括用户名、真实姓名、终端、登录时间、用户ID、用户主目录等。
注意事项:
finger
命令可以通过查看登录用户列表来帮助系统管理员监视系统上的活动。- 在某些系统中,对
finger
命令的访问可能会受到限制或禁用,以保护用户的隐私和系统安全。- 对于某些用户来说,他们可能不希望他们的信息被公开,因此系统管理员应该在配置系统时考虑到这一点,并采取相应的安全措施。
通过finger
命令,您可以方便地查看系统上当前登录用户的信息,以及其他用户的一些基本信息,这对于系统监视和用户管理非常有用。
2.21.7 显示当前登录用户信息
who
命令用于显示当前登录到系统上的用户信息。它显示有关用户登录的终端、登录时间以及从哪个位置登录等信息。who
命令通常用于查看当前系统上的活动用户,并且在系统管理、监视和调试方面非常有用。以下是who
命令的详细解释:
命令语法:
who [options]
常用选项:
-H, --heading
:显示列标题。-q, --count
:显示当前登录用户数。-u, --users
:显示当前登录用户的用户名。
示例:
显示当前登录到系统的所有用户:
who
这将显示当前登录到系统的所有用户的信息,包括登录用户名、终端、登录时间以及登录的IP地址(如果使用
-i
选项)。显示当前登录到系统的用户数:
who -q
这将显示当前登录到系统的用户数。
仅显示当前登录到系统的用户名:
who -u
这将仅显示当前登录到系统的用户的用户名。
2.21.8 新增用户组
groupadd
命令用于在Linux系统中创建新的用户组。当您需要为一组用户分配共同的权限或资源访问时,可以使用groupadd
命令创建一个新的用户组。以下是groupadd
命令的详细解释:
命令语法:
groupadd [options] groupname
常用选项:
-g, --gid GID
:指定新用户组的GID(组标识号)。如果未指定GID,则系统将为新组分配下一个可用的未使用的GID。-r, --system
:创建一个系统组。系统组的GID通常小于1000,并且在大多数Linux系统中,系统组通常用于运行系统服务或特定的系统任务。
示例:
创建一个新的普通用户组:
groupadd mygroup
这将在系统中创建一个名为”mygroup”的新用户组。
创建一个指定GID的用户组:
groupadd -g 1001 mygroup
这将创建一个名为”mygroup”的新用户组,并指定其GID为1001。
创建一个系统用户组:
groupadd -r mysystemgroup
这将创建一个名为”mysystemgroup”的新系统用户组。
注意事项:
- 使用
groupadd
命令创建新用户组需要超级用户权限,因此通常需要使用sudo
或以root
身份运行该命令。- 普通用户组的GID通常从1000开始分配,而系统用户组的GID通常小于1000。
- 在给用户分配权限或资源时,通常建议将用户组用于管理,而不是直接管理个别用户,这样可以更好地管理用户的权限和资源访问。
- 系统管理员应该谨慎管理用户组,确保每个用户组都具有适当的权限和资源访问,以确保系统的安全性和稳定性。
2.22 getent命令
getent
命令在 Linux 系统中用于从系统数据库中检索特定类型的条目。它可以从不同的数据库中获取信息,如用户、组、主机、服务等。通常情况下,getent
命令用于从 /etc/passwd
、/etc/group
、/etc/hosts
、/etc/services
等文件中获取信息,但也可以从其他源获取信息,如 NIS(Network Information Service) 或 LDAP(Lightweight Directory Access Protocol)。
语法:
getent [options] database [key ...]
参数说明:
- options:可选的选项,用于指定命令的行为。
- database:指定要查询的数据库类型,如
passwd
、group
、hosts
、services
等。 - key:可选参数,用于指定要检索的特定项的键值。对于不同的数据库类型,可以有不同的键值。
常见选项:
**-s, –service <name>**:指定要使用的名称服务,如 files、dns、nis 等。默认情况下,它使用配置文件(如
/etc/nsswitch.conf
)中指定的服务。-u, –universal:显示通用名称(GECOS)而不是用户名。
**-d, –default <database>**:指定当指定的数据库类型不存在时要使用的默认数据库。
示例用法:
查询用户信息:
getent passwd username
这将返回与指定用户名匹配的
/etc/passwd
文件中的条目。查询组信息:
getent group groupname
这将返回与指定组名匹配的
/etc/group
文件中的条目。查询主机信息:
getent hosts hostname
这将返回与指定主机名匹配的
/etc/hosts
文件中的条目。查询服务信息:
getent services ftp
这将返回与指定服务名(如 ftp)匹配的
/etc/services
文件中的条目。指定服务:
getent -s files passwd username
这将使用文件服务而不是默认的服务来查询用户信息。
getent
命令对于从系统数据库中获取信息是非常有用的,尤其是在脚本编写、系统管理以及网络配置等方面。它提供了一种统一的方式来访问系统信息,无论信息存储在哪个数据库中。
2.23 权限控制
注意:权限控制相关的命令对应用户以及用户组的用户来执行,否则无法进行权限修改。当然,root用户除外
我们以前喜欢用ls -l
或者ll
来查看文件信息:
上图中,序号1、2、3分别表示:
- 表示文件、文件夹的权限控制信息
- 表示文件、文件夹所属用户
- 表示文件、文件夹所属用户组
2.23.1 权限信息
权限细节总共分为10个槽位:
从这10个槽位中,我们大概发现权限字符串的规则:
- 第一个字符表示文件类型(如普通文件、目录、符号链接等)。
- 后面的九个字符分为三组,每组三个字符代表一个用户类别的权限,即:所有者(owner)、组(group)和其他用户(others)。
权限字符的含义:
- r(读权限):允许读取文件内容或查看目录中的文件列表。对应数字4。
- w(写权限):允许修改文件内容或在目录中创建、删除、重命名文件。对应数字2。
- x(执行权限):对于文件,表示允许执行文件;对于目录,表示允许进入目录。对应数字1。
2.23.2 chmod命令
chmod
是 Linux 系统中用于修改文件或目录权限的命令。它可以通过更改文件或目录的权限来控制谁可以读取、写入或执行它们。chmod
命令支持两种格式的权限表示法:符号表示法和数字表示法。
chmod [options] mode file...
参数说明:
- options:可选参数,用于指定命令的行为。
- mode:权限模式,可以是符号表示法或数字表示法。
- **file…**:要更改权限的文件或目录列表。
符号表示法:
符号表示法使用符号来表示权限的变化。
- u:表示文件所有者(User)。
- g:表示文件所属组(Group)。
- o:表示其他用户(Others)。
- a:表示所有用户,相当于
ugo
的组合。 - **+**:添加权限。
- **-**:删除权限。
- **=**:设置权限。
例如,要将文件 example.txt
的所有者给予读取和写入权限,可以使用命令:
chmod u+rw example.txt
数字表示法:
数字表示法使用数字来表示权限的变化。
- 0:无权限。
- 1:执行权限(x)。
- 2:写权限(w)。
- 3:写权限和执行权限。
- 4:读权限(r)。
- 5:读权限和执行权限。
- 6:读权限和写权限。
- 7:读权限、写权限和执行权限。
例如,要将文件 example.txt
的权限设置为所有者具有读取和写入权限,而组和其他用户只有读取权限,可以使用命令:
chmod 644 example.txt
常用选项:
- -R, –recursive:递归地更改目录及其子目录中的文件权限。
示例用法:
添加权限:
chmod +x script.sh
这将为
script.sh
文件添加执行权限。删除权限:
chmod -w file.txt
这将从
file.txt
文件中删除写权限。设置权限:
chmod u=rwx,go=rx directory
这将设置
directory
目录的权限为所有者具有读写执行权限,组和其他用户只有读执行权限。递归更改权限:
chmod -R 755 directory
这将递归地将
directory
目录及其子目录中的所有文件和目录的权限设置为755
。
2.23.3 chown命令
chown
命令在 Linux 和其他类 Unix 操作系统中用于改变文件或目录的所有者(owner)。它允许用户改变文件或目录的拥有者,同时也可以改变所属的组。
语法:
chown [选项] [用户][:][用户组] 文件名
参数说明:
- 选项:可选的选项,用于指定命令的行为。
- 用户名:指定新的所有者用户名或用户 ID。
- 文件名:指定要修改所有者的文件或目录名称。
常见选项:
- -R, –recursive:递归地改变目录及其内容的所有者。
- -v, –verbose:显示详细的操作信息。
示例用法:
改变文件的所有者:
chown user1 file.txt
这会将文件
file.txt
的所有者改为user1
。同时改变文件的所有者和组:
chown user1:group1 file.txt
这会将文件
file.txt
的所有者改为user1
,所属组改为group1
。递归地改变目录及其内容的所有者:
chown -R user1:group1 directory
这会将目录
directory
及其所有子目录和文件的所有者改为user1
,所属组改为group1
。使用用户 ID 改变文件的所有者:
chown 1001 file.txt
这会将文件
file.txt
的所有者改为用户 ID 为1001
的用户。
chown
命令允许用户更改文件和目录的所有者,这在管理文件系统权限和确保文件和目录访问权限的正确性方面非常有用。
注意:通常情况下只有超级用户(root)才有权限改变文件的所有者。
3. Linux实用操作
3.1 各类快捷键
CTRL+C:强制停止
CTRL+D:退出当前用户登录;或者退出某些特定程序的专属页面
注意:不能退出vi/vim。
history:查看历输入过的命令
!命令前缀:自动执行上一次匹配前缀的命令
例如我先通过history查看我历史使用过的命令:
我在之前执行过python命令,现在,我只需要使用
!p
,就能执行python命令了:CTRL+R:输入内容去匹配历史命令
光标移动快捷键
- CTRL+A:跳到命令开头
- CTRL+E:跳到命令结尾
- CTRL+键盘左键:向左跳一个单词
- CTRL+键盘右键:向右跳一个单词
CTRL+L/clear:清屏
3.2 软件安装
在Windows中,我们按照软件一般有两种方式:应用商店、下载安装包(.exe格式文件)
在Linux中,他的”应用商店”就是yum
,安装包就是RPM
格式问卷。
上述是针对于
CentOS
来讲,如果是Ubuntu
,那么应用商店就是apt
命令。
yum命令是一个RPM包软件管理器,用于自动化安装Linux软件,并可以自动解决依赖问题。
常用形式:yum [-y] [install | remove | search] 软件名称
- 选项:-y表示安装时自动确认,无需手动确认安装或卸载过程
- install:安装
- remove:卸载
- search:搜索
注意:
- yum命令需要root权限,或者使用sudo给用户授权
- yum命令需要联网
示例:
安装软件包
要安装一个软件包,可以使用
yum install
命令,后跟要安装的软件包的名称。例如:yum install package_name
更新软件包
通过
yum update
命令可以更新系统中已安装的软件包。它会检查可用的更新并安装它们。yum update
升级软件包
yum upgrade
命令可以将系统中的所有软件包升级到最新可用版本。yum upgrade
删除软件包
要删除已安装的软件包,可以使用
yum remove
命令。yum remove package_name
搜索软件包
使用
yum search
命令可以搜索软件包。它会列出与给定关键字匹配的所有可用软件包。yum search keyword
显示软件包信息
通过
yum info
命令可以获取有关特定软件包的详细信息,包括描述、版本和依赖关系等。yum info package_name
清理缓存
yum
会在系统中保留已下载的软件包以便以后使用。如果要清理这些缓存,可以使用yum clean
命令。yum clean packages # 清理软件包缓存 yum clean headers # 清理头文件缓存 yum clean all # 清理所有缓存
列出仓库
yum repolist
命令用于列出系统中所有可用的软件仓库。yum repolist
添加和删除软件仓库
可以使用
yum-config-manager
命令添加和删除软件仓库。例如,要添加一个名为 “example_repo” 的仓库:yum-config-manager --add-repo=<repo_url>
要删除一个仓库:
yum-config-manager --disable <repo_id>
处理依赖关系
yum
会自动处理软件包之间的依赖关系。当安装或升级软件包时,它会自动安装任何必需的依赖项。这些是
yum
命令的基本用法和功能。使用man yum
命令可以查看yum
命令的完整手册。
3.3 systemctl命令
Linux系统很多软件(内置或第三方)均支持使用systemctl
命令控制:启动、停止、开机自启。
凡是能够被systemctl
管理的软件,一般也称之为:服务
语法:systemctl 选项 服务名
常用选项如下:
- start:启动
- stop:关闭
- status:查看状态
- enable:开启开机自启
- disable:关闭开机自启
- restart:重启服务
- is-enabled:查看服务是否已启用
- list-unit-files:查看所有可用服务(包括服务、套接字、设备等)
- list-units:查看所有正在运行的服务
- list-dependencies:查看服务的依赖关系
- daemon-reload:重载服务
示例:
启动docker服务
systemctl start docker
停止docker服务
systemctl stop docker
重启docker服务
systemctl restart docker
查看docker服务状态
systemctl status docker
开机启用/禁用docker服务
systemctl enable/disable docker
查看服务是否已启用
systemctl is-enabled docker
查看所有可用服务
使用
systemctl list-unit-files
命令可以列出所有可用的 systemd 单元(包括服务、套接字、设备等)。例如,列出所有服务:systemctl list-unit-files --type=service
查看所有正在运行的服务
可以使用
systemctl list-units
命令来列出当前正在运行的所有 systemd 单元。例如,列出所有正在运行的服务:systemctl list-units --type=service --state=running
查看服务的依赖关系
使用
systemctl list-dependencies
命令可以查看服务的依赖关系。例如,查看docker
服务的依赖关系:systemctl list-dependencies docker
重载 systemd 配置
当对 systemd 单元文件进行更改后,可以使用
systemctl daemon-reload
命令来重新加载 systemd 配置,以使更改生效。systemctl daemon-reload
这些是 systemctl
命令的基本用法和功能。使用 man systemctl
命令可以查看 systemctl
命令的完整手册。
注意:
有一些外部安装的软件(使用
yum
安装的软件),安装以后并没有自动集成到systemctl
中,在此,我们可以手动添加,将安装的外部软件集成进systemctl
,这样就可以通过systemctl
来控制服务了。
3.4 软/硬链接
在Linux系统中,软链接(symbolic link),也称为符号链接,是指一个文件系统中的指向另一个文件或目录的特殊文件。简单来说就是软链接创建一个路径名指向另一个路径名。
类比于Windows,其实就是Windows系统中的快捷方式,也就是文件的本体不变,但是在另外一个地方创建了一个快捷方式,通过这个快捷方式,能够直接访问到文件的本体。
ln
命令是 Linux 系统中用于创建链接(link)的工具,它可以创建硬链接和软链接。链接是文件系统中的一种特殊文件,它可以指向另一个文件或目录。
ln
命令的基本语法为:
ln
命令支持的常用选项包括:
-s
:创建软链接(symbolic link),软链接是一个特殊的文件,它包含指向目标文件的路径。-f
或--force
:强制执行操作,即如果已存在同名的链接文件,则覆盖它。-n
或--no-dereference
:当目标文件为符号链接时,不直接引用链接,而是直接将链接本身视为目标。-r
或--relative
:创建相对路径的链接,而不是绝对路径。
下面分别介绍硬链接和软链接的创建和特点:
3.4.1 硬链接(Hard Link)
硬链接是指多个文件名指向同一个索引节点(inode)的链接关系。多个硬链接共享相同的数据块,它们与原文件在文件系统中没有任何区别。常见特点包括:
- 不可以跨文件系统创建硬链接。
- 删除任何一个硬链接并不影响其他链接和原文件。
- 只有超级用户可以为目录创建硬链接。
- 不能为目录创建硬链接,因为这可能导致循环链接,破坏文件系统的结构。
3.4.2 软链接(Symbolic Link)
软链接是一个指向目标文件或目录的特殊文件,它保存了目标的路径名。软链接的目标可以是绝对路径或相对路径。软链接的特点包括:
- 可以跨文件系统创建软链接。
- 删除原文件不会影响软链接,但删除软链接会导致软链接失效。
- 软链接可以指向文件或目录。
- 软链接可以跨越文件系统边界链接文件。
创建软链接的示例:
查看链接是否生效
可见通过cat命令查看/myLinuxFolder/yum的内容,其实就是/etc/yum.conf文件的内容。
3.5 日期与时期
3.5.1 date命令
date
命令是 Linux 系统中用于显示或设置系统日期和时间的命令。它可以显示当前的日期和时间,也可以设置系统的日期和时间。date
命令支持许多选项,可以用于格式化输出、设置日期时间、计算时间差等操作。
语法:
date [OPTION]... [+FORMAT]
或者:
date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]]
- 如果不指定任何选项和格式,
date
命令将显示当前的日期和时间。 - 如果指定了格式字符串(以
+
开头),则date
命令将按照指定的格式输出日期和时间。
常用选项:
-d, --date=STRING
:显示指定日期时间的格式,字符串格式可以是多种形式,例如”now”表示当前时间,”next Monday”表示下一个星期一,”1 week ago”表示一周前等。一般用于日期计算。-s, --set=STRING
:设置系统日期时间,格式与-d
选项相同。-u, --utc, --universal
:显示或设置为 UTC 时间。+%FORMAT
:按照指定的格式输出日期时间。
格式化输出:
date
命令的格式化输出可以使用格式化控制符,如下所示:
%Y
:4 位数的年份。%m
:月份(01-12)。%d
:日期(01-31)。%H
:小时(00-23)。%M
:分钟(00-59)。%S
:秒(00-60)。%A
:星期全名。%a
:星期简写。%B
:月份全名。%b
或%h
:月份简写。%Z
:时区。
示例:
显示当前日期和时间:
date
显示当前日期和时间的详细信息(包括时区):
date +"%Y-%m-%d %H:%M:%S %Z"
设置系统日期和时间为指定时间:
date -s "2024-04-23 12:00:00"
显示指定日期时间格式:
date -d "next Monday" +"%Y-%m-%d"
显示 UTC 时间:
date -u
注意事项:
- 若要设置系统时间,通常需要具有管理员权限,因此可能需要使用
sudo
命令。- 使用
date
命令设置系统时间时,务必谨慎操作,错误的时间设置可能会影响系统的正常运行。
修改Linux时区:
先删除/etc/localtime文件
rm -rf /etc/localtime
创建一个软链接
ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
3.5.2 npt程序
我们可以通过npt程序自动校准系统时间。
安装:
yum -y install ntp
启动并设置为开机自启:
systemctl start ntpd
systemctl enable ntpd
当ntpd启动后,会定期的帮我们联网校准系统时间。
当然,你也可以手动校准(需要root权限):
ntpdate -u ntp.aliyun.com
3.6 IP地址与主机名
每一个联网的电脑都会有一个IP地址,用于和其他的计算机进行通讯。
可以通过ifconfig
命令,查看本机的IP地址,如果无法使用ifconfig命令,可以安装之后在使用:
yum -y install net-tools
inet后面就是IPV4的地址,inet6代表IPV6的地址。
上诉有eth0
,代表网卡1,如果你还有eth1、eth2…,则代表网卡2、网卡3…以此类推。
对于lo
,则表示localhost
。
对于IP,这里多说一下:0.0.0.0
:
- 可以用于指代本机
- 可以在端口绑定中用来确定绑定关系。
- 在一些IP地址限制中,表示所有IP的意思,如放行规则设置为0.0.0.0,表示允许任意IP访问。
对于主机名,Linux和Windows一样,也可以修改主机名。
查看主机名:
hostname
修改主机名(需要root权限):
hostnamectl set-hostname 新主机名
3.7 网络请求和下载
3.7.1 ping命令
我们可以通过ping命令来检测网络服务器是否联通
语法:ping [-c num] ip或主机名
选项-c
表示检查的次数,后面跟上num
,如果不加上-c
,则会无限制的检测下去,最后只能通过CTRL+C
强制结束。
你会发现,不加-c选项,他就会无限制的检测下去,现在我们加上-c再来看看:
可见我的num是几,就只检测几次。
3.7.2 wget命令
当你需要从网络上下载文件时,wget
是一个非常有用的命令行工具。它可以帮助你从网页上下载文件,支持HTTP、HTTPS和FTP协议。以下是 wget
命令的一些常见用法和选项:
语法:
wget [选项] [URL]
这是最基本的 wget
用法,你只需要提供文件的URL,它就会下载到你的当前工作目录。
常用选项:
-O
: 将下载的文件保存为指定的文件名(重命名)。-q
: 安静模式,不输出任何下载信息。-c
: 断点续传,如果下载中断,可以从中断处继续下载。-P
: 指定下载文件保存的目录。-r
: 递归下载,下载指定URL页面上的所有链接。-np
: 不访问上层目录。-N
: 仅在远程文件的时间戳较新时下载。-b
:表示后台下载,会将日志写入到当前工作目录的wget-log文件中。
示例用法:
下载单个文件:
wget http://example.com/file.zip
下载并重命名文件:
wget -O newname.zip http://example.com/file.zip
断点续传:
wget -c http://example.com/file.zip
递归下载整个网站:
wget -r http://example.com
限制下载速度为100KB/s:
wget --limit-rate=100k http://example.com/file.zip
wget
命令有很多选项,上面只是一些常用的示例。你可以通过 man wget
命令来查看完整的文档,了解更多选项和用法。
3.7.3 curl命令
curl
是一个强大的命令行工具,用于与服务器进行数据传输。它支持多种协议,包括HTTP
、HTTPS
、FTP
等,并提供了丰富的功能和选项。下面是 curl
命令的一些常见用法和选项:
基本用法:
curl [选项] [URL]
这是最基本的 curl
用法,你只需要提供要请求的URL,curl
将会获取该URL对应的内容并输出到标准输出。
常用选项:
-o, --output <文件>
:将输出保存到指定文件。-O, --remote-name
:将输出保存到远程文件的文件名(相当于下载文件,文件名就是远程文件名)。-L, --location
:跟随重定向。-i, --include
:在输出中包含HTTP头信息。-s, --silent
:静默模式,不显示进度或错误信息。-u, --user <user:password>
:指定用户名和密码进行HTTP认证。-X, --request <命令>
:指定HTTP请求方法,如GET、POST等。-d, --data <数据>
:发送POST请求时使用的数据。-H, --header <头>
:自定义HTTP头信息。-c, --cookie <文件>
:使用指定的cookie文件。
示例用法:
下载文件并保存为指定文件名:
curl -o filename.zip http://example.com/file.zip
下载文件并使用远程文件的文件名:
curl -O http://example.com/file.zip
发送POST请求并传递数据:
curl -X POST -d "username=admin&password=12345" http://example.com/login
自定义HTTP头信息:
curl -H "Content-Type: application/json" http://example.com/api
使用基本认证:
curl -u username:password http://example.com/protected
使用cookie文件:
curl -b cookies.txt http://example.com
curl
命令提供了许多选项,上面只是一些常用的示例。你可以通过 man curl
命令来查看完整的文档,了解更多选项和用法。
注意:curl既可以发送请求,也可以下载文件。
3.8 端口
在Linux中,端口是用于在网络上识别不同服务和应用程序的数字标签。当一台计算机运行着多个网络服务时,每个服务都需要与网络中其他计算机通信。这就需要使用端口来区分不同的服务。
以下是有关Linux端口的详细内容:
端口号:
- 端口号是一个16位的无符号整数,范围从0到65535。0到1023的端口号是系统保留端口,用于一些常见的系统服务,比如HTTP服务(端口80)、SSH服务(端口22)等。这些端口号通常需要管理员权限来使用。
- 1024到49151之间的端口号是注册端口,通常可以随意使用,用于松散的绑定一些程序\服务等。
- 49152到65535之间的端口号是动态或私有端口,用于客户端应用程序或者动态分配给一些应用程序使用,用于临时使用。
端口的分类:
- TCP端口:TCP(Transmission Control Protocol)是一种面向连接的协议,用于在网络上可靠地传输数据。TCP端口用于在计算机之间建立可靠的双向通信。常见的网络服务,如Web服务器、FTP服务器、SSH等都使用TCP协议。
- UDP端口:UDP(User Datagram Protocol)是一种无连接的协议,用于在网络上快速传输数据,但不保证数据的可靠性。UDP端口用于那些不需要建立持久连接的应用程序,比如DNS服务、DHCP服务等。
端口的管理:
- 查看端口状态:可以使用命令行工具如
netstat
、ss
、lsof
等来查看系统上正在监听的端口以及与之相关的进程。 - 开放端口:如果要在Linux系统上运行一个网络服务,必须确保相应的端口已经开放。可以通过编辑防火墙规则或者配置服务本身来开放端口。
- 关闭端口:为了提高安全性,有时需要关闭不需要的端口。这可以通过配置防火墙规则或者停止相关服务来实现。
- 端口转发:端口转发是一种网络技术,允许将传入的网络连接重定向到另一个目的地和端口。这在网络中的诸如NAT路由器或者防火墙上很常见,用于将外部流量导向到内部网络的特定主机或服务上。
端口的安全性:
- 开放过多的端口可能增加系统的攻击面,因此需要定期审查开放的端口,确保只开放必要的端口。
- 对于公共网络服务,需要确保它们的端口只对特定的IP地址或者IP地址段开放,以限制对服务的访问。
3.8.1 netstat命令
netstat
(network statistics)是一个用于显示各种网络相关信息的命令行工具,可以在Linux系统中使用。它可以显示关于网络连接、路由表、网络接口状态等方面的信息,帮助管理员诊断网络问题、监视系统网络活动等。下面详细讲解一下netstat
命令的使用和常见选项:
基本语法:
netstat [OPTIONS]
常见选项:
-t
或--tcp
:显示TCP协议相关的连接。-u
或--udp
:显示UDP协议相关的连接。-n
或--numeric
:以数字形式显示地址和端口号,而不进行域名解析。-l
或--listening
:显示正在监听的套接字。-a
或--all
:显示所有连接,包括正在监听的套接字和非监听状态的连接。-p
或--program
:显示与连接关联的进程信息。-r
或--route
:显示路由表。-s
或--statistics
:显示网络统计信息,如传输统计、协议统计等。-c
或--continuous
:持续显示信息,类似于top
命令。
示例用法:
显示所有网络连接:
netstat -a
显示所有TCP连接:
netstat -at
显示所有UDP连接:
netstat -au
显示所有正在监听的套接字:
netstat -l
显示所有正在监听的TCP套接字:
netstat -lt
显示与连接关联的进程信息:
netstat -p
显示路由表:
netstat -r
持续显示网络连接信息:
netstat -c
查看指定端口的占用情况:
netstat -anp | grep 3306
示例解释:
Proto
:显示连接的协议类型,如TCP或UDP。Recv-Q
和Send-Q
:表示接收队列和发送队列的字节数。如果数字不为0,表示有等待处理的数据。Local Address
和Foreign Address
:分别表示本地地址和远程地址。State
:表示连接的状态,比如ESTABLISHED(已建立连接)、LISTEN(正在监听)、TIME_WAIT等。PID/Program name
:显示与连接相关的进程ID和程序名称。
注意事项:
- 需要以管理员权限运行
netstat
命令才能查看所有信息。- 使用
-p
选项时,可能需要以管理员权限运行才能显示与连接关联的进程信息。netstat
命令在某些Linux发行版中已经被标记为过时,推荐使用替代工具如ss
(Socket Statistics)等。
3.8.2 ss命令:
ss
命令是 netstat
的替代工具,用于显示套接字统计信息。
常用选项类似于 netstat
。
ss
更快、更可靠,并且可以显示更多详细信息。
ss
是 Linux 下的一个网络工具,用于显示 socket 统计信息。它的名称来自于 “socket statistics”。ss
命令功能强大,可以帮助用户监视网络连接、套接字状态以及与之相关的统计信息。
语法:
ss [options]
常用选项:
-t
:显示 TCP 套接字。-u
:显示 UDP 套接字。-l
:仅显示监听套接字。-a
:显示所有套接字。-n
:以数字形式显示 IP 地址和端口号。-p
:显示进程名和 PID。-r
:显示 RAW 套接字。-e
:显示扩展信息,包括 UID、PID 和状态。-o
:显示计时器信息。-i
:显示套接字信息。
示例用法:
显示所有 TCP 连接:
ss -t
显示所有 UDP 连接:
ss -u
显示所有监听套接字:
ss -l
显示所有套接字,包括监听和非监听:
ss -a
显示所有套接字的数字格式:
ss -n
显示与进程关联的套接字:
ss -p
显示所有 RAW 套接字:
ss -r
显示扩展信息,包括 UID、PID 和状态:
ss -e
显示计时器信息:
ss -o
显示套接字信息:
ss -i
当然,命令也可以组合使用:
ss -tuln
ss
命令通常需要 root
或 sudo
权限来执行,以便显示所有套接字的信息。
在某些发行版中,ss
可能是 iproute2 套件的一部分。在其他系统中,它可能单独作为一个软件包提供。
3.8.3 lsof(List Open Files):
lsof
命令用于显示系统中打开的文件、网络连接等信息。- 通过
lsof
可以查看特定端口的监听情况以及与之相关的进程信息。
基本语法:
lsof [options]
主要选项:
-c <进程名>
:仅显示指定进程打开的文件。-u <用户名>
:仅显示指定用户打开的文件。-p <PID>
:仅显示指定 PID 的进程打开的文件。-i
:显示网络相关信息。-i4
或-i6
:仅显示 IPv4 或 IPv6 的网络连接信息。-n
:以数字格式显示 IP 地址和端口号,不进行域名解析。-t
:仅显示文件描述符,而不显示文件的详细信息。-F <format>
:指定输出格式。-h
:显示帮助信息。
示例用法:
显示所有打开的文件:
lsof
显示指定进程(比如进程号为 1234)打开的文件:
lsof -p 1234
显示指定用户(比如用户名为 user)打开的文件:
lsof -u user
显示网络连接信息:
lsof -i
仅显示 IPv4 网络连接信息:
lsof -i4
以数字格式显示 IP 地址和端口号:
lsof -i -n
仅显示文件描述符:
lsof -t
lsof
命令通常需要root
或sudo
权限来执行,以便显示所有进程打开的文件。lsof
提供了丰富的选项,可以用于过滤和定位特定的文件或进程。- 在排查系统问题、分析进程间的文件使用情况、监视网络连接等方面,
lsof
是一个非常强大且有用的工具。
总的来说,lsof
可以帮助用户深入了解系统上打开的文件情况,对于排查问题或者进行系统监视都是非常有帮助的。
3.8.4 nc(Netcat):
nc
是 Linux 下的一个网络工具,全称为 “netcat”,它可以用于创建 TCP/UDP 连接、监听端口、进行端口扫描、传输文件等。nc
命令功能强大,是网络调试和分析的常用工具之一。以下是 nc
命令的详细讲解:
语法:
nc [options] [hostname] [port]
主要选项:
-l
:监听模式,用于创建服务器端。-p <port>
:指定端口号。-u
:使用 UDP 协议。-v
:详细模式,显示更多调试信息。-n
:禁止主机名解析,使用 IP 地址。-z
:仅进行端口扫描,不进行数据传输。-w <timeout>
:设置超时时间。-k
:保持连接。-c <command>
:指定一个命令或脚本,在连接建立后执行。-e <executable>
:在连接建立后执行指定的可执行文件。-q <seconds>
:设置发送数据后的延迟时间。-s <ip-address>
:指定源 IP 地址。
示例用法:
连接到远程主机的指定端口:
nc hostname port
在监听模式下等待客户端连接:
nc -l port
使用 UDP 连接:
nc -u hostname port
端口扫描(仅检查端口是否开放):
nc -z hostname port
发送文件:
nc -w 3 hostname port < file.txt
接收文件:
nc -l port > received_file.txt
在连接建立后执行命令:
nc -l port -c "command"
nc
命令是一个非常灵活的工具,可以用于各种网络任务,包括简单的数据传输、端口扫描、远程执行命令等。- 在一些发行版中,
nc
可能作为单独的软件包提供,也可能作为netcat
的别名。 nc
在安全性方面有一定的风险,特别是在监听模式下,可能会被利用进行攻击。因此,在使用时需要注意安全问题。
3.8.5 firewall-cmd(针对基于Firewalld防火墙):
firewall-cmd
是用于配置Firewalld防火墙的命令行工具,可以用于开放或关闭端口。- 需要以管理员权限运行。
firewall-cmd
是 Linux 中用于管理 firewalld
防火墙的命令行工具。firewalld
是一种动态管理防火墙规则的工具,广泛用于许多 Linux 发行版中,如 CentOS/RHEL 7及更新版本。firewall-cmd
提供了一种简单而灵活的方式来配置和管理防火墙规则,使管理员能够轻松地定义允许和拒绝的网络流量。
语法:
firewall-cmd [options] [command [service|port|address...]]
主要选项:
--zone=<zone>
:指定防火墙区域。--add-service=<service>
:允许指定的服务。--remove-service=<service>
:移除指定的服务。--add-port=<port>/[protocol]
:允许指定的端口。--remove-port=<port>/[protocol]
:移除指定的端口。--add-source=<address>
:允许指定来源地址。--remove-source=<address>
:移除指定来源地址。--list-services
:列出已允许的服务。--list-ports
:列出已允许的端口。--list-sources
:列出已允许的来源地址。--permanent
:操作永久规则(需要重载防火墙)。--runtime
:操作运行时规则(不需要重载防火墙)。--reload
:重新加载防火墙规则。
示例用法:
允许 HTTP 服务通过防火墙:
firewall-cmd --zone=public --add-service=http --permanent
移除允许的 HTTP 服务:
firewall-cmd --zone=public --remove-service=http --permanent
允许 TCP 端口 8080 通过防火墙:
firewall-cmd --zone=public --add-port=8080/tcp --permanent
移除允许的 TCP 端口 8080:
firewall-cmd --zone=public --remove-port=8080/tcp --permanent
允许来自 IP 地址 192.168.1.100 的流量:
firewall-cmd --zone=public --add-source=192.168.1.100 --permanent
移除来自 IP 地址 192.168.1.100 的流量:
firewall-cmd --zone=public --remove-source=192.168.1.100 --permanent
列出已允许的服务:
firewall-cmd --zone=public --list-services
列出已允许的端口:
firewall-cmd --zone=public --list-ports
列出已允许的来源地址:
firewall-cmd --zone=public --list-sources
重载防火墙规则:
firewall-cmd --reload
注意:
firewall-cmd
命令需要在管理员权限下执行(通常使用 sudo)。--permanent
选项用于指示操作永久性规则,这些规则将在防火墙重新加载时保留。在添加或移除永久性规则后,需要使用--reload
选项重新加载防火墙。--runtime
选项用于操作当前正在运行的规则,这些规则将在防火墙重新加载时丢失。firewall-cmd
提供了许多其他选项和命令,用于更复杂的防火墙配置。可通过man firewall-cmd
查看完整的文档。
3.8.2 nmap命令
nmap是一个非常强大的网络扫描工具,可以用于网络发现、端口扫描、操作系统检测等。下
安装:
sudo yum install nmap
语法:
nmap [扫描类型] [选项] [目标]
常见扫描类型:
TCP SYN 扫描:默认扫描类型,也是最常用的一种。通过发送TCP SYN 数据包来探测目标主机上响应的端口,而不建立完整的连接。示例:
nmap ip地址
TCP 连接扫描:完成TCP三次握手,用于确定目标主机上是否存在开放的端口。示例:
nmap -sT ip地址
UDP 扫描:用于探测UDP协议上的开放端口。示例:
nmap -sU ip地址
操作系统探测:nmap可以尝试识别目标主机运行的操作系统类型及版本。示例:
nmap -O ip地址
常见选项:
- -p: 指定要扫描的端口范围。例如,
-p 1-100
表示扫描1到100号端口。 - -T: 指定扫描的速度/敏感度级别。有0( Paranoid)、1(Sneaky)、2(Polite)、3(Normal)、4(Aggressive)和5(Insane)六个级别可选,默认为3。
- -o: 指定输出格式。例如,
-oA output_file_prefix
表示将结果输出到三个文件(XML、Nmap、grepable)。 - -v: 输出详细信息。
- -A: 启用操作系统检测、版本检测、脚本扫描和Traceroute等多种扫描技术。
- –script: 指定要运行的脚本。例如,
--script smb-os-discovery
表示运行SMB操作系统发现脚本。
示例:
查看本机暴露的端口:
nmap 127.0.0.1
3.9 进程
程序运行在操作系统中,是被操作系统所管理的。
为管理运行的程序,每一个程序在运行的时候,便被操作系统注册为系统中的一个进程
并会为每一个进程都分配一个独有的:进程ID(进程号),也就是PID;
可以使用以下命令来查看和控制进程:ps
、top
、kill
、htop
3.9.1 查看进程-ps命令
ps
是一个用于显示当前运行进程的命令。在Linux系统中,ps
命令有着广泛的应用,可以用于列出当前系统中正在运行的进程的详细信息。
ps
命令的基本语法如下:
ps [options]
常用选项
a: 显示所有用户的进程,包括其他用户和系统进程。
ps -a
u: 显示用户及其他详细信息,如进程的所有者、CPU使用率、内存使用量等。
ps -u
x: 显示无控制终端的进程。这些通常是守护进程或以其他方式在后台运行的进程。
ps -x
e: 显示所有进程,不仅限于当前终端的进程。
ps -e
f: 以完全格式化的形式展示信息(展示全部信息)
ps -f
一般来说,固定的用法就是
ps -ef
来列出全部进程的全部信息。
示例用法:
列出当前用户的所有进程:
ps -u username
列出所有系统进程:
ps -e
显示所有进程并且以完全格式化的形式展示:
ps -ef
从左到右分别为:
- UID:进程所属的用户ID
- PID:经常的进程号ID
- PPID:进程的父ID(启动此进程的其他进程)
- C:此进程的CPU占用率(百分比)
- STIME:进程的启动时间
- TTY:启动此进程的终端序号,如显示?,表示非终端启动
- TIME:进程占用CPU的时间
- CMD:进程对应的名称或启动路径或启动命令
其他补充说明:
ps
命令可以与管道 (|
) 和其他命令一起使用,用于进一步筛选和处理进程列表。在某些系统上,可能会使用不同版本的
ps
命令,这些版本具有不同的选项和功能。可以通过man ps
查看系统上的ps
命令的手册页来获取更多信息。
3.9.2 结束进程-kill命令
kill
命令用于向进程发送信号,通常用于终止或者控制运行中的进程。在Linux系统中,每个进程都有一个唯一的进程ID(PID),kill
命令可以使用进程ID来确定要操作的目标进程。
kill
命令的基本语法如下:
kill [options] PID
其中,PID
是要操作的目标进程的进程ID。
常用选项:
-TERM (默认): 发送终止信号给进程,要求它正常退出。这是
kill
命令的默认行为。kill PID
-KILL 或 -9: 发送强制终止信号给进程,立即终止进程。
kill -9 PID
-STOP: 发送停止信号给进程,使其暂停执行。可以使用
kill -CONT PID
命令来恢复进程的执行。kill -STOP PID
-CONT: 发送继续信号给被暂停的进程,使其继续执行。
kill -CONT PID
示例用法
终止进程:
kill 1234
强制终止进程:
kill -9 1234
暂停进程:
kill -STOP 1234
恢复暂停的进程:
kill -CONT 1234
补充说明:
如果没有指定信号,
kill
命令将默认发送TERM
信号。通常情况下,首先尝试发送
TERM
信号给进程,如果进程没有响应,则可以尝试发送KILL
信号。在使用
kill
命令时,需要有足够的权限来终止目标进程。否则,可能会收到 “Operation not permitted
“ 错误。
3.10 主机状态
3.10.1 查看系统资源占用-top命令
top
是一个用于动态显示系统中运行进程信息的命令行工具。它提供了实时更新的进程列表,并显示了关于系统资源使用情况的摘要信息。top
命令是 Linux 中非常常用的性能监控工具之一,可以帮助用户实时监视系统资源的使用情况和进程的活动。
基本用法
top
命令的基本语法如下:
top
直接运行 top
命令将在终端显示一个实时更新的进程列表,以及关于系统资源使用情况的摘要信息。
top
命令的输出包括以下主要信息栏:
top: 显示当前时间、系统运行时间(启动时间)、用户登录数、平均负载(1分钟、5分钟、10分钟)等系统摘要信息。
对应上图就是:当前时间为11:32:22,系统运行了41天、当前有两个用户登录,1分钟平均负载0.18,5分钟平均负载0.11,10分钟平均负载0.14.
Tasks: 显示进程相关的统计信息,包括总进程数、正在运行的进程数、睡眠中的进程、停止的进程、僵死进程数等。
对应上图就是:当前总进程有132个,其中1个正在运行、131个正在睡眠、0个停止的进程、0个僵死进程。
CPU: 显示关于 CPU 使用情况的信息,包括用户态、系统态、空闲态和等待态的 CPU 使用百分比。
对应上图就是:
- us:代表用户的使用率
- sy:代表系统的使用率
- ni:表示高优先级进程占用CPU时间的百分比
- id:表示空闲CPU率
- wa:表示IO等待CPU占用率
- hi:CPU硬件中断率
- si:CPU软件中断率
- st:强制等待占用CPU率
Mem: 显示关于物理内存使用情况的信息,包括总内存(total)、已用内存(used)、空闲内存(free)、缓冲区内存和缓存内存(buff/cache)的使用量。
Swap: 显示关于虚拟内存(交换空间)使用情况的信息,包括总交换空间(total)、已用交换空间(used)和空闲交换(free)空间的使用量。
PID: 显示进程的进程ID。
USER: 显示进程的所有者。
PR: 显示进程的优先级,越小越高。
NI: 显示进程的优先级,负值表示高优先级,正值表示低优先级。
VIRT: 显示进程使用的虚拟内存量,单位KB。
RES: 显示进程占用的物理内存量,单位KB。
SHR: 显示进程使用的共享内存量,单位KB。
S: 显示进程的状态,例如运行中(R)、睡眠中(S)、僵死(Z)、负数优先级(N)、空闲(I)。
%CPU: 显示进程使用 CPU 的百分比。
%MEM: 显示进程使用内存的百分比。
TIME+: 显示进程的累计 CPU 时间,单位10毫秒。
COMMAND:进程的命令或程序文件路径。
常用选项:
-d
或--delay
:指定top
命令刷新的时间间隔,单位为秒,默认为 5 秒。例如:top -d 5
表示每 5 秒更新一次。-n
或--iterations
:指定top
命令运行的迭代次数,到达指定次数后top
命令就会退出。例如:top -n 10
表示top
命令运行 10 次后退出。-p
:显示指定 PID(进程 ID)对应的进程信息。例如:top -p 1234
表示只显示 PID 为 1234 的进程信息。-c
:显示产生进程的完整命令,默认是进程名。-u
或--user
:显示指定用户或用户组的进程信息。例如:top -u username
或top -u usergroup
。-H
:在显示进程信息时显示线程(线程信息)。-b
:以批处理模式运行top
命令,该模式下top
命令将不会在终端中交互式地显示信息,而是直接输出到标准输出中,通常与-n
结合使用以获取固定次数的输出。-i
:不显示任何闲置(idle)或无用(zombie)的进程。-o
:指定默认的排序字段。例如:top -o %MEM
表示以内存使用率为默认排序字段。
top的交互式选项(非-b选项启动),可以用以下交互式命令进行控制:
按键 | 功能 |
---|---|
h键 | 按下h键,会显示帮助画面 |
c键 | 按下c键,会显示产生进程的完整命令,等同于-c选项,再次按下c键,变为默认显示 |
f键 | 按下f键,可以选中需要展示的项目 |
M键 | 按下M键,根据驻留内存大小(RES)排序 |
P键 | 按下P键,根据CPU使用百分比大小进行排序 |
T键 | 按下T键,根据时间/累计时间进行排序 |
E键 | 按下E键,切换顶部内存显示单位 |
e键 | 按下e键,切换进程内存显示单位 |
l键 | 按下l键,切换显示平均负载和启动时间信息 |
i键 | 按下i键,不显示闲置或无用的进程,等同于-i参数,再次按下,会变为默认显示 |
t键 | 按下t键,切换显示cpu状态信息 |
m键 | 按下m键,切换显示内容信息 |
3.10.2 磁盘监控(df命令)
df
命令用于显示文件系统的磁盘空间使用情况,包括磁盘空间总量、已用空间、可用空间和挂载点等信息。下面是 df
命令的一些常用选项及其说明:
无选项:
df
默认情况下,
df
命令会显示系统中所有文件系统的使用情况。它会列出每个文件系统的挂载点、总容量、已用空间、可用空间以及使用率。-h
:df -h
-h
选项用于以人类可读的格式显示磁盘使用情况,以便更容易地理解,例如以 GB 或 MB。-T
:df -T
-T
选项用于显示文件系统的类型。它会在输出中包含一个 “Type” 列,列出每个文件系统的类型,例如 ext4、xfs 等。-i
:df -i
-i
选项用于显示文件系统的 inode 使用情况,而不是磁盘空间使用情况。它会列出每个文件系统的 inode 总数、已用 inode 数量、可用 inode 数量以及 inode 使用率。指定文件系统:
df 目录
如果指定了一个目录路径,则
df
命令将只显示该目录所在的文件系统的使用情况。--total
:df --total
--total
选项用于在输出的最后一行显示所有文件系统的总计信息,包括总容量、已用空间、可用空间等。
3.10.3 磁盘监控(iostat命令)
iostat
命令用于监视系统的磁盘 I/O 使用情况。它提供了关于系统磁盘 I/O 活动的实时报告,包括各个磁盘的读写速率、平均响应时间、I/O 请求队列长度等信息。
安装iostat命令:
yum install -y sysstat
语法:
iostat [选项] [参数1] [参数2]
参数:
间隔时间:每次报告的间隔时间(秒);
次数:显示报告的次数。
选项:
无选项:
默认情况下,
iostat
命令会显示所有磁盘的平均统计信息,包括每个磁盘的读写速率、平均响应时间等。iostat
-x
:-x
选项用于显示扩展统计信息。它会在输出中包含额外的信息,例如每个磁盘的 I/O 请求队列长度、平均 I/O 大小等。iostat -x
限制我要求显示拓展信息,并且每3秒查看一次:
iostat -x 3
可见打印多次,每3秒就会打印一次。
输出信息的含义:
- rrqm/s:每秒这个设备相关的读取请求有多少被 Merge 了(当系统调用需要读取数据的时候,VFS 将请求发到各个 FS,如果 FS 发现不同的读取请求读取的是相同 Block 的数据,FS 会将这个请求合并 Merge);
- wrqm/s:每秒这个设备相关的写入请求有多少被 Merge 了。
- r/s:每秒读取的扇区数;
- w/s:每秒写入的扇区数。
- rKB/s:每秒发送到设备的读取请求数。
- wKB/s:每秒向设备发出的写请求数。
- avgrq-sz 平均请求扇区的大小
- avgqu-sz 是平均请求队列的长度。毫无疑问,队列长度越短越好。
- await: 每一个 IO 请求的处理的平均时间(单位是微秒毫秒)。这里可以理解为 IO 的响应时间,一般地系统 IO 响应时间应该低于 5ms,如果大于 10ms 就比较大了。这个时间包括了队列时间和服务时间,也就是说,一般情况下,await 大于 svctm,它们的差值越小,则说明队列时间越短,反之差值越大,队列时间越长,说明系统出了问题。
- svctm 表示平均每次设备 I/O 操作的服务时间(以毫秒为单位)。如果 svctm 的值与 await 很接近,表示几乎没有 I/O 等待,磁盘性能很好,如果 await 的值远高于 svctm 的值,则表示 I/O 队列等待太长, 系统上运行的应用程序将变慢。
- % util: 在统计时间内所有处理 IO 时间,除以总共统计时间。例如,如果统计间隔 1 秒,该设备有 0.8 秒在处理 IO,而 0.2 秒闲置,那么该设备的 % util = 0.8/1 = 80%,所以该参数暗示了设备的繁忙程度。一般地,如果该参数是 100% 表示设备已经接近满负荷运行了(当然如果是多磁盘,即使 % util 是 100%,因为磁盘的并发能力,所以磁盘使用未必就到了瓶颈)。
-d
:-d
选项用于仅显示磁盘的统计信息,而不包括 CPU 的统计信息。iostat -d
输出信息的含义:
- tps:该设备每秒的传输次数。”一次传输” 意思是 “一次 I/O 请求”。多个逻辑请求可能会被合并为 “一次 I/O 请求”。”一次传输” 请求的大小是未知的。
- kB_read/s:每秒从设备读取的数据量;
- kB_wrtn/s:每秒向设备写入的数据量;
- kB_read:读取的总数据量;
- kB_wrtn:写入的总数量数据量
这些单位都为 Kilobytes。
-t
:-t
选项用于在输出中包含时间戳信息。它会在每一行的开头显示当前时间,以便您了解每个统计数据的时间。iostat -t
-k
或-m
:-k
选项用于以 KB 为单位显示数据,而-m
选项用于以 MB 为单位显示数据。默认情况下,iostat
使用字节为单位。iostat -k
iostat -m
-p
:仅显示块设备和所有被使用的其他分区的状态
iostat -p
-c
:仅显示 CPU 使用情况;
iostat -c
输出信息的含义:
- % user:CPU 处在用户模式下的时间百分比。
- % nice:CPU 处在带 NICE 值的用户模式下的时间百分比。
- % system:CPU 处在系统模式下的时间百分比。
- % iowait:CPU 等待输入输出完成时间的百分比。
- % steal:管理程序维护另一个虚拟处理器时,虚拟 CPU 的无意识等待时间百分比。
- % idle:CPU 空闲时间百分比。
注意:如果 % iowait 的值过高,表示硬盘存在 I/O 瓶颈,% idle 值高,表示 CPU 较空闲,如果 % idle 值高但系统响应慢时,有可能是 CPU 等待分配内存,此时应加大内存容量。% idle 值如果持续低于 10,那么系统的 CPU 处理能力相对较低,表明系统中最需要解决的资源是 CPU。
3.11 环境变量
环境变量是操作系统(Windows、Linux、Mac)在运行的时候,记录的一些关键性信息,用以辅助系统运行。
在Linux系统中执行:env命令即可查看当前系统中记录的环境变量。
环境变量是一种Key-Value
型结构,即名称和值,如下图:
这里面有一些关键的key-value:
PATH:
PATH
是最重要的环境变量之一。它定义了系统在查找命令时应该搜索的目录列表。当用户输入一个命令时,系统会按照PATH
中定义的顺序在这些目录中查找命令的可执行文件。例如:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
就好比我们执行cd命令,我们来看看cd命令存放的目录:
可见cd命令存放在了
/usr/bin/cd
中,但是我们在其他目录也可以执行cd命令,不用专门在/usr/bin/cd
目录来执行,这就是环境变量的作用。当执行任何命令的时候,都会安装PATH中Value的值来搜索命令的本体,从而来执行。
注意:多个目录使用
:
分割。HOME:
HOME
环境变量定义了当前用户的主目录路径。当用户登录时,系统会将用户的工作目录设置为HOME
所指定的路径。例如:/home/username
USER:
USER
环境变量存储了当前登录用户的用户名。例如:username
SHELL:
SHELL
环境变量定义了当前用户使用的默认 Shell。Shell 是用户与操作系统之间进行交互的界面。例如:/bin/bash
LANG 和 LC_XXX:
LANG
和LC_XXX
环境变量用于定义系统的语言环境。LANG
变量定义了系统默认的语言环境,而LC_XXX
变量定义了特定的语言环境,例如日期格式、货币格式等。例如:LANG=en_US.UTF-8 LC_CTYPE="en_US.UTF-8" LC_NUMERIC="en_US.UTF-8"
拓展:
$
符号:在Linux系统中,$
符号被用于取”变量”的值。
获取环境变量中的值可以通过语法:$环境变量名称
来取得。
例如:
echo $PATH
又或者可以使用:
echo ${PATH}ABC
使用花括号将需要取的值包裹起来,表示一个整体,花括号两边的值相当于追加的。但是如果你不使用花括号把变量包裹起来,那么就会把$后面的所有内容当作变量。
您可以通过 export
命令来设置新的环境变量或修改现有的环境变量。修改了之后,使用source
命令重载配置文件,让其生效,或者你重新登陆也是可以的。
临时设置:export 变量名=变量值
查看对应的环境变量:
关闭当前会话,重新开启一个会话查看:
可见没有了。
针对当前用户永久配置:编辑家目录中的bashrc文件,然后使用export 变量名=变量值来设置。
vim ~/.bashrc
重载配置文件并且查看:
你重新登陆之后他也是存在的。
针对所有用户永久配置:编辑/etc/profile文件,然后使用export 变量名=变量值来设置。
vim /etc/profile
编辑方式:export 变量名=变量值
3.12 压缩与解压
市面上有非常多的压缩格式
- zip格式:Linux、Windows、MacOS常用
- 7zip:Windows 系统常用
- rar:Windows系统常用
- tar:Linux、MacOS常用
- gzip:Linux、MacOS常用
在Windows系统中常用的软件如winrar、bandizip等软件,都支持各类常见的压缩格式,这里不多做讨论。
在Linux和Mac系统常用有2中压缩格式,后缀分别是:.tar
、.gz
。
Linux提供了多种压缩和解压缩工具,其中最常用的是tar
、gzip
、bzip2
、zip
等。下面我将详细讲解这些工具的用法:
3.12.1 tar命令(打包工具)
tar
命令在Linux系统中是一个非常常用的工具,用于创建归档文件以及对归档文件进行操作。它可以打包多个文件或目录成一个单一的归档文件,也可以解压缩已有的归档文件。下面详细解释一下 tar
命令的用法:
基本语法:
tar [选项] [归档文件名] [文件或目录...]
常用选项:
-c, --create
:创建压缩文件,处于压缩模式-x, --extract, --get
:解压模式-f, --file <归档文件名>
:指定归档文件的名称,f选项必须式所有选项中位置处于最后一个的。-v, --verbose
:显示压缩、解压过程,用于查看进度。-z, --gzip
:通过gzip压缩或解压缩归档文件-j, --bzip2
:通过bzip2压缩或解压缩归档文件-t, --list
:列出归档文件中的内容-r, --append
:将文件添加到现有的归档文件中-u, --update
:仅添加较新的文件到归档文件中-A, --catenate, --concatenate
:将多个归档文件合并为一个-C
:选中解压的目的地,用于解压模式--delete
:从归档文件中删除文件--wildcards
:使用通配符进行文件匹配
示例用法:
创建压缩文件:
tar -cvf archive.tar file1 file2 directory
-c
:创建新的压缩文件。-v
:显示压缩、解压过程,用于查看进度。-f
:指定压缩文件的名称。
上诉命令表示,将file1、file2以及directory压缩为archive.tar。
解压缩文件:
tar -xvf archive.tar
-x
:提取文件。
默认解压是解压到当前目录,如果你要解压到指定目录,那么你要加上
-C
选项,后面在跟上解压的路径。压缩为gz格式的文件:
tar -zcvf archive.tar.gz file1 file2 directory
-z
:使用gzip进行压缩。
解压gz格式的文件:
这里其实与压缩一个道理,加上选项-z就可以解压gz格式的文件了。
tar -zxvf archive.tar.gz
通过bzip2压缩归档文件:
tar -cvjf archive.tar.bz2 file1 file2 directory
-j
:使用bzip2进行压缩。
查看压缩文件的内容:
tar -tvf archive.tar
这将显示压缩文件中的文件列表。
从压缩文件中删除文件:
tar --delete -f archive.tar file1
这将从归档文件中删除名为
file1
的文件。向现有归档文件添加文件:
tar -rvf archive.tar file3
这将向归档文件
archive.tar
中添加file3
。
注意事项:
- 使用
tar
命令时,顺序很重要。-f
选项必须写在末尾,-c
选项建议写在开头,,-C
选项需单独使用,和解压所需的其他参数分开。- 在创建归档文件时,可以指定多个文件或目录。
tar
命令可以与压缩工具gzip
和bzip2
配合使用,以实现对归档文件的压缩。tar
命令非常强大,但也容易混淆。确保在使用前阅读文档或者使用man tar
命令查看帮助文档。
3.12.2 gzip命令(压缩工具)
gzip
是 Linux 系统中用于压缩文件的命令行工具。它采用 Lempel-Ziv 编码(LZ77)算法进行压缩,并添加 .gz
扩展名来标识压缩文件。下面是关于 gzip
命令的详细解释:
语法:
gzip [选项] [文件名...]
常用选项:
-d, --decompress
:解压缩压缩文件-r, --recursive
:递归地压缩目录下的所有文件-t, --test
:测试压缩文件的完整性-v, --verbose
:显示压缩和解压缩的详细信息-f, --force
:强制执行,覆盖已存在的压缩文件-l, --list
:显示压缩文件的详细信息-n, --no-name
:不保存原始文件名和时间戳-q, --quiet
:不显示警告信息-1, --fast
:使用快速压缩模式-9, --best
:使用最佳(最慢)压缩模式
示例用法:
压缩文件:
gzip filename
这将压缩名为
filename
的文件,并生成一个名为filename.gz
的压缩文件。注意:这样压缩文件并不会将多个文件压缩为一个,而是每一个单独压缩,并且不会保留源文件。
解压缩文件:
gzip -d filename.gz
或者
gunzip filename.gz
这将解压缩名为
filename.gz
的压缩文件,并恢复成原始的filename
文件。测试压缩文件的完整性:
gzip -t filename.gz
这将检查
filename.gz
文件是否完整。递归地压缩目录下的所有文件:
gzip -r directory
这将递归地压缩
directory
目录下的所有文件,并保留原始文件。显示压缩文件的详细信息:
gzip -l filename.gz
这将显示
filename.gz
文件的详细信息,包括压缩比率、压缩前后的文件大小等。
注意事项:
- 在默认情况下,
gzip
命令会删除原始文件。gzip
压缩文件的速度和压缩比可以通过调整-1
到-9
之间的压缩等级选项来控制。-1
表示最快的压缩速度但压缩比最低,-9
表示最慢的压缩速度但压缩比最高。- 通过使用
gunzip
命令可以解压缩.gz
格式的压缩文件。
3.12.3 bzip2命令(压缩工具)
bzip2
是 Linux 系统中用于压缩和解压缩文件的命令行工具,它使用 Burrows-Wheeler 变换和霍夫曼编码进行压缩。下面是关于 bzip2
命令的详细解释:
语法:
bzip2 [选项] [文件名...]
常用选项:
-d, --decompress
:解压缩压缩文件-k, --keep
:保留原始文件-f, --force
:强制执行,覆盖已存在的压缩文件-t, --test
:测试压缩文件的完整性-v, --verbose
:显示压缩和解压缩的详细信息-1
到-9
:指定压缩等级,数字越大,压缩比越高,但速度越慢-c, --stdout
:将压缩结果输出到标准输出,而不是生成压缩文件-z, --compress
:压缩文件(默认行为,可省略)
示例用法:
压缩文件:
bzip2 filename
这将压缩名为
filename
的文件,并生成一个名为filename.bz2
的压缩文件。解压缩文件:
bzip2 -d filename.bz2
或者
bunzip2 filename.bz2
这将解压缩名为
filename.bz2
的压缩文件,并恢复成原始的filename
文件。测试压缩文件的完整性:
bzip2 -t filename.bz2
这将检查
filename.bz2
文件是否完整。保留原始文件:
bzip2
命令没有-k
或--keep
选项来保留原始文件,但你可以在压缩之前使用cp
命令来复制原始文件,然后再进行压缩。指定压缩等级:
bzip2 -9 filename
这将使用最高级别的压缩(最慢但压缩比最高)压缩
filename
文件。将压缩结果输出到标准输出:
bzip2 -c filename > output.bz2
这将压缩
filename
文件并将压缩结果输出到output.bz2
文件中。
注意事项:
- 在默认情况下,
bzip2
命令会删除原始文件。如果需要保留原始文件,可以使用-k选项。-1
到-9
之间的数字用来指定压缩等级,数字越大,压缩比越高,但速度越慢。- 使用
bzip2
压缩文件时,生成的压缩文件会以.bz2
扩展名结尾。
3.12.4 zip命令(压缩工具)
zip
命令是 Linux 系统中用于创建和管理 ZIP 格式归档文件的命令行工具。ZIP 归档文件通常用于将多个文件或目录打包成一个单独的文件,并且可以在不同的操作系统中进行跨平台共享。下面是关于 zip
命令的详细解释:
语法:
zip [选项] <归档文件名> <文件或目录...>
常用选项:
-r, --recurse-paths
:递归地压缩目录及其子目录下的所有文件-q, --quiet
:安静模式,不显示压缩进度信息-v, --verbose
:详细模式,显示压缩过程中的详细信息-m, --move
:压缩完成后,将原始文件移动到垃圾箱(删除原始文件)
示例用法:
创建归档文件:
zip archive.zip file1 file2 directory
这将创建一个名为
archive.zip
的归档文件,包含file1
、file2
文件以及directory
目录。递归地压缩目录及其子目录下的所有文件:
zip -r archive.zip directory
这将递归地压缩
directory
目录及其子目录下的所有文件。压缩过程中显示详细信息:
zip -v archive.zip file1 file2 directory
这将在压缩过程中显示详细信息。
压缩完成后,将原始文件移动到垃圾箱:
zip -m archive.zip file1 file2
这将压缩
file1
和file2
文件到archive.zip
,并将原始文件移动到垃圾箱。
如果你想要解压zip格式文件,你可以使用unzip命令。
语法:
unzip [选项] 参数
常用选项:
- -d:指定要解压的位置,同tar中的-C选项类似。
- 参数:被解压的zip压缩包文件。
注意:使用unzip来解压,会覆盖源文件。