linux学习笔记

这个笔记比较全面的记录了本人学习Linux的过程,内容还是比较系统、全面的。学习参考的文档以及教程来源繁多,但都吸取了其中比较好的精华,并在此基础上有所拓展深入。本次笔记更多还是在于Linux命令使用上的总结,对于日后的运维学习必定有所帮助…

一、概念

Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 UNIX 的多用户、多任务、支持多线程和多 CPU 的操作系统。

目前市面上较知名的发行版有:Ubuntu、RedHat、CentOS、Debian、Fedora、SuSE、OpenSUSE、Arch Linux、SolusOS 等。但大体上分类为RedHat系列和Debian系列。所以本文档主要是使用CentOS并辅助性地掺杂Ubuntu一起进行讲述的。

1. 终端命令格式

Linux 刚面世时并没有图形界面,所有的操作全靠命令完成。对于命令的使用需要注意其格式。

1
command [-options] [parameter]

说明:

  • command:命令名,相应功能的英文单词或单词的缩写

  • [-options]:选项,可用来对命令进行控制,也可以省略

  • parameter:传给命令的参数,可以是 零个一个 或者 多个

  • [] 代表可选

2. 查阅命令的帮助文档信息

可通过在命令后加--help选项或者在命令的前面添加man命令来查看相关命令的帮助文档信息。

2.1 --help

1
2
3
4
#显示command命令的帮助信息
$ command --help
#--help可简写为-h
$ command -h

2.2 man

1
2
#查阅command命令的使用手册
$ man command

manmanual 的缩写,是 Linux 提供的一个 手册,包含了绝大部分的命令、函数的详细使用说明

使用 man 时的操作键:

操作键 功能
空格键 显示手册页的下一屏
Enter 键 一次滚动手册页的一行
b 回滚一屏
f 前滚一屏
q 退出
/word 搜索 word 字符串

💡 提示:

初级阶段只需要 知道 通过以下两种方式可以查询命令的帮助信息

先学习常用命令常用选项的使用即可,工作中如果遇到问题可以借助 网络搜索

二、基础命令

由于Linux命令实在太多,下面先介绍最最常用的通用基本操作命令。后面章节会扩展性地讲述其他命令。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#查看当前文件夹下的内容,list
$ ls

#查看当前所在文件夹,print wrok directory
$ pwd

#切换文件夹,change directory
$ cd [目录名]

#如果文件不存在,新建文件,touch
$ touch [文件名]

#创建目录,make directory
$ mkdir [目录名]

#删除指定的文件名,remove
$ rm [文件名]

#清屏,clear
$ clear

三、关机和重启

1. 关机

shutdown 命令可以 安全 关闭 或者 重新启动系统

1
2
#选项: -r 重新启动
$ shutdown [-r] [时间]

提示:

不指定选项和参数,默认表示 1 分钟之后 关闭电脑

远程维护服务器时,最好不要关闭系统,而应该重新启动系统

常用命令示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#不指定选项和参数,默认表示1分钟之后关闭电脑
$ shutdown

# 重新启动操作系统,其中 now 表示现在
$ shutdown -r now

# 立刻关机,其中 now 表示现在
$ shutdown now

# 系统在今天的 20:25 会关机
$ shutdown 20:25

# 系统再过十分钟后自动关机
$ shutdown +10

# 取消之前指定的关机计划
$ shutdown -c

2. 重启

立即重启系统

1
2
$ reboot
#等效于shutdown -r now

四、操作命令小技巧

在使用终端命令的过程中,一些操作小技巧可以辅助我们更有效率地完成工作。

1. 放大终端窗口的字体显示

ctrl + shift + =

2. 缩小终端窗口的字体显示

ctrl + -

3. 自动补全

在敲出 文件目录命令 的前几个字母之后,按下 tab 键。如果输入的没有歧义,系统会自动补全,如果还存在其他 文件目录命令,再按一下 tab键,系统会提示可能存在的命令。

4. 终端历史命令切换

光标键可以在曾经使用过的命令之间来回切换

5. 退出执行中的命令

如果想要退出选择,并且不想执行当前选中的命令,可以按 ctrl + c

五、文件管理

1. 文件和目录

1.1 单用户操作系统和多用户操作系统

  • 单用户操作系统:指一台计算机在同一时间 只能由一个用户使用,一个用户独自享用系统的全部硬件和软件资源,Windows XP之前的版本都是单用户操作系统
  • 多用户操作系统:指一台计算机在 同一时间可以由多个用户使用 ,多个用户共同享用系统的全部硬件和软件资源,Unix 和 Linux的设计初衷就是多用户操作系统

2 WindowsLinux 文件系统区别

2.1 Windows 下的文件系统

  • Windows 下,打开 “计算机”,我们看到的是一个个的驱动器盘符:

001_Windows下的多个盘

  • 每个驱动器都有自己的根目录结构,这样形成了多个树并列的情形,如图所示:

001-Windows下多个盘为节点的目录分支

2.2 Linux 下的文件系统

  • Linux 下,我们是看不到这些驱动器盘符,我们看到的是文件夹(目录):

002_Ubuntu文件目录

  • Ubuntu 没有盘符这个概念,只有一个根目录 /,所有文件都在它下面

003-Linux的树形示意图

2.3 用户目录

如用户user,则其用户目录位于 /home/user,称之为用户工作目录或家目录,表示方式:

1
2
/home/user
~

2.4 Linux 主要目录速查表

  • /:根目录,在 linux 下有且只有一个根目录,所有的东西都是从这里开始,当在终端里输入 /home,其实是在告诉电脑,先从 /(根目录)开始,再进入到 home 目录。

  • /bin/usr/bin:可执行二进制文件的目录,如常用的命令lstarmvcat等。

  • /boot:放置 linux 系统启动时用到的一些文件,如 linux 的内核文件:/boot/vmlinuz,系统引导管理器:/boot/grub

  • /dev:存放linux系统下的设备文件,访问该目录下某个文件,相当于访问某个设备,常用的是挂载光驱。

  • /etc:系统配置文件存放的目录,不建议在此目录下存放可执行文件,重要的配置文件有:

    /etc/inittab

    /etc/fstab

    /etc/init.d

    /etc/X11

    /etc/sysconfig

    /etc/xinetd.d

  • /home:系统默认的用户主目录,新增用户账号时,用户的主目录都存放在此目录下:

    ~ 表示当前用户的家目录

    ~edu 表示用户 edu 的家目录

  • /lib/usr/lib/usr/local/lib:系统使用的函数库的目录,程序在执行过程中,需要调用一些额外的参数时需要函数库的协助。

  • /lost+fount:系统异常产生错误时,会将一些遗失的片段放置于此目录下。

  • /mnt/media:光盘默认挂载点,通常光盘挂载于 /mnt/cdrom下,但也不一定,可以选择任意位置进行挂载。

  • /opt:给主机额外安装软件所摆放的目录

  • /proc:此目录的数据都在内存中,如系统核心,外部设备,网络状态,由于数据都存放于内存中,所以不占用磁盘空间,比较重要的文件有:

    /proc/cpuinfo

    /proc/interrupts

    /proc/dma

    /proc/ioports

    /proc/net/

  • /root:系统管理员root的主要目录。

  • /sbin/usr/sbin/usr/local/sbin:放置系统管理员使用的可执行命令,如 fdiskshutdownmount等。与/bin 不同的是,这几个目录是给系统管理员 root 使用的命令,一般用户只能"查看"而不能设置和使用。

  • /tmp:一般用户或正在执行的程序临时存放文件的目录,任何人都可以访问,重要数据不可放置在此目录下。

  • /srv:服务启动之后需要访问的数据目录,如 www 服务需要访问的网页数据存放在 /srv/www 内。

  • /usr:应用程序存放目录:

    /usr/bin:存放应用程序

    /usr/share:存放共享数据

    /usr/lib:存放不能直接运行的,却是许多程序运行所必需的一些函数库文件

    /usr/local:存放软件升级包

    /usr/share/doc:系统说明文件存放目录

    /usr/share/man:程序说明文件存放目录

  • /var:放置系统执行过程中经常变化的文件:

    /var/log:随时更改的日志文件

    /var/spool/mail:邮件存放的目录

    /var/run:程序或服务启动后,其 PID 存放在该目录下

3. 列出目录的内容

3.1 ls

ls 是英文单词 list 的简写,其功能为列出目录的内容,是用户最常用的命令之一,类似于 DOS下的 dir 命令

常用选项

参数 含义
-a 显示指定目录下所有子目录与文件,包括隐藏文件
-l 以列表方式显示文件的详细信息
-h 配合 -l 以人性化的方式显示文件大小

ls 通配符的使用

通配符 含义
* 代表任意个数个字符
? 代表任意一个字符,至少 1 个
[] 表示可以匹配字符组中的任一一个
[abc] 匹配 a、b、c 中的任意一个
[a-f] 匹配从 a 到 f 范围内的的任意一个字符

Linux 下文件和目录的特点

  • Linux 文件 或者 目录 名称最长可以有 256 个字符
  • . 开头的文件为隐藏文件,需要用 -a参数才能显示
  • .代表当前目录
  • .. 代表上一级目录

计算机中文件大小的表示方式(科普)

单位 英文 含义
字节 B(Byte) 在计算机中作为一个数字单元,一般为 8 位二进制数
K(Kibibyte) 1 KB = 1024 B,千字节 (1024 = 2 ** 10)
M(Mebibyte) 1 MB = 1024 KB,百万字节
千兆 G(Gigabyte) 1 GB = 1024 MB,十亿字节,千兆字节
T(Terabyte) 1 TB = 1024 GB,万亿字节,太字节
P(Petabyte) 1 PB = 1024 TB,千万亿字节,拍字节
E(Exabyte) 1 EB = 1024 PB,百亿亿字节,艾字节
Z(Zettabyte) 1 ZB = 1024 EB,十万亿亿字节,泽字节
Y(Yottabyte) 1 YB = 1024 ZB,一亿亿亿字节,尧字节

3.2 tree

可以以树状图列出文件目录结构

1
$ tree
选项 含义
-d 只显示目录

4. 切换目录

4.1 cd

  • cd 是英文单词 change directory 的简写,其功能为更改当前的工作目录,也是用户最常用的命令之一

注意:Linux 所有的 目录文件名 都是大小写敏感的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#切换到当前用户的主目录(/home/用户目录)
$ cd

#切换到当前用户的主目录(/home/用户目录)
$ cd ~

#保持在当前目录不变
$ cd .

#切换到上级目录
$ cd ..

#可以在最近两次工作目录之间来回切换
$ cd -

4.2 相对路径和绝对路径

  • 相对路径 在输入路径时,最前面不是 / 或者 ~,表示相对 当前目录 所在的目录位置
  • 绝对路径 在输入路径时,最前面是 / 或者 ~,表示从 根目录/家目录 开始的具体目录位置

5. 创建和删除操作

5.1 touch

创建文件或修改文件时间,如果文件不存在,可以创建一个空白文件,如果文件已经存在,可以修改文件的末次修改日期。

1
2
#创建一个为filename.txt的文件
$ touch filename.txt

5.2 mkdir

创建一个新的目录

1
2
#在当前目录里创建一个名称为demo新的目录
$ mkdir demo
选项 含义
-p 可以递归创建目录

新建目录的名称 不能与当前目录中 已有的目录或文件 同名

5.3 rm

删除文件或目录

1
2
3
4
#强制删除filename.txt文件
$ rm -f filename.txt
#强制删除demo目录以及其内容
$ rm -rf demo
选项 含义
-f 强制删除,忽略不存在的文件,无需提示
-r 递归地删除目录下的内容,删除文件夹 时必须加此参数

使用 rm 命令要小心,因为文件删除后不能恢复

6. 拷贝和移动文件

6.1 cp

cp 命令的功能是将给出的 文件目录 复制到另一个 文件目录 中,相当于 DOS 下的 copy 命令

1
2
#复制文件或者目录,cp对应英文copy
$ cp 源文件 目标文件
选项 含义
-i 覆盖文件前提示
-r 若给出的源文件是目录文件,则 cp 将递归复制该目录下的所有子目录和文件,目标文件必须为一个目录名

6.2 mv

mv 命令可以用来 移动 文件目录,也可以给 文件或目录重命名

1
2
#移动文件或者目录/文件或者目录重命名,mv对应英文move
$ mv 源文件 目标文件
选项 含义
-i 覆盖文件前提示

7. 查看文件内容

7.1 cat 查看文件的所有内容

cat (concatenate)命令可以用来 查看文件内容创建文件文件合并追加文件内容 等功能。

cat 会一次显示所有的内容,适合 查看内容较少 的文本文件。

1
2
#查看hello.txt文件的所有内容
$ cat hello.txt
选项 含义
-b 对非空输出行编号
-n 对输出的所有行编号

Linux 中还有一个 nl 的命令和 cat -b 的效果等价

7.2 more 分屏显示文件内容

more 命令可以用于分屏显示文件内容,每次只显示一页内容

适合于 查看内容较多的文本文件

1
2
#分屏显示hello.txt文件内容
$ more hello.txt

使用 more 的操作键:

操作键 功能
空格键 显示手册页的下一屏
Enter 键 一次滚动手册页的一行
b 回滚一屏
f 前滚一屏
q 退出
/word 搜索 word 字符串

7.3 grep 搜索文本文件内容

Linux 系统中 grep 命令是一种强大的文本搜索工具。

grep允许对文本文件进行 模式查找,所谓模式查找,又被称为正则表达式。

1
2
#显示匹配包含qcmoke字符串的行及行号
$ grep -n qcmoke hello.txt
选项 含义
-n 显示匹配行及行号
-v 显示不包含匹配文本的所有行(相当于求反)
-i 忽略大小写
  • 常用的两种模式查找
参数 含义
^a 行首,搜寻以 a 开头的行
ke$ 行尾,搜寻以 ke 结束的行

7.6 tail 取出文件后面几行

1
2
3
4
5
6
7
8
#取出文件后面10行
$ tail hello.txt

# 默认的情况中,显示最后的十行!若要显示最后的 20 行,就得要这样:
$ tail -n 20 /etc/nginx/nginx.conf

#侦测文件尾部10行
$ tail -n 10 -f ~/logs/web2019-10-10.log
选项 含义
-n 后面接数字,代表显示几行的意思
-f 侦测文件尾部,要等到按下[ctrl]-c才会结束tail的侦测即,如果文件尾部内容被更改,也会随着显示最新尾部内容,常用于查看日志。

8. 查找文件(find)

8.1 find

  • find 命令功能非常强大,通常用来在 特定的目录下 搜索 符合条件的文件
1
2
3
4
5
6
7
8
#搜索主目录下,文件名包含hello的文件
$ find ~ -name "hello*"

#搜索/etc目录下,所有以.conf为扩展名的文件
$ find /etc -name "*.conf"

#搜索/home目录下,以数字1开头的文件
$ find /home ~ -name "1*"
序号 命令 作用
01 find [路径] -name “*.py” 查找指定路径下扩展名是 .py 的文件,包括子目录
  • 如果省略路径,表示在当前文件夹下查找
  • 之前学习的通配符,在使用 find 命令时同样可用

9. 链接(ln)

9.1 软链接

1
2
3
#建立文件的软链接,用通俗的方式讲类似于Windows下的快捷方式。
#删除软链接不会影响源文件,但源文件被删除了,那么软连接就不可以了
$ ln -s 被链接的源文件 链接文件

软链接的特点:

(1)软链接,以路径的形式存在。类似于Windows操作系统中的快捷方式

(2)软链接可以 跨文件系统 ,硬链接不可以

(3)软链接可以对一个不存在的文件名进行链接

(4)软链接可以对目录进行链接

注意:

(1)没有 -s 选项建立的是一个 硬链接文件(对于硬链接文件,两个文件占用相同大小的硬盘空间,工作中几乎不会建立文件的硬链接)

(2)被链接的源文件要使用绝对路径,不能使用相对路径,这样可以方便移动链接文件后,仍然能够正常使用

9.2 硬链接简介

1
2
#删除硬链接,不会影响源文件,同样的删除源文件也不会影响硬链接
$ ln 被链接的源文件 链接文件

软链接的特点:

(1)硬链接,以文件副本的形式存在。但不占用实际空间。

(2)不允许给目录创建硬链接

(3)硬链接只有在同一个文件系统中才能创建

9.3 文件软硬链接的示意图

001_文件软硬链接示意图

提示:

在 Linux 中,文件名文件的数据 是分开存储的

在 Linux 中,只有文件的 硬链接数 == 0 才会被删除

使用 ls -l 可以查看一个文件的硬链接的数量

在日常工作中,几乎不会建立文件的硬链接,知道即可

10. 打包压缩

打包压缩 是日常工作中备份文件的一种方式。

在不同操作系统中,常用的打包压缩方式是不同的:

Windows 常用 rar

Mac 常用 zip

Linux 常用 tar.gz

11. 打包 / 解包

11.1 tar

tar 是 Linux 中最常用的 备份工具,此命令可以 把一系列文件 打包到 一个大文件中,也可以把一个 打包的大文件恢复成一系列文件

  • tar 的命令格式如下:
1
2
3
4
5
# 打包文件(不压缩)
tar -cvf 打包文件.tar 被打包的文件/路径...

# 解包文件
tar -xvf 打包文件.tar
  • tar 选项说明
选项 含义
c 生成档案文件,创建打包文件
x 解开档案文件
v 列出归档解档的详细过程,显示进度
f 指定档案文件名称,f 后面一定是 .tar 文件,所以必须放选项最后

注意:f 选项必须放在最后,其他选项顺序可以随意

12 压缩/解压缩

12.1 gzip

gzip 是linux中常见的压缩/解压工具,最常见的使用对象是*.gz格式的文件。

OPTIONS
-c --stdout --to-stdout 结果写到标准输出,原文件保持不变
-d --decompress --uncompress 解压
-k --keep 压缩或者解压过程中,保留原文件
-r --recursive
-t --test 检查压缩文件的完整性
-v --verbose 显示每个文件的名子和压缩率
-<压缩效率>  压缩效率是一个介于1-9的数值,预设值为"6",指定愈大的数值,压缩效率就会愈高。

  • –best  此参数的效果和指定"-9"参数相同。
  • –fast  此参数的效果和指定"-1"参数相同。

示例1,压缩文件
原文件名为file1.txt,压缩后原文件消失,压缩后文件名为file1.txt.gz

1
2
3
4
5
root@ubuntu:/tmp# ls -l file1.*
-rw-r--r-- 1 root root 12383865 Aug 21 08:08 file1.txt
root@ubuntu:/tmp# gzip file1.txt
root@ubuntu:/tmp# ls -l file1.*
-rw-r--r-- 1 root root 134416 Aug 21 08:08 file1.txt.gz

示例2,解压文件

1
2
3
root@ubuntu:/tmp# gzip -d file1.txt.gz
root@ubuntu:/tmp# ls -lh file1.*
-rw-r--r-- 1 root root 12M Aug 21 08:08 file1.txt

示例3,压缩的时候,显示压缩率

1
2
root@ubuntu:/tmp# gzip -v file1.txt
file1.txt: 98.9% -- replaced with file1.txt.gz

示例4,一条命令压缩多个文件,压缩之后,是各自分开的:

1
2
3
4
5
root@ubuntu:/tmp# gzip file1.txt file2.txt
root@ubuntu:/tmp# ls -l
total 1348
-rw-r--r-- 1 root root 134416 Aug 21 08:08 file1.txt.gz
-rw-r--r-- 1 root root 392 Aug 21 08:15 file2.txt.gz

示例5,压缩过程中,保留原文件

1
2
3
root@ubuntu:/tmp# gzip -k file1.txt
root@ubuntu:/tmp# ls file1.*
file1.txt file1.txt.gz

示例6,压缩到标准输出中
可以连接两个文件

1
2
3
root@ubuntu:/tmp# cat file1.txt file2.txt | gzip > foo.gz
或者
root@ubuntu:/tmp# gzip -c file1.txt file2.txt > foo.gz

12.2 gunzip

解压gz格式文件(不保留压缩文件)

1
2
3
4
5
[root@localhost test]# ls
test1.txt.gz test2.txt.gz
[root@localhost test]# gunzip test1.txt.gz test2.txt.gz
[root@localhost test]# ls
test1.txt test2.txt

12.3 targzip

命令结合可以使用实现文件打包和压缩

  • tar 只负责打包文件,但不压缩
  • gzip 压缩 tar 包后,其扩展名一般用 xxx.tar.gz

Linux 中,最常见的压缩文件格式就是 xxx.tar.gz

  • tar 命令中有一个选项 -z 可以调用 gzip,从而可以方便的实现压缩和解压缩的功能
  • 命令格式如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#压缩文件
gzip test1.txt test2.txt #会生成 test1.txt.gz test2.txt.gz

#压缩tar包
gzip 打包文件名.tar #从tar包变成tar.gz压缩包,这个过程不会保留原来放入tar包

# 打包并压缩文件
tar -zcvf 打包文件名.tar.gz 被压缩的文件/路径... #自动先完成将各个文件打包生成xxx.tar,后压缩生成xxx.tar.gz

# 解压缩并解包
tar -zxvf 打包文件名.tar.gz #自动先完成将xxx.tar.gz解压缩生成xxx.tar,后完成解包生成各个文件

# 解压缩并解包到指定路径
tar -zxvf 打包文件名.tar.gz -C 目标路径
选项 含义
-C 解压缩到指定目录,注意:要解压缩的目录必须存在

12.4 bzip2(two)

  • tarbzip2 命令结合可以使用实现文件 打包和压缩(用法和 gzip 类似)
    • tar 只负责打包文件,但不压缩,
    • bzip2 压缩 tar 打包后的文件,其扩展名一般用 xxx.tar.bz2
  • tar 命令中有一个选项 -j 可以调用 bzip2,从而可以方便的实现压缩和解压缩的功能
  • 命令格式如下:
1
2
3
4
5
# 压缩文件
tar -jcvf 打包文件.tar.bz2 被压缩的文件/路径...

# 解压缩文件
tar -jxvf 打包文件.tar.bz2

12.5 zip/unzip指令

zip压缩文件

案例:压缩 test1.txt test2.txt成test.zip压缩包

1
zip  test.zip  test1.txt test2.txt

zip压缩目录

zip常用选项

-r:递归压缩,即压缩目录

案例:递归压缩test目录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@localhost ~]# tree test/
test/
├── dir
│   └── test3.txt
├── test1.txt
└── test2.txt

1 directory, 3 files
[root@localhost ~]# zip -r test.zip test/
adding: test/ (stored 0%)
adding: test/test1.txt (stored 0%)
adding: test/test2.txt (stored 0%)
adding: test/dir/ (stored 0%)
adding: test/dir/test3.txt (stored 0%)
[root@localhost ~]# ls
anaconda-ks.cfg soft soft.tar.gz test test.zip
[root@localhost ~]#
  • unzip解压文件

    案例:解压缩test.zip文件

    1
    unzip   test.zip

13. 其他

13.1 echo 文字内容

  • echo 会在终端中显示参数指定的文字,通常会和 重定向 联合使用

13.2 重定向 >>>

  • Linux 允许将命令执行结果 重定向到一个 文件
  • 将本应显示在终端上的内容 输出/追加指定文件中

其中

  • > 表示输出,会覆盖文件原有的内容
  • >> 表示追加,会将内容追加到已有文件的末尾

13.3 管道 |

  • Linux 允许将 一个命令的输出 可以通过管道 做为 另一个命令的输入
  • 可以理解现实生活中的管子,管子的一头塞东西进去,另一头取出来,这里 | 的左右分为两端,左端塞东西(写),右端取东西(读)

常用的管道命令有:

  • more:分屏显示内容
  • grep:在命令执行结果的基础上查询指定的文本

六、软件包管理

1 软件包管理简介

1.1 包全名与包名

◆包全名:操作的包是没有安装的软件包时,使用包全名。
◆包名:操作已经安装的软件包时使用的包名。linux安装后包名都存在/var/lib/rpm/中的数据库

1.2 Linux包依赖性

◆树形依赖:a>b>c
◆环形依赖:a>b>c>a
◆模块依赖:模块依赖

软件安装的过程:

1.cp类库到系统目录中

2.cp可执行程序和配置文件到系统目录中

3.根据需要选择性配置和启动服务(程序)

对于windows系统还会多出一个步骤,那就是到把启动配置或者程序依赖的配置放到注册表中。

1.3 linux包命名原则

软件包apache2_2.4.18-2ubuntu3_amd64.deb

apache2 软件包名
2.4.18 软件版本
2 软件发布的次数
ubuntu3 适合的Linux平台
amd64 适合的硬件平台
deb 包扩展名

比如一个文件httpd-2.2.15-15.el6.centos.1.i686.rpm

httpd 软件包名
2.2.15 软件版本
15 软件发布的次数
el6.centos 适合的Linux平台
i686 适合的硬件平台
rpm rpm包扩展名

1.4 linux软件包优先级

Required 该级别软件包是保证系统正常运行所必须的,如果缺失,系统将毁坏 系统工具,比如bash,mount…
Important 若缺少该软件包,系统讲运行困难 实现系统底层功能的一些程序,比如aptitude,apt-get
Standard linux系统的标准件 常规安装软件,如telnet.tp
Optional 该软件包是否安装不影响linux运行 用于用户特定的需求,比如×11,mysql,openofice,自开发软件等
Extra 该级别可能与高级软件包存冲突

2 Debain系列软件包管理

2.1 dpkg本地管理

(1)安装
1
dpkg -i 软件包全名

i install

(2)卸载
1
dpkg -r 软件包名   #移除包不移除配置文件
1
dpkg -P 软件包名 #移除包和配置文件

-r remove

-P等价于 --purg 移除包和配置文件

(3)查询
1
2
3
4
5
dpkg -l  软件包名 #列出当前系统中已经安装的包,包括软件的版本,可以使用dpkg -l | grep 关键字来查询
dpkg -L 软件包名 #列出已安装的包的内容,或者安装位置
dpkg -c 软件包全名 #列出deb包的内容
dpkg -s 软件包名 #查看系统中软件的详细信息 (包含依赖信息)
dpkg --info 软件包全名 #查看未安装的包的信息(包含依赖信息)

2.2 APT在线管理

apt-get install工作步骤

  • 扫描本地软件列表(apt-get update 刷新软件包列表)

  • 软件包依赖检查

  • 从软件包指定的apt源中下载软件包

  • 解压软件包并完成配置

apt-get:用于管理安装,卸载,升级等操作

apt-cache:用于查询软件包信息

(1) APT软件源
1
vim /etc/apt/sources.list

通过apt-get update更新软件源到本地并在本地建立新远程软件库所有软件包对应的索引表(数据库形式),所有存放在/var/lib/apt/lists/*

#####(2) 安装

1
2
apt-get -f install  #修复依赖关系
apt-get install -d #只下载deb包,不安装

apt下载到的软件包(缓存)都放在/var/cache/apt/archives/,如果不需要可以删除掉

(3) 获得源码包
1
sudo apt-get source 软件包名
(4) 更新
1
2
3
apt-get update #更新软件源到本地
apt-get upgrade 软件包名 #升级软件到最新版本
apt-get upgrade #升级系统所有软件到最新版本
(5) 卸载
1
2
apt-get remove 软件包名 #卸载软件包(不含配置文件)
apt-get remove --purge 软件包名 #卸载软件包(含配置文件)
(6)查询
1
2
3
4
5
6
apt-cache search 软件包关键字  #从source里查询某个软件包
apt-cache show 软件包名 #显示软件包信息
apt-cache policy 软件包名 #显示软件包安装状态
apt-get check #检查当前apt的依赖情况
apt-cache depends 软件包名 #查看系统中软件的依赖(正向依赖)
apt-cache rdepends 软件包名 #查看系统中软件的依赖(反向依赖)

3 Redhat系列软件管理

3.1 rpm本地管理

(1) 安装
1
rpm  -ivh  包全名

选项:

-i(install)安装
-v(verbose)显示详细信息
-h(hash)显示进度
-nodeps 不检测依赖性

(2) 升级
1
rpm  -Uvh  包全名(下载好的版本更高的包)

选项:

-U(upgrade)升级

(3) 卸载
1
rpm  -e  包名

选项:

-e(erase)卸载
-nodeps 不检查依赖性

(4) 查询是否安装
1
2
rpm  -q  包名  #查询已经安装的具体包
rpm -qa #查询所有已经安装的包

选项:

-q 查询(query)
-a 所有(all)

(5) 查询软件包详细信息
1
2
3
4
5
rpm  -qi  包名

如:
rpm -qi zip #查看系统中已经安装存在的包信息
rpm -qip zip-3.0-23.fc29.x86_64.rpm #查看未安装包信息

选项:

-q 查询(query)
-i 查询软件信息(information)
-p 查询未安装包信息(package)

(6) 查询包中文件安装位置
1
2
rpm  -ql  包名 #查询已安装的软件安装到了哪些目录里
rpm -qlp 包名 #查询未安装的软件包打算安装到哪些目录里

选项:

-q 查询(query)
-l 列表(list)
-p 查询未安装包信息,用来查看未安装的软件包打算安装到哪些目录里

如果忘记包名,可以通过rpm -qa | grep 包名关键字先查看系统中已经安装的相关软件,然后再执行rpm -ql 包名来查看具体路径

(7)查询系统文件属于哪个RPM包
1
rpm  -qf  系统文件名

选项:
-f 查询系统文件属于哪个软件包(file)

(8) 查询软件包的依赖性
1
2
rpm -qR 包名  #查询已安装包信息
rpm -qRp 包名 #查询未安装包信息

选项:
-R 查询软件包的依赖性(requires)
-p 查询未安装包信息(package)

(9) RPM包校验
1
2
3
4
5
6
7
rpm  -V  已安装的包名

# 例如:修改httpd的配置文件后,查看是否被修改
[root@localhost ~]# vim /etc/httpd/conf/httpd.conf #添加一行
[root@localhost ~]# rpm -V httpd
S.5....T. c /etc/httpd/conf/httpd.conf
[root@localhost ~]#

选项:
-V校验指定RPM包中的文件(verify)

验证内容中的8个信息的具体内容如下:
◆S文件大小是否改变
◆M文件的类型或文件的权限(rwx)是否被改变
◆5文件MD5校验和是否改变(可以看成文件内容是否改变)
◆D设备的中,从代码是否改变
◆L文件路径是否改变
◆U文件的属主(所有者)是否改变
◆G文件的属组是否改变
◆T文件的修改时间是否改变

文件类型
◆c配置文件(config file)
◆d普通文档(documentation)
◆g“鬼”文件(ghostfile),很少见,就是该文件不应该被这个RPM包包含
◆l授权文件(license file)
◆r描述文件(read me)

(10)RPM包中文件提取

主要用来解决误删除系统文件后修补的方法

1
2
#通过rpm2cpio命转换httpd-2.2.15-15.el6.centos.1.i686.rpm为cpio格式后再通过cpio将/usr/sbin/httpd(这是httpd-2.2.15-15.el6.centos.1.i686.rpm要安装到系统中的某个文件)文件提取到当前目录
rpm2cpio 包全名(如httpd-2.2.15-15.el6.centos.1.i686.rpm) | cpio -idv .文件绝对路径(如: ./usr/sbin/httpd)

rpm2cpio是将rpm包转换为cpio格式的命令

cpio是一个标准工具,它用于创建软件档案文件和从档案文件中提取文件

提取到当前目录后没有看到文件的话,可以通过dir命令来显示

案例:

1
2
3
4
5
6
7
8
9
[root@localhost~]#rpm-qf/bin/ls
#查询s命令属于哪个软件包
[root@localhost~-]#mv/bin/ls/tmp/
并造成s命令误删除假象
[root@localhost~]#rpm2cpio/mnt/cdrom/Packages/coreutils-
8.4-19.el6.i686.rpmIcpio-idv./bin/ls
#提取RPM包中s命令到当前目录的bin/ls下
[root@localhost ~]#cp/root/bin/ls/bin/
#把s命令复制/bin/目录,修复文件丢关

3.2 yum在线管理

yum也是用来管理rpm软件包的管理工具。它能够解决软件安装的依赖问题。如果存在依赖,yum会统一一并安装依赖。

(1)网络yum源
1
vim /etc/yum.repos.d/CentOS-Base.repo
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# CentOS-Base.repo
#
# The mirror system uses the connecting IP address of the client and the
# update status of each mirror to pick mirrors that are updated to and
# geographically close to the client. You should use this for CentOS updates
# unless you are manually picking other mirrors.
#
# If the mirrorlist= does not work for you, as a fall back you can try the
# remarked out baseurl= line instead.
#
#

[base]
name=CentOS-$releasever - Base
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

#released updates
[updates]
name=CentOS-$releasever - Updates
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/updates/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

#additional packages that may be useful
[extras]
name=CentOS-$releasever - Extras
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=extras&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/extras/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

#additional packages that extend functionality of existing packages
[centosplus]
name=CentOS-$releasever - Plus
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=centosplus&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/centosplus/$basearch/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

[base] 容器名称,一定要放在[ ]中,从以上文件可以看出centos7默认配置有4个容器,一般是第一个起作用
name 容器说明,可以自己随便写
mirrorlist 镜像站点,这个可以注释掉
baseurl 我们的yum源服务器的地址。默认是CentOS官方的yum源服务器,是可以使用的,如果你觉得慢可以改成你喜欢的yum源地址
enabled 此容器是否生效,如果不写或写成enable=1都是生效,写成enable=0就是不生效
gpgcheck 如果是1是指RPM的数字证书生效,如果是0则不生效
gpgkey 数字证书的公钥文件保存位置。不用修改

centos7 修改yum源为阿里源

1.安装base reop源

1
cd /etc/yum.repos.d

接着备份旧的配置文件

1
mv CentOS-Base.repo CentOS-Base.repo.bak

下载阿里源的文件

1
wget -O CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

2 安装epel repo源:

1
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

3.清理缓存

1
yum clean all

4.重新生成缓存

1
yum makecache
(2))查询
1
2
yum list  #查询所有可用软件包列表
yum search 关键字 #搜索服务器上所有和关键字相关的包
(3)安装
1
yum  -y  install  包名

选项:

install 安装
-y 自动回答yes

(4)升级
1
yum  -y  update  包名

选项:

update 升级
-y 自动回答yes

不带包名的update,即yum -y update会默认升级所有系统软件,包括系统内核,慎重使用不带包名的update。

(5) 卸载
1
yum  -y  remove  包名

选项:

remove 卸载
-y 自动回答yes

(6) 列出所有可用的软件组列表
1
yum grouplist
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
[root@VM_0_13_centos ~]# yum grouplist
Loaded plugins: fastestmirror, langpacks
Repository epel is listed more than once in the configuration
Loading mirror speeds from cached hostfile
Available Environment Groups:
Minimal Install
Compute Node
Infrastructure Server
File and Print Server
Cinnamon Desktop
MATE Desktop
Basic Web Server
Virtualization Host
Server with GUI
GNOME Desktop
KDE Plasma Workspaces
Development and Creative Workstation
Installed Groups:
Development tools
Available Groups:
Backup Client
Base
Cinnamon
Compatibility Libraries
Console internet tools
E-mail server
Educational Software
Electronic Lab
Fedora Packager
Fonts
General Purpose Desktop
Graphical Administration Tools
Graphics Creation Tools
Hardware monitoring utilities
Haskell
Input Methods
Internet Applications
KDE Desktop
Legacy UNIX Compatibility
MATE
Milkymist
Network Infrastructure Server
Networking Tools
Office Suite and Productivity
Performance Tools
Scientific support
Security Tools
Smart card support
System Management
System administration tools
Technical Writing
TurboGears application framework
Web Server
Web Servlet Engine
Xfce
Done
[root@VM_0_13_centos ~]#
(7) 安装指定软件组

组名可以由grouplist查询出来

1
2
3
yum  groupinstall  软件组名
如:
yum groupinstall "Development tools"
(8) 卸载指定软件组
1
yum  groupremove  软件组名

4 源码包安装卸载(待续···)

5 设置环境变量及生效方法

方法一:

/etc/profile文件中添加变量**【对所有用户生效(永久的)】**

用VI在文件/etc/profile文件中增加变量,该变量将会对Linux下所有用户有效,并且是“永久的”。

要让刚才的修改马上生效,需要执行以下代码

1
vim /etc/profile
1
2
3
4
5
6
#在文件最后加入如下代码
export PATH=$PATH:newpath
如:
export JAVA_HOME=/usr/local/java/jdk1.8.0_171
export PATH=${JAVA_HOME}/bin:$PATH
export CLASSPATH=.:${JAVA_HOME}/lib/dt.jar:$JAVA_HOME/lib/tools.jar
1
source /etc/profile   #使配置文件生效

方法二:

在用户目录下的.bash_profile文件中增加变量**【对单一用户生效(永久的)】**

用VI在用户目录下的.bash_profile文件中增加变量,改变量仅会对当前用户有效,并且是“永久的”。

要让刚才的修改马上生效,需要在用户目录下执行以下代码

1
vim ~/.bash_profile
1
2
3
4
5
6
#在文件最后加入如下代码
export PATH=$PATH:newpath
如:
export JAVA_HOME=/usr/local/java/jdk1.8.0_171
export PATH=${JAVA_HOME}/bin:$PATH
export CLASSPATH=.:${JAVA_HOME}/lib/dt.jar:$JAVA_HOME/lib/tools.jar
1
source ~/.bash_profile  #使配置文件生效

方法三:

直接运行export命令定义变量**【只对当前shell(BASH)有效(临时的)】**

在shell的命令行下直接使用[export变量名=变量值]定义变量,该变量只在当前的shell(BASH)或其子shell(BASH)下是有效的,shell关闭了,变量也就失效了,再打开新shell时就没有这个变量,需要使用的话还需要重新定义。

例如:export PATH=/usr/local/webserver/php/bin:$PATH

七、用户管理

1. 基本概念

在 Linux 系统中,不论是本机或是远程登录系统,每个系统都必须拥有至少一个用户。用户是 Linux 系统工作中重要的一环,用户管理包括用户与组管理。为了方便用户管理,Linux有组的概念,组的意义在实际应用中,可以预先针对组设置好权限,然后将不同的用户添加到对应的组中,从而不用依次为每一个用户设置权限。

001_组示意图

2. 超级用户

Linux 系统中的 root 账号通常 用于系统的维护和管理,对操作系统的所有资源 具有所有访问权限,在大多数版本的 Linux 中,都不推荐 直接使用 root 账号登录系统,在 Linux 安装的过程中,系统会自动创建一个用户账号,而这个默认的用户就称为**“标准用户”**。

susubstitute user 的缩写,表示 使用另一个用户的身份

sudo 命令用来以其他身份来执行命令,预设的身份为 root

用户使用 sudo 时,必须先输入密码,之后有 5 分钟的有效期限,超过期限则必须重新输入密码

3. 用户组管理

1
2
3
4
5
6
7
8
9
10
11
#添加组
$ groupadd 组名

#删除组
$ groupdel 组名

#查看组信息
$ cat /etc/group

#递归修改文件/目录的所属组
$ chgrp -R 组名 文件/目录名

提示:用户组信息保存在 /etc/group 文件中。

在实际应用中,可以预先针对组设置好权限,然后将不同的用户添加到对应的组中,从而不用依次为每一个用户设置权限。

4. 用户管理

4.1 创建用户

1
2
#添加新用户,-m 自动建立用户家目录-g 指定用户所在的组,否则会建立一个和同名的组
$ useradd -m -g 组 新建用户名

注意添加用户命令在redhat类系统和debain类系统之间的区别。

在redhat下useradd与adduser是没有区别的,两个命令等价,在home下自动创建目录,没有设置密码,需要使用passwd命令修改密码。

在debain中,useraddadduser有所不同,useradd 是添加用户底层的命令,而adduser 是上层的命令

(1)useradd在使用该命令创建用户是不会在/home下自动创建与用户名同名的用户主目录的,如果一定使用这个命令也无碍,可以加-m选项添加用户主目录。另外useradd默认选择的shell版本是sh而不是通常用的bash(可以在创建用户后使用chsh命令修改或者修改/etc/passwd中该用户的shell版本,选项:-s /bin/bash 指定shell版本为bash-g指定用户组),此外useradd默认没有设置密码,所以创建的用户是不能登录的,另需要在创建用户后使用passwd命令修改密码。

(2)adduser在使用该命令创建用户是会在/home下自动创建与用户名同名的用户目录,系统shell版本,会在创建时会提示输入密码,更加友好。

4.2 设置密码

1
2
#设置用户密码,如果是普通用户,直接用 passwd 可以修改自己的账户密码
$ passwd 用户名

4.3 查看新增的用户信息

1
2
#新建用户后,用户信息会保存在 /etc/passwd 文件中
$ cat /etc/passwd | grep 用户名

提示:/etc/passwd 是用于保存用户信息的文件;而/usr/bin/passwd 是用于修改用户密码的程序。

/etc/passwd 文件存放的是用户的信息,由 6 个分号组成的 7 个信息,分别是

用户名

密码(x,表示加密的密码)

UID(用户标识)

GID(组标识)

用户全名或本地帐号

家目录

登录使用的 Shell,就是登录之后,使用的终端命令,ubuntu 默认是 dash

4.4 删除用户

1
2
#删除用户,-r 选项会自动删除用户家目录
$ userdel -r 用户名

4.5 查看系统用户信息

1
2
3
4
5
6
7
8
#查看用户 UID 和 GID 信息,默认当前用户
$ id [用户名]

#查看当前所有登录的用户列表
$ who

#查看当前登录用户的账户名
$ whoami

4.6 修改用户组和登录的Shell

usermod命令可以用来设置 用户的主组、附加组和登录的Shell,命令格式如下:

1
2
3
4
5
6
7
8
# 修改用户的主组,通常在新建用户时指定,在/etc/passwd的第4列GID对应的组
$ usermod -g 组 用户名

# 修改用户的附加组,在/etc/group中最后一列表示该组的用户列表,用于指定用户的附加权限
$ usermod -G 组 用户名

# 修改用户登录 Shell
$ usermod -s /bin/bash 用户名

提示:设置了用户的附加组之后,需要重新登录才能生效!

4.7 普通用户添加sudo组权限

注意:默认使用 useradd 添加的用户是没有权限使用 sudoroot 身份执行命令的。对于ubuntu可以使用以下命令快速将用户添加到 sudo 附加组中

1
$ usermod -G sudo 用户名

这个命令在centos7中不适用

下面是所有linux系统通用的方法,可以使用修改/etc/sudoers配置文件来实现。

1
2
3
4
5
$ su root

#sudoers文件默认是只读的,可以在修改文件之前先赋予文件写权限(W),修改保存之后再收回写权限
$ chmod u+w /etc/sudoers
$ vim /etc/sudoers

root ALL=(ALL) ALL这一行下面,加入一行: 用户名 ALL=(ALL) ALL

1
2
  root    ALL=(ALL)       ALL
+ qcmoke ALL=(ALL) ALL
1
2
#收回写权限
$ chmod u-w /etc/sudoers

4.8 切换用户

序号 命令 作用 说明
01 su - 用户名 切换用户,并且切换目录 - 可以切换到用户家目录,否则保持位置不变
02 exit 退出当前登录账户
  • su 不接用户名,可以切换到 root,但是不推荐使用,因为不安全
  • exit 示意图如下:

003_su和exit示意图

5. 系统用户维护

5.1 查看最近系统登录信息

1
$ lastlog

案例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
[root@VM_0_6_centos ~]# lastlog
Username Port From Latest
root pts/0 163.125.117.95 Fri Feb 28 10:50:44 +0800 2020
bin **Never logged in**
daemon **Never logged in**
adm **Never logged in**
lp **Never logged in**
sync **Never logged in**
shutdown **Never logged in**
halt **Never logged in**
mail **Never logged in**
operator **Never logged in**
games **Never logged in**
ftp **Never logged in**
nobody **Never logged in**
systemd-network **Never logged in**
dbus **Never logged in**
polkitd **Never logged in**
libstoragemgmt **Never logged in**
rpc **Never logged in**
ntp **Never logged in**
abrt **Never logged in**
sshd **Never logged in**
postfix **Never logged in**
chrony **Never logged in**
tcpdump **Never logged in**
syslog **Never logged in**

5.2 列出当前和曾经登入系统的用户信息

1
$ last

案例:

1
2
3
4
5
6
7
8
9
10
11
[root@VM_0_6_centos ~]# last
root pts/0 163.125.117.95 Fri Feb 28 10:50 still logged in
root pts/1 163.125.117.95 Fri Feb 28 10:49 - 10:51 (00:01)
root pts/0 163.125.117.95 Fri Feb 28 10:49 - 10:50 (00:00)
root pts/0 163.125.117.95 Fri Feb 28 10:49 - 10:49 (00:00)
root pts/2 163.125.117.95 Fri Feb 28 10:47 - 10:47 (00:00)
root pts/1 163.125.117.159 Fri Feb 28 10:44 - 10:49 (00:04)
root pts/1 163.125.116.76 Fri Feb 28 10:42 - 10:42 (00:00)
root pts/0 27.38.177.218 Fri Feb 28 01:24 - 10:48 (09:24)

wtmp begins Fri Feb 28 01:23:48 2020

5.3 踢出登录用户

1
2
3
4
5
#选择登录终端并强制踢出,例如选择踢出使用终端pts/1登录的用户。
#方法一:
$ pkill -kill -t pts/1
#方法二:
$ fuser -k /dev/pts/1

案例

1
2
3
4
5
6
7
#先列举当前登录的系统用户
[root@VM_0_6_centos ~]# who
root pts/0 2020-02-28 10:50 (163.125.117.95)
root pts/1 2020-02-28 10:49 (163.125.117.95)
#选择登录终端并强制踢出,可以给他发送后再踢出
[root@VM_0_6_centos ~]# echo "你被管理员踢出了" > /dev/pts/1 && fuser -k /dev/pts/1
/dev/pts/1: 23381

八、文件权限管理

在 Linux 系统中,不同的用户对于不同的系统资源拥有不同的使用权限。在 Linux 中,可以指定每一个用户针对不同的文件或者目录的不同权限。文件(目录)的权限包括如下:

序号 权限 英文 缩写 数字代号
01 read r 4
02 write w 2
03 执行 excute x 1

1. 文件的详细信息

1
2
#查看文件夹下文件的详细信息(目录也是一种文件)
$ ls -l

打印结果从左到右依次是:

  • 权限,第 1 个字符如果是 d 表示目录

  • 硬链接数,通俗地讲,就是有多少种方式,可以访问到当前目录/文件

  • 拥有者,家目录下 文件/目录 的拥有者通常都是当前用户

  • ,在 Linux 中,很多时候,会出现组名和用户名相同的情况,后续会讲

  • 大小

  • 最后修改时间

  • 名称

15418513400061541851399509

002_权限示意图

2. 修改文件权限

1
2
3
4
5
6
7
8
# 修改文件|目录的拥有者
chown 用户名 文件名|目录名

# 递归修改文件|目录的组
chgrp -R 组名 文件名|目录名

# 递归修改文件权限
chmod -R 755 文件名|目录名

chmod 在设置权限时,可以简单地使用三个数字分别对应 拥有者其他 用户的权限

1
2
# 直接修改文件|目录的 读|写|执行 权限,但是不能精确到 拥有者|组|其他
chmod +/-rwx 文件名|目录名

004_文件权限示意图

常见数字组合有(u表示用户/g表示组/o表示其他):

777 ===> u=rwx,g=rwx,o=rwx

755 ===> u=rwx,g=rx,o=rx

644 ===> u=rw,g=r,o=r

3. 文件属性模式

3.1 lsattr

lsattr 命令用于显示文件的属性,使用方式如下

1
2
3
4
# 查看file.sh 文件的属性
$ lsattr file.sh
# 查看当前目录下所有文件以及文件夹的属性
$ lsattr

详细说明请参考:

📚https://www.runoob.com/linux/linux-comm-lsattr.html

3.2 chattr

chattr 用于修改文件属性。

语法

1
chattr [-RV][-v<版本编号>][+/-/=<属性>][文件或目录...]

选项

-R 递归处理,将指定目录下的所有文件及子目录一并处理。

-v<版本编号> 设置文件或目录版本。

-V 显示指令执行过程。

+<属性> 开启文件或目录的该项属性。

-<属性> 关闭文件或目录的该项属性。

=<属性> 指定文件或目录的该项属性。

这项指令可改变存放在ext2文件系统上的文件或目录属性,这些属性共有以下几种模式:

a:让文件或目录仅供附加用途。

b:不更新文件或目录的最后存取时间。

c:将文件或目录压缩后存放。

d:将文件或目录排除在倾倒操作之外。

i:不得任意更动文件或目录。

s:保密性删除文件或目录。

S:即时更新文件或目录。

u:预防意外删除。

该命令请切换至 root 用户下使用。

1
2
3
4
5
6
7
8
# 为 file.sh 文件增加 i 标识
$ chattr +i file.sh
# 为 file.sh 文件去除 i 标识
$ chattr -i file.sh
# 为 file.sh 增加 i, a 两个标识
$ chattr +ia file.sh
# 为 file.sh 文件移除 i, a 两个标识
$ chattr -ia file.sh

详细说明请参考:

📚https://baike.baidu.com/item/chattr/9841067?fr=aladdin

📚https://www.runoob.com/linux/linux-comm-chattr.html

3.3 文件属性模式相关问题

Linux 文件/文件夹无法删除问题解决方案

服务器黑客攻击后,如果他们对某些文件(例如病毒文件)的属性模式进行修改,导致我们无法轻易删除这些文件,同时采用 root 用户也可能无法使用rm命令删除,那么这就会带来巨大的隐患问题。

案例:

假设黑客使用如下命令对文件的属性模式进行了修改。

1
$ chattr +ia file.sh

那么使用如下rm命令是没有权限删除的。即使是 root 用户也无法删除。

1
$ rm -rf file.sh

这种情况就涉及到chattr命令相关的文件属性模式了。

由上文中得知当文件设置 i 和 a 任意一个属性我们就无法对文件进行删除操作,那么只要我们移除掉 i, a 属性,然后执行rm命令删除就可以了。

1
2
3
4
5
6
# 移除 i, a 属性
$ chattr -ia file.sh
# 查看是否移除成功
$ lsattr file.sh
# 删除文件
$ rm -rf file.sh

如果文件还未删除成功,则我们需要考虑文件所属的文件夹是否设置了 i 或 a 属性(这一点确实很难发现)

1
2
3
4
5
# 退回上一级
$ cd ..
# 直接使用 lsattr 命令,这样可以列出当前文件夹下所有文件和文件夹的属性
# 不要使用 lsattr 文件夹 这样的语法,这样是列出该文件夹下的文件的属性
$ lsattr

如果文件夹被设置则对文件夹的属性执行移除操作,然后再删除文件夹里面的文件

九、进程管理

所谓 进程,通俗地说就是当前正在执行的一个程序。

1. 查看当前进程的详细状况

1
2
3
4
5
6
7
8
9
10
11
12
#process status
#-a或者-e:显示终端上的所有进程,包括其他用户的进程;-u:显示进程的详细状态;-x:显示没有控制终端的进程;-f:显示程序间的关系
$ ps -aux
$ ps -ef

#根据进程号查看进程的文件路径、启动命令的完整路径等等信息(比如nginx)
$ ps -ef | grep nginx
$ ls -l /proc/10383
#有几个主要的文件我们可以关注下:
#cwd:文件所在目录
#exe:执行命令的完整路径
#environ:执行命令时的环境变量

提示:ps 默认只会显示当前用户通过终端启动的应用程序。

2. 动态显示运行中的进程并且排序

1
2
#要退出可以直接输入q
$ top

3. 终止指定代号的进程

1
2
#-9表示强行终止
$ kill [-9] 进程代号

提示:使用 kill 命令时,最好只终止由当前用户开启的进程,而不要终止 root 身份开启的进程,否则可能导致系统崩溃。

4. 查看执行命令所在位置

1
2
3
4
5
$ which ls
/bin/ls

$ which useradd
/usr/sbin/useradd

Linux 中,绝大多数可执行文件都是保存在 /bin/sbin/usr/bin/usr/sbin

/binbinary)是二进制执行文件目录,主要用于具体应用

/sbinsystem binary)是系统管理员专用的二进制代码存放目录,主要用于系统管理

/usr/binuser commands for applications)后期安装的一些软件

/usr/sbinsuper user commands for applications)超级用户的一些管理程序

提示:cd 这个终端命令是内置在系统内核中的,没有独立的文件,因此用 which 无法找到 cd 命令的位置

十、网络管理

1. ifconfig

ifconfig 可以查看当前的网卡配置信息

1
2
3
4
5
# 查看网卡配置信息
$ ifconfig

# 查看网卡对应的 IP 地址
$ ifconfig | grep inet

提示:一台计算机中有可能会有一个 物理网卡多个虚拟网卡,在 Linux 中物理网卡的名字通常以 ensXX 表示

网卡是一个专门负责网络通讯的硬件设备。IP 地址是设置在网卡上的地址信息。每台联网的电脑上都有 P 地址,是保证电脑之间正常通讯的重要设置。

我们可以把 电脑 比作 电话网卡 相当于 SIM 卡IP 地址 相当于 电话号码

注意:每台电脑的 IP 地址不能相同,否则会出现 IP 地址冲突,并且没有办法正常通讯

127.0.0.1 被称为 本地回环/环回地址,一般用来测试本机网卡是否正常

2. ping

ping 一般用于检测当前计算机到目标计算机之间的网络 是否通畅time数值越大,速度越慢

1
2
3
4
5
6
7
# 检测到目标主机是否连接正常
$ ping IP地址

# 检测本地网卡工作正常
$ ping 127.0.0.1
##或者
$ ping localhost

ping 的工作原理与潜水艇的声纳相似,ping 这个命令就是取自 声纳的声音

网络管理员之间也常将 ping 用作动词 —— ping 一下计算机X,看他是否开着

原理:网络上的机器都有 唯一确定的 IP 地址,我们给目标 IP 地址发送一个数据包,对方就要返回一个数据包,根据返回的数据包以及时间,我们可以确定目标主机的存在

提示:在 Linux 中,想要终止一个终端程序的执行,绝大多数都可以使用 CTRL + C

3. 配置ip

以vmware centos7最小安装为例,假设已经设置自动配置网络ip的情况下,系统的ip是由物理主机动态分配ip的,有可能这个ip会发生变化。如果希望配置固定的ip的话可以通过下面的方式解决:

(1)配置物理主机的VMnet8网卡

image-20220504025859144

(2)然后需要修改vmware虚拟网络配置

1548175001833

image-20220504030250858

记住这个网关ip,后面用到。

(3)设置vmware对centos系统虚拟机系统设置的网络连接方式为NAT连接。

image-20200423025556615

(3)进入centos虚拟机终端,编辑centos网卡配置文件,该配置文件名称就是"ifcfg-"+“网卡的名称”,对于不同系统网卡的名称可能不一样,可以通过ifconfig命令来查看网卡名称,比如下面的显示出来的网卡名称是eno16777736,那么网卡配置文件是ifcfg-eno16777736。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@localhost ~]# ifconfig
eno16777736: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.60.112 netmask 255.255.255.0 broadcast 192.168.60.255
inet6 fe80::20c:29ff:fe09:6067 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:09:60:67 txqueuelen 1000 (Ethernet)
RX packets 256 bytes 39985 (39.0 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 151 bytes 19628 (19.1 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 0 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

然后编辑网卡配置文件

1
$ vim /etc/sysconfig/network-scripts/ifcfg-eno16777736

修改为以下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
HWADDR="00:0C:29:34:1D:18"
TYPE="Ethernet"
BOOTPROTO="static"
-BOOTPROTO="dhcp"
+BOOTPROTO="static"
DEFROUTE="yes"
PEERDNS="yes"
PEERROUTES="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_PEERDNS="yes"
IPV6_PEERROUTES="yes"
IPV6_FAILURE_FATAL="no"
NAME="eno16777736"
UUID="bb3cca29-96a9-4b9a-b25b-bff97eb805e2"
-ONBOOT="no"
+ONBOOT="yes"
+IPADDR="192.168.60.100"
+GATEWAY="192.168.60.2"
+NETMASK="255.255.255.0"
+DNS1="8.8.8.8"

💡 提示:网卡配置文件里的变量可能不同系统的也不同。但是以上修改的部分是必须的。

📚 主要变量说明:

  • HWADDR:表示mac地址
  • TYPE:网络类型
  • BOOTPROTO:表示为网卡配置静态还是动态IP地址(none:表示无须启动协议;bootp:表示使用BOOTP协议;dhcp :使用dhcp协议动态获取ip地址; static:表示手工设置静态IP地址)
  • ONBOOT:表示启动系统时是否激活网卡,yes为激活,no不激活(如果默认为no需要改成yes)
  • HWADDR:表示网卡的MAC地址
  • GATEWAY:表示该网关地址。填虚拟虚拟机网卡VMnet8对应的网关ip。
  • NETMASK:表示子网掩码。填填和VMnet8对于的子网掩码
  • IPADDR:表示网卡的固定IP地址。比如上面的网关是192.168.60.2并且子网掩码是255.255.255.0,那么表示固定ip的值需要是192.168.60.x(这个x是除了网关外3~254的任意数填,其中0表示网络,255一般用来做掩码,而1和2已经被VMnet8使用,所以0、1、2和255不用)
  • DNS1:表示第一个DNS服务器的地址。值可以是任意能使用的dns ip地址(用于解析域名)。这里使用google通过的dns ip8.8.8.8即可

(4)重启网络就OK了

1
2
3
4
$ service network restart

#如果上面命令重启ip没变,可以尝试重启系统试试
$ reboot

1、执行后如果报如下错误:
Restarting network (via systemctl): Job for network.service failed because the control process exited with error code. See “systemctl status network.service” and “journalctl -xe” for details.

💁‍♂ 出现上面错误的大概率是mac地址和vmware配置的不一致。如下一定要一致:

image-20220504023438615

4. 防火墙设置

(1)查看firewall服务状态

1
$ systemctl status firewalld

(2)查看firewall的状态

1
$ firewall-cmd --state

(3)开启、重启、关闭、firewalld.service服务

1
2
3
4
5
6
# 开启
$ service firewalld start
# 重启
$ service firewalld restart
# 关闭
$ service firewalld stop

(4)查看防火墙规则

1
$ firewall-cmd --list-all

(5)查询、开放、关闭端口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 查询端口是否开放
$ firewall-cmd --query-port=8080/tcp
# 开放80端口
$ firewall-cmd --permanent --add-port=80/tcp
# 移除端口
$ firewall-cmd --permanent --remove-port=8080/tcp

#添加防火墙端口区间
$ firewall-cmd --zone=public --add-port=4400-4600/tcp --permanent
$ firewall-cmd --zone=public --add-port=4400-4600/udp --permanent

#删除防火墙端口区间
$ firewall-cmd --zone=public --remove-port=4400-4600/tcp --permanent
$ firewall-cmd --zone=public --remove-port=4400-4600/udp --permanent

#重新加载配置
$ firewall-cmd --reload
  • 参数解释

(1)firwall-cmd:是Linux提供的操作firewall的一个工具;
(2)–permanent:表示设置为持久;
(3)–add-port:标识添加的端口;

5. 网络监控netstat

般用于检验本机各端口的网络连接情况

1
2
3
4
netstat      #命令用于显示各种网络相关信息,如网络连接, 路由表, 接口状态等等
netstat -lt #列出所有处于监听状态的tcp端口
netstat -tunlp #查看所有的端口(tcp,udp和的port)信息, 包括 PID 和进程名称
netstat -tunlp|grep 端口号 #用于查看指定端口号的进程情况

十一、远程操作

1. 网络基础

域名:由一串“”用点分隔“”的名字组成,例如:www.baidu.com;是IP 地址的别名,方便用户记忆。

IP地址:IP 地址是网络中计算机的唯一网络标识。

端口号:是某台计算机上运行的应用程序的唯一网络标识。常见服务端口号列表:

序号 服务 端口号
01 SSH 服务器 22
02 Web 服务器 80
03 HTTPS 443
04 FTP 服务器 21

windows系统可以打开cmd输入以下命令检测网络互连的其他主机的端口号是否放行。

1
$ telnet ip 端口

提示:有关 端口号的详细内容,待续补充······

ssh协议: SSH是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。特点:利用SSH协议可以有效防止远程管理过程中的信息泄露;通过SSH 协议可以对所有传输的数据进行加密,也能够防止 DNS 欺骗和 IP 欺骗;此外它还具有一个优点,就是是传输的数据可以是经过压缩的,所以可以加快传输的速度。

001_SSH示意图

要搭建ssh环境,需要分别安装服务端和客户端程序。SSH服务端是安装在服务器中提供ssh协议远程操控的服务软件。只有ssh服务端运行了才能通过ssh客户端连接服务器。

2. 远程登录

序号 命令 对应英文 作用
01 ssh 用户名@ip secure shell 关机/重新启动
02 scp 用户名@ip:文件名或路径 用户名@ip:文件名或路径 secure copy 远程复制文件

2.1 ssh服务端安装

以ubuntu操作系统作为服务端为例:

1
2
3
4
5
6
7
8
9
10
11
#关闭防火墙或者放行ssh默认的22端口(关闭防火墙不同linux发行版可能不同)
$ sudo ufw disable

#安装openssh-server
$ sudo apt-get install openssh-server

#编辑sshd_config配置文件,找到PermitRootLogin并将其值修改为yes,表示允许root管理员登录系统。将PasswordAuthentication的值改为yes表示使用帐号密码方式登录系统。
$ sudo vim /etc/ssh/sshd_config

#重启ssh服务以生效
$/etc/init.d/ssh restart

2.2 ssh客户端使用

SSH 客户端是一种使用SSH协议连接到远程计算机的软件程序,通过SSH 客户端我们可以连接到运行了 SSH 服务器的远程机器上。

1
2
#默认系统已经安装,如果没有可通过命令来安装
$ sudo apt-get install openssh-client

(1) Linux下SSH 客户端的简单使用

1
2
3
4
5
##ssh远程连接服务器
#user是在远程机器上的用户名,如果不指定的话默认为当前用户
#remote是远程机器的地址,可以是IP或者域名
#port是SSH Serve监听的端口,如果不指定,就为默认值22
$ ssh [-p port] user@remote

注意:如果在 Windows 系统中,可以安装 PuTTY 或者 XShell 客户端软件即可。

提示:使用 exit 退出当前用户的登录

(2) Windows 下 SSH 客户端的安装

2.3 ssh免密码登录

实现方式:使用公钥认证进行登录。

原理:使用非对称加密原理进行登录认证。首先由ssh客户端生成密钥对,然后用户将公钥添加到服务端的某认证配置文件里。当用户登陆时,会通过私钥对请求数据进行签名,并将已经签名的数据发送给ssh服务端,ssh服务端会去认证配置文件拿到公钥并进行验签,如果验签成功则允许登入,否则拒绝。由于私钥只有保存在用户自己的客户端中,因此入侵者就算得到用户公钥,也不能登陆到服务器。

非对称加密算法:

使用 公钥 加密的数据,只能使用 私钥 解密

使用 私钥 加密的数据,只能使用 公钥 解密

实现步骤

①SSH客户端生成密钥对

1
2
# 生成密钥对,一路回车即可。会在~/.ssh下生成一个私钥文件(id_rsa)和一个公钥文件(id_rsa.pub)
$ ssh-keygen

1541837505008

终端会提示一些问题:

第一个问题是设置私钥和公钥的文件名,如果不设置默认是id_rsaid_rsa.pub

第二个问题是要不要对私钥设置口令(passphrase),如果担心私钥的安全,可以设置一个。

②上传公钥到服务器

方式1:直接copy客户端的~/.ssh/id_rsa.pub内容直接追加到服务端的~/.ssh/authorized_keys里。

方式2:SSH客户端执行以下命令上传 到服务端:

1
2
#执行完命令即可上传客户端公钥到指定的服务器的~/.ssh/authorized_keys里(其实就是追加了id_rsa.pub的内容)
$ ssh-copy-id -p port user@remote

执行完以上操作后,远程服务器即可认证客户端,客户端也有了ssh免密登录的权限。

示意图:

003_SSH 免密码示意图

3.4 配置ssh服务别名

客户端每次都输入 ssh -p port user@remote,时间久了会觉得很麻烦,特别是当 user, remoteport 都得输入,而且还不好记忆。

而给客户端配置别名可以解决这个问题,譬如用:ssh myserver 来替代上面这么一长串。要实现这个功能需要在客户端的 ~/.ssh/config (没有这个文件则手动创建)里面追加以下内容:

1
2
3
4
Host myserver
HostName 服务器ip地址
User 服务器用户名
Port 22

例如:

1
2
3
4
Host myserver
HostName 192.168.1.130
User qcmoke
Port 22

保存之后,即可用 以下命令实现快速远程登录了

1
2
3
4
$ ssh myserver

#此外对于scp命令同样可以使用myserver替代-P port user@remote了
$ scp -r demo myserver:/home

注意:ssh客户端会把你每次登陆过的计算机的公钥(public key)都记录在~/.ssh/known_hosts中。当下次登陆相同计算机时,ssh服务端会核对公钥。如果公钥不同,ssh服务端会发出警告给客户端。

一台客户端连接多个Linux系统,会经常切换,但客户端使用同一个ip,客户端登录过一次后就会把ssh信息记录在客户端本地的~/.ssh/known_hsots文件中,客户端切换其他系统后再用ssh访问原来登陆的系统就会出现冲突警告。

解决办法: 客户端直接把~/.ssh/known_hosts文件删除即可。

3. 远程文件传输

通过使用ssh客户端可以登录控制服务器了,但是想要在客户端和服务器之间进行文件传输还得需要其他的传输工具。有的是基于ssh协议的,有的基于ftp协议的,还有的是基于sftp协议等的,各有千秋。下面介绍三种工具:即SCP、FileZilla、Xftp 。

3.1 scp

scp 就是 secure copy,是基于ssh登陆进行安全的远程文件拷贝命令。只要服务器安装有ssh服务软件,客户端安装有ssh客户端软件,并建立起了连接,则可以直接使用。它的地址格式与 ssh 基本相同需要注意的是,在指定端口时用的是大写的 -P 而不是小写的。

002_SCP示意图

1
2
3
4
5
6
7
8
9
10
11
12
13
# 把本地当前目录下的 01.py 文件 复制到 远程 家目录下的 Desktop/01.py
# 注意:`:` 后面的路径如果不是绝对路径,则以用户的家目录作为参照路径
scp -P port 01.py user@remote:Desktop/01.py

# 把远程 家目录下的 Desktop/01.py 文件 复制到 本地当前目录下的 01.py
scp -P port user@remote:Desktop/01.py 01.py

# 加上 -r 选项可以传送文件夹
# 把当前目录下的 demo 文件夹 复制到 远程 家目录下的 Desktop
scp -r demo user@remote:Desktop

# 把远程 家目录下的 Desktop 复制到 当前目录下的 demo 文件夹
scp -r user@remote:Desktop demo
选项 含义
-r 若给出的源文件是目录文件,则 scp 将递归复制该目录下的所有子目录和文件,目标文件必须为一个目录名
-P 若远程 SSH 服务器的端口不是 22,需要使用大写字母 -P 选项指定端口

注意:

scp 这个终端命令只能在 Linux 或者 UNIX 系统下使用

如果在 Windows 系统中,可以安装 PuTTY,使用 pscp 命令行工具或者安装 FileZilla 使用 FTP 进行文件传输

3.2 FileZilla

官方网站:https://www.filezilla.cn/download/client

FileZilla 在传输文件时,使用的是 FTP 服务 而不是 SSH 服务,因此端口号应该设置为 21。使用FTP服务的时候,我们都知道默认是21号端口,其实还有一个20号端口。FTP使用两个TCP连接,21号端口负责控制连接,20号端口负责数据连接。

3.3 Xftp

官方网站:https://www.netsarang.com/products/xfp_overview.html

Xftp除了使用FTP服务还使用了SFTP服务,通过使用SFTP协议连接服务器传输文件会更安全。SFTP是SSH的一部分,在SSH软件包中,已经包含了一个SFTP(Secure File Transfer Protocol)的安全文件传输子系统,SFTP本身没有单独的守护进程,它必须使用sshd守护进程(端口号默认是22)来完成相应的连接操作。由于这种传输方式使用了加密/解密技术,文件传送相对来说是很安全的,但是是有代价的,它的传输效率比FTP要低得多。

3.4 lrzsz

基于命令操作的上传下载的工具 lrzsz,目前主流的SSH连接工具 ( SecureCRT、XShell 等 ) 都支持这些协议。

1
2
3
4
5
6
7
#服务器安装
yum install -y lrzsz #centos
apt-get install lrzsz #ubuntu
#在客户端执行弹窗选择文件上传
rz
#在服务端执行选择文件下载(多文件sz 1.txt 2.txt)
sz a.txt

十二、磁盘管理

1. 查看磁盘剩余空间

1
2
#disk free 查看磁盘剩余空间
df -h

2. 查看目录或文件大小

1
2
3
4
5
6
7
8
9
10
11
#disk usage 显示目录下的文件大小
du -h [目录名]

#查看当前目录大小
du -sh

#查看当前目录下所有一级子目录文件夹大小
du -h --max-depth=1

#按照目录大小进行倒序排序(以M为单位显示)
du -m --max-depth=1|sort -nr
参数 含义
-h 以人性化的方式显示文件大小

十三、其他系统命令

序号 命令 作用
01 date 查看系统时间
02 cal calendar 查看日历,-y 选项可以查看一年的日历

十四、系统监控

1. iftop

iftop可测量通过每一个套接字连接传输的数据。iftop使用pcap库来捕获进出网络适配器的数据包,然后汇总数据包大小和数量,搞清楚总的带宽使用情况。

虽然iftop报告每个连接所使用的带宽,但它无法报告参与某个套按字连接的进程名称/编号(ID)。不过由于基于pcap库,iftop能够过滤流量,并报告由过滤器指定的所选定主机连接的带宽使用情况。

1
2
3
4
#安装
$ yum install iftop -y
#使用
$ sudo iftop -n

n选项可以防止iftop将IP地址解析成主机名,解析本身就会带来额外的网络流量。

2. nload

nload是一个命令行工具,让用户可以分开来监控入站流量和出站流量。它还可以绘制图表以显示入站流量和出站流量,视图比例可以调整。用起来很简单,不支持许多选项。

1
2
3
4
#安装
$ yum install nload
#使用
$ nload

3. htop

htop是top的扩展版本,有更丰富的概貌(例如全命令、可视化、图形用户界面gui和用户界面ui),有鼠标点击交互(译者注:看下面的截图,指的是最上面的列标题如CPU%、MEM%等可以通过鼠标点击切换以显示不同的功能),也有许多的指导教你如何做进程管理。

1
2
3
4
#安装
$ yum install htop
#运行
$ htop

4. iotop

iotop – 简单的类似top的I/O监控器。

iotop是IO实时监控器。使用它们附属的详细输入输出(IO)使用方法可以展示出你系统中每个进程线程的信息。

该命令可以与$ tcpdump(响应网络流量的命令)一起使用。如果你发现你的web服务器上有程序在运行,你可以,比如运行$ tcpdump port 80检查端口80(标准的http端口)的网络流量来观察细节。

最有用的信息可能是DISK WRITE这一列,从该列你可以准确的看到每个IO使用了多少个进程,单位为K/s。

1
2
3
4
#安装
$ yum install iotop
#运行
$ iotop

5. glances

glances是一款由python开发的系统监控工具,可以实时查看CPU、内存、网络、IO、进程、磁盘空间使用率的使用情况,并且支持三种运行模式,个人感觉比top命令使用更便捷,有三种运行模式:Standalone、Client/Server、Web server。

安装

1
2
3
4
#CentOS
$ yum -y install glances
#Ubuntu
$ apt-get install glances

Standalone模式

img

可以查看系统运行详细情况。

img

在运行glances时可以使用h键来查看glances快捷键使用方法。

img

运行过程中,直接按回车键可以对进程进行过滤,查看指定进程。

Client/Server模式

Server端:glances -s -B 192.168.1.1
Client端:glances -c 192.168.1.1

无须去指定服务器上运行,通过Client/Server端模式快速查看。-B:指定绑定的IP地址,如果不指定Server端运行端口默认端口为:61209,如果使用默认端口则用-c指定客户端时不需要额外使用-P参数来指定Server端的端口号。需要注意的是防火墙设置,确认两台主机之间端口可通。

Web server模式

glances -w
img

img

这个功能就很贴心了,我可以将集群中所有服务器上后台运行Web Server端,后续防火墙开放指定IP查看集群中服务器的运行状态,美滋滋。

如果启动Web Server端时出现**“Bottle module not found. Glances cannot start in web server mode.”**报错,执行安装bottle即可解决。

1
$ pip install bottle

配置文件

glances是支持设置配置文件的,但是不一定要有配置文件才能使用glances,Linux中配置文件可以新建位置到/etc/glances/glances.conf,窗口中的不同颜色是由阈值来设定的,我们可以在配置文件中修改各监控项的阈值来实现不同级别不同颜色的展示情况。

颜色级别定义
  • 绿色:正常(OK)
  • 蓝色:小心(CAREFUL),需要注意
  • 紫色:警告(WARNING)
  • 红色:问题严重(CRITICAL)
配置文件示例
1
2
3
4
5
6
7
8
9
10
11
vim /etc/glances/glances.conf
[quicklook]
cpu_careful=50
cpu_warning=70
cpu_critical=1
mem_careful=50
mem_warning=1
mem_critical=90
swap_careful=1
swap_warning=70
swap_critical=90

这里我们为了展示出颜色的差异,特别修改了几个为1的值,实际使用中修改到需要的值即可。
img

最终展示界面如上图所示。

十五、时间管理

1. 查看时间

1
2
3
4
5
#查看当前系统时间
$ date
#查看日历
$ cal
$ cal 2022

2. 修改时间

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#修改时分秒
date -s 11:11:11
#修改年月日
date -s 2019-11-11
#修改年月日时分秒
date -s "2019-11-11 11:11:11"

#保存为bios时间(RTC)(同步BIOS时钟,强制将系统时间写入CMOS,使之永久生效,避免系统重启后恢复成原时间。)
hwclock -w
#或者
clock -w

#查看bios时间
hwclock -r

3.设置时区

1
2
3
4
#显示系统的所有时区
timedatectl list-timezones
#设置当前系统为Asia/Shanghai上海时区
timedatectl set-timezone Asia/Shanghai

4. 时间同步

4.1 单机版

1
2
3
4
5
6
#安装ntpdate
yum install ntpdate -y
#同步网络时间(要求服务器可访问外网)
ntpdate ntp1.aliyun.com
#保存为bios时间(RTC)
hwclock -w

4.2 集群版

方案:集群中,要求有一台能访问外网的服务器作为时间服务器,其余内网服务器通过这台时间服务器来实现时间同步。有两种常用的服务工具实现:ntp和chrony

注意:这里ntp和chrony相比于ntpdate的区别在于,ntpdate只能手动单次同步时间(除非编写cronp配置),其同步时间的速度是很快的。而ntp和chrony本身就可以自己定时同步时间,其同步时间的速度可能需要几分钟以上。

全球相关ntp时间服务器:https://www.ntppool.org/zh/

4.2.1 ntp

(1)安装和环境准备

1
2
3
4
5
6
7
8
#安装ntp
yum install ntp -y

#开放123端口防火墙作为客户端访问的端口
firewall-cmd --permanent --add-port=123/udp
firewall-cmd --reload
#使用前可以把其他时间同步服务关掉,比如chrony(如果有使用的话)
systemctl stop chronyd && systemctl disable chronyd

(2)修改ntp参数配置文件

🙆‍♂对于ntpd,发现这里不做配置也可以自动同步硬件时间。

1
2
3
vim  /etc/sysconfig/ntpd
#可选择修改,是让ntpdate同步时候时写到硬件
vim /etc/sysconfig/ntpdate

修改或者追加如下配置

1
2
#同步时间后,写到硬件中
SYNC_HWCLOCK=yes

(3)修改ntp配置文件

1
2
#修改ntp配置文件(只做以下相关配置修改,其余保持不变)
vim /etc/ntp.conf

服务端配置

1
2
3
4
5
6
7
8
9
10
11
#允许192.168.60.0网段内所有机器从本机同步时间
restrict 192.168.60.0 mask 255.255.255.0 nomodify notrap
#时间服务器地址
server 0.centos.pool.ntp.org iburst
server ntp1.aliyun.com iburst
#允许上层时间服务器主动修改本机时间
restrict 0.centos.pool.ntp.org nomodify notrap noquery
restrict ntp1.aliyun.com nomodify notrap noquery
#外部时间服务器不可用时,以本地时间作为时间服务
server 127.127.1.0
fudge 127.127.1.0 stratum 10

客户端配置

1
2
3
4
5
6
7
#从node1中同步时间
server 192.168.60.101 iburst
#允许node01修改本地时间
restrict 192.168.60.101 nomodify notrap noquery
#如果node01不可用,用本地的时间服务
server 127.127.1.0
fudge 127.127.1.0 stratum 10

(4)启动和测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#ntpd进程进行同步时,可能需要5-10分钟的时间才能同步,另外ntpd开启后,则无法使用ntpdate,所以可以提前先手动同步
ntpdate ntp1.aliyun.com
#ntpdate 192.168.60.101
hwclock -w

#启动服务
systemctl start ntpd
#开机启动
systemctl enable ntpd
netstat -tunlp |grep ntpd

##上层 ntp 的状态
#*表示目前使用的ntp server
#remote:用于同步的远程节点或服务器。“LOCAL”表示本机(当没有远程服务器可用时会出现)
#refid:远程的服务器进行同步的更高一级服务器
#st:即stratum阶层,值越小表示ntp serve的精准度越高
#when:最后一次同步到现在的时间
#Poll表示,每隔多少毫秒与ntp server同步一次
#reach:已经成功更新的次数
#delay:从本地到远程节点或服务器通信的往返时间
#offset:主机与远程节点或服务器时间源的时间偏移量,offset 越接近于0,主机和 NTP 服务器的时间越接近(以方均根表示,单位为毫秒)
#jitter:与远程节点同步的时间源的平均偏差(多个时间样本中的 offset 的偏差,单位是毫秒),这个数值的绝对值越小,主机的时间就越精确
ntpq -p
#可通过watch来实时监控
watch ntpq -p

#ntp 同步状态(等待5-10分钟后,查看同步状态)
ntpstat

#查看日志
tail -f /var/log/messages
4.2.2 chrony

(1)安装和环境准备

1
2
3
4
5
6
7
8
9
#安装chrony
yum install chrony -y

#开放123端口防火墙作为客户端访问的端口
firewall-cmd --permanent --add-port=123/udp
firewall-cmd --permanent --add-port=323/udp
firewall-cmd --reload
#使用前可以把其他时间同步服务关掉,比如ntp(如果有使用的话)
systemctl stop ntpd && systemctl disable ntpd

(2)修改chrony配置文件

1
2
#修改配置文件(只做以下相关配置修改,其余保持不变)
vim /etc/chrony.conf

服务端配置

假设服务端ip为192.168.60.101

1
2
3
4
5
6
7
8
9
#外网ntp时间服务器地址
server 0.centos.pool.ntp.org iburst
server ntp1.aliyun.com iburst
#同步到bios时间(RTC)
rtcsync
#限制允许192.168.60网段ip的客户端同步
allow 192.168.60.0/24
#即使未与时间源同步也可提供本地时间
local stratum 10

客户端配置

1
2
3
4
# 删除其它server,并添加如下server
server 192.168.60.101 iburst
#同步到bios时间(RTC)
rtcsync

(3)启动和测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#启动服务
systemctl start chronyd
#测试时间同步的时候(假设手动设置了错误的时间)如果chronyd已经启动了的话,需要重启以下才能看效果
systemctl restart chronyd
#开机启动
systemctl enable chronyd
netstat -tunlp |grep chronyd

#强制快速同步系统时间
chronyc -a makestep
hwclock -w

#chrony兼容ntpdate,客户端也可以使用ntpdate手动快速同步时间
ntpdate 192.168.60.101

十六、常用命令一览

查看内存使用情况:free -h ,其中-h:显示可用mb单位

修改文件权限:chmod 777 *

切换用户: su root

解压 tar包:tar -xvf file.tar

解压tar.gz:tar -xzvf file.tar.gz

解压tar.xz:tar xvJf file.tar.xz

解压rar:unrar e file.rar

解压zip:unzip file.zip

下载网络文件 wget http://file.zip

改变文件所有者: chown [选项] [所有者]:[组] file ,其中选项-R: 处理指定目录以及其子目录下的所有文件

查看进程 :ps -ef | grep javaps -aux | grep java ,其中-aux :显示所有状态

查看端口: netstat -nap|grep 端口号

终止进程: kill -9 [PID]

安装软件:yum -y install 包名 ,其中选项y表示自动选择,包名支持*

卸载软件:yum remove 包名 ,包名不支持*

安装rpm包:rpm -ivh 包名 ,包名支持*

卸载rpm包:rpm -e 包名 ,包名不支持*

十七、shell编程重要命令总结

1. sed命令工具

  • 偏向场景是以流处理的方式编辑文档

  • 处理方式:以行处理

sed是一种几乎包括在所有 UNIX 平台(包括 Linux)的轻量级流编辑器。sed主要是用来将数据进行选取、替换、删除、新增的命令。

1.1 格式

1
$ sed [选项] '[ 匹配地址 [!] 动作]' 文件名

!表示对匹配地址的行不执行动作

匹配地址可以是:

(1)模式匹配地址,即正则表达式

(2)行数范围,写数字

常用选项

-n: 一般sed命令会把所有数据都输出到屏幕 ,如果加入此选择,则只会把经过sed命令处理的输出到屏幕。
-e: 允许对输入数据应用多条sed命令编辑
-i: 用sed的修改结果直接修改读取数据的文件,而不是由屏幕输出(即会修改源数据)

动作(作用于行)

a \追加,在当前行后添加一行或多行。添加多行时,除最后 一行
外,每行末尾需要用“\”代表数据未完结。
c \行替换,用c后面的字符串替换原数据行,替换多行时,除最
后一行外,每行末尾需用“\”代表数据未完结。
i \插入,在当期行前插入一行或多行。插入多行时,除最后 一行
外,每行末尾需要用“\”代表数据未完结。
d删除,删除指定的行。
p打印,输出指定的行。
s字串替换,用一个字符串替换另外一个字符串。格式为“行范。(作用于行中的字符串)
s/旧字串/新字串/g”(和vim中的替换格式类似)

1.2 在第二行后追加一行内容

1
$ sed -i '2a s003,\tlisi,\tjava,\t100,\tok,' student.txt #不加-i则会输出到屏幕(即不修改原文件的内容),加了-i则会输出会原文件以覆盖原内容

1542620949919

1.2 在第二行前追加两行内容

1
2
3
$ sed '2i \
s004,\twangwu,\tjava,\t100,\tok, \
s005,\tzhaosi,\tc++,\t100,\tok,' student.txt

1542622161517

\表示输入未结束

1.3 打印行

1
$ sed -n '2 p' student.txt  #只打印第二行,-n防止打印第二行后还会打印所有行  #此处的2是行数匹配地址

1542620106443

1.4 删除行

删除第二行到第三行(不改变源文件的数据,只输出删除后剩余的结果)

1
$ sed '2,3d' student.txt

1542620284091

删除第一行并修改文本源数据(将输出结果覆盖作用的文件内容)

1
$ sed -i '1d' student.txt

1542620470315

1.5 字符串替换

sed ' 匹配地址 s/旧字串/新字串/g' 文件名

此处匹配地址如果是正则匹配地址,那么一定要加/ /以表示正则模式

把第二行的wen改成xuan

1542622690522

2. awk 命令工具

  • 偏向场景是以流处理的格式化报表输出

  • 处理方式:以行处理

2.1 格式

1
awk  '条件1{动作1}  条件2{动作2}  …'  文件名

条件(Pattern):
一般使用关系表达式作为条件
x > 10 判断变量 x是否大于10
x>=10 大于等于
x<=10 小于等于
动作(Action):
格式化输出
流程控制语句

如果没有指定条件,每行都执行相应的动作

所有的动作或者命令都要用{}括起来

测试文件:student.txt:

1
2
3
4
s001,	wen,	java,   90,	ok,
s001, wen, c, 90, ok,
s001, wen, c#, 90, ok,
s002, qcmoke, c, 100, ok,
2.1.1 输出第一列和第二列
1
2
3
$ awk '{print $1$2}' student.txt
# $1为取出第一个分隔开的字段,$2为取出第二个分隔开的字段
# 默认识别的分隔符是制表符或者大于零的任意空格

1542617270519

2.2 BEGIN

BEGIN是在所有的数据读取之前的命令语句,以是否执行成功为条件结果,满足BEGIN才执行{}里的内容

2.2.1 测试BEGIN
1
$ awk 'BEGIN{print "hello"} {print $1  "\t"  $2}' student.txt

1542617203006

2.3 FS内置对象

作用:给awk命令设置识别的分隔符

1
$ awk '{FS=","} {print $1 "\t" $2}' student.txt

1542618027330

awk默认是先读入一行数据才开始处理后面的动作,故在指定分隔符后,从第二行开始才生效,而第一行无效。

处理:

2.3.1 测试FS

使用BEGIN,让awk读取第一行数据前就先指定分隔符。

1
$ awk 'BEGIN{FS=","} {print $1 "\t" $2}' student.txt

1542618296511

2.4 END

作用:在所有数据都读取并执行完所有动作之后再执行某个动作,以是否成功为条件结果。

2.4.1 测试END
1
$ awk '{print $1$2}END{print "ending over !"}' student.txt

1542618618673



----------- 本文结束 -----------




如果你觉得我的文章对你有帮助,你可以打赏我哦~
0%