Linux 的基本特点

  1. Linux 严格区分大小写
  2. Linux 中所有内容以文件形式保存,包括硬件设备
  3. Linux 不靠扩展名区分文件类型(虽然有部分文件有后缀,但是并不是给电脑看的)
  4. Linux 中所有的存储设备都必须在挂载之后才能使用

目录命令

ls(list)

  • -a 显示隐藏文件
  • -d 显示目录信息
  • -h 人性化显示文件大小
  • -i 显示 inode 号(相当于地址)
  • root 模式下才有不同颜色高亮,以后看能不能调。

查看目录的隐藏文件:

1
2
la
# 等同于ls -a

查看目录详细信息(常用来看看权限):

1
ls -dl

查看文件详细信息(常用来看看权限):

1
2
ll
# 等同于 ls -l

cd(change directory)

  • ~ home
  • -上次所在目录
  • . 代指当前目录
  • … 代指上级目录

mkdir(make directories)

  • -p 一级一级创建新目录
1
mkdir -p 目录路径

rmdir(remove empty directories)

  • 一般不用这个。
  • 只能删除空目录
  • -p 一级一级删除目录

tree(list contents of directories in a tree-like format)

  • 显示目录树

文件命令

cat(concatenate files and print on the standard output)

  • -A 列出所有隐藏的或者特殊的符号,包括回车符$、缩进^I 等

  • -E 列出每行结尾的回车符$

  • -n 显示行号

  • -T 列出缩进^I 符号

  • -v 列出特殊符号

    一般用:

1
cat -n 文件名

以下几条用的不多:

more(file perusal filter one screen at a time)

less(file perusal filter one line at a time)

head(output the first part of files)

  • -n 显示前 n 行
  • -v 显示文件名

tail(output the last part of files)

  • -n 显示倒数 n 行
  • -f 监听文件新增信息(会随着文件更改而刷新)

  • -s 建立软链接(必须写绝对路径)。若不加“-s”选项,则建立硬链接文件。
  • -f 强制执行。若目标文件已经存在,则删除后再建立链接文件

硬链接

● 不论是修改源文件,还是修改硬链接文件,另一个文件中的数据都会发生改变。

● 不论是删除源文件,还是删除硬链接文件,只要还有一个文件存在,这个文件都可以被访问。

● 硬链接不会建立新的 inode 信息,也不会更改 inode 的总数。

● 硬链接不能跨文件系统(分区)建立,因为在不同的文件系统中,inode 号是重新计算的。

● 硬链接不能链接目录,因为如果给目录建立硬链接,那么不仅目录本身需要重新建立,目录下所有的子文件,包括子目录中的所有子文件都需要建立硬链接,这对当前的 Linux 来讲过于复杂。

软链接

  • 软链接的标志很明显,权限第一个出现 l,而且在显色的情况下变蓝色,也有->指向源文件

  • 可以相当于快捷方式来使用,特点非常相似

  • 删除软链接,源文件不受影响。删除源文件,则找不到实际数据

  • 可以链接目录

  • 可以跨分区

创建软链接:

1
ln -s 源文件名 目标文件名

diff

  • a:将任何文档当作文本文档处理。(treat all file as text)
  • b:忽略空格造成的不同。(ignore-space-change)
  • B:忽略空白行造成的不同。(ignore blank lines)
  • I:忽略大小写造成的不同。(ignore matching lines)
  • N:比较两个目录时,如果文件只存在一个目录中,则另一个目录中视为空文件。(new file)
  • r:比较目录时,也递归比较子目录。
  • u:使用同一输出格式,不会显示相同的部分。(unified/)
1
diff 第一个文件名 第二个文件名

<表示去除,>表示添加,— 表示分割两个文件。实际上相当于把第三行的 is 替换成 is not。

在第一个文件的第四行后面加上显示出来的 5-6 行(add)

1
diff -c 第一个文件名 第二个文件名

image-20210221112220478
第一部分:***表示第一个文件,—表示变动后的文件。

第二部分***1,4***表示总共有 1,4 行。!表示不同的地方,+表示多出来的地方

1
diff -Naur 第一个文件名 第二个文件名

image-20210221113019958
—:表示第一个文件 +++:表示第二个文件。

-1,4 中,'-'表示第一个文件,显示第一行开始的连续 4 行。

只要把 带 ‘-’ 删除,带 ‘+’ 加上,第一个为文件就和第二个文件相同了。

注意:我们一般使用,自动查找不同的地方,生成补丁文件

1
diff -Naur 第一个文件名 第二个文件名 >补丁文件名

一般补丁文件名设置成以 .patch 或者 .diff 结尾。

打上补丁

1
2
patch -pn < 补丁文件名
# n代表取消的目录数。例如如果是在同一目录,n=0.

文件和目录命令

du(disk usage)

  • a:显示目录及子目录下的所有文件
  • h:人性化显示。

查看文件大小:

1
2
du -ah 文件名
# 更多操作去查询帮助文档。du --help

touch(change file timestamps)

  • 文件不存在则创建空文件,存在则更改文件或者目录的时间戳(访问时间、数据修改时间、状态修改时间)
  • -a 只修改访问时间(Access Time)
  • -c 如果文件不存在,则不创建新文件
  • -d 把时间戳修改成指定时间
  • -m 只修改数据修改时间(Modify Time)

一般创建文件:

1
touch 文件名

stat(display file or file system status)

  • 查看文件或者文件夹的访问时间、数据修改时间、状态修改时间、创建时间
  • -f 查看所在的文件系统信息。

rm(remove files or directories)

  • -f 强制删除(force)
  • -i 交互删除,删除前需要确定(默认情况)
  • -r 一级一级的删除,删除目录需要加上(recursive)

一般删除文件:

1
rm -rf 文件名

cp(copy files and directories)

  • -a:等同于执行-dpr ,如果我们要源文件的属性不要变,完全的复制,这样就很方便。
  • -d :如果源文件为软链接,复制之后也为软链接,否则复制的是软链接的源文件。
  • -i :交互(interact),询问是否覆盖
  • -n:不覆盖。
  • -f :强制覆盖
  • -l :建立为硬链接文件,而不是复制
  • -s :建立为软链接文件,而不是复制
  • -p :目标文件保留源文件的属性(创建时间、数据修改时间、状态修改时间等)
  • -r :递归复制,复制目录加上
1
2
3
4
5
6
# 覆盖复制,需要再次确定(常用于恢复备份文件)
cp -i 源文件 目标文件
# 复制目录一般使用
cp -r 源文件 目标文件
# 复制文件
cp 源文件 目标文件
1
git config --global https.https://github.com.proxy socks5://192.168.0.104:10808

mv(move files)

与 cp 用法和效果差不多,主要区别是不保留源文件

  • 因为可以设置目标文件名,所以也用来给文件或文件夹改名。相当于剪切。
  • -f 强制覆盖。
  • -i 交互覆盖,询问是否要覆盖。
  • -n 已存在相同名字的文件则不覆盖
  • -v 显示移动文件时的详细信息,那些文件有变动。

权限管理命令

了解文件的权限

image-20210216143827001
第一列权限位总共有十位

第一位是文件类型,种类比较多

  • d:目录文件 directory
  • I:软链接文件
  • c:字符设备文件
  • -:普通文件

后面每三位代表每一类人的权限,分别对应所有者、所属组(授权使用的人)、其他人(其他没有授权的人)

  • -r:代表 read,读取权限
  • -w:代表 write,写入权限
  • -x:代表 execute,执行权限
  • -:代表对应位置没有这个权限。

第二列数字对于文件是链接数和 inode 有关

第三列、第四列两个名字分别是所有者和用户组

第五列的数字是文件的大小,单位是 Byte(字节)

第六列日期是最后一次状态修改日期

最后一列是名称,不同的颜色代表不同的类型

权限的具体含义

权限对于文件:

r: 查看。可以用 cat,more ,less,head,tail 等命令查看

w: 可以修改文件内容。但是不能删除文件,需要上级目录有写的权限才可以删除

x: 能否有权限运行。但是还需要看它本身能否正常运行。对于文件,执行权限是最高权限。

权限对于目录:

r: 可以擦好看子目录和子文件,比如 ls 命令

w: 可以修改(新建、删除、复制、剪贴)目录中的子目录或者子文件。比如 touch,rm,cp,mv. 对于目录,写是最高权限、

x: 目录可以执行,代表可以进入这个目录,比如 cd。如果没有可执行权限,那么引用目录的操作不能完成

preview

更加复杂的特殊权限,对于现在而言不必要去学习,以后深入学习操作系统会学到的。

chmod(change file mode bits)

  • -R 递归设置,给子目录中的所有文件都设置这个权限
  • 选项有三个部分
    • 用户身份
      1. u:user,所有者
      2. g:group,所有组
      3. o:other,其他人
      4. a: all,所有身份
    • 赋予方式
      1. +:加入权限
      2. -:减去权限
      3. =:设置权限
    • 权限
      1. r
      2. w
      3. x

示例:

1
2
3
4
# 一般用的是:chmod 数字权限 文件名
chmod 740 文件名
# 等同于其他的用法(不方便)
chmod u=rwx,g=r,o=- 文件名

数字权限表达方式(都是八进制的数)

  • 4:代表 r
  • 2 代表 w
  • 1 代表 x

那么这三个数字的 7 种和(没有这个权限记作 0)就唯一代表着一个用户权限的 7 种情况。

例如:chmod u=rwx,g=r,o=- 文件名,就可以记作 chmod 740 文件名

chown(change file owner and group)

  • R 递归设置,给子目录中的所有文件都执行这个操作。

示例:

1
2
3
4
5
6
# 改变所有者
chown 想要改成的所有者名字 文件名
# 改变所属组
chown 原来的所属组.想要改变的所属组 文件名
# 这个也是一样的效果
chown 原来的所属组:想要改变的所属组 文件名

chgrp(change group ownership)

chown root 文件名,把所属组改为 root

umask

  • 用于设置创建新文件和新目录时的默认权限设置
  • 直接输入 umask 返回的时八进制的数 0022,是补码
  • umask -S 返回初始权限掩码,u=rwx,g=rx,o=rx。注意 umask 是权限掩码,而不是默认的权限。是八进制的 022 的原码对应的权限

umask 默认权限规则

  1. 对文件而言,最大权限为 666,没有执行权限,必须手动赋予。
  2. 对目录而言,最大权限为 777.
  3. umask 权限为四位的八进制数,默认 0022,第一位为特殊权限,后三位为一般权限(rwx 这种)。
  4. 计算规则
    • 文件最大权限 666,即-rw-rw-rw-,umask 是 022 对应-----w–w-,出去 umask 对应位置出现的字母就可以了。也就是说最大权限减去两者的交集。
    • 目录最大权限 777,同样的操作。

帮助命令

man(the system reference manuals)

  • f: 帮助的级别(类型)
  • k: 和命令相关的所有帮助
    image-20210216224144785

ls(1),代表级别是 1

一般使用:

1
man 命令名

man 内的快捷键:

  • g:移动到第一页
  • G:移动到最后一页
  • /:检索字符。常用 /-选项 查找自己不清楚的选项
  • N:检索字符时找到上一个字符串
  • n:检索字符时找到下一个字符串
  • q:(quit)退出

info(read Info documents)

  • 官方的帮助文档大全

info 内快捷命令:

  • 回车:进入*(带*的文本表示可查看详细信息)
  • u:退出*
  • n:进入下一小节
  • p:进入上一小节

help

  • 只能用于查看 shell 内置命令的帮助

–help 选项:

  • 大多数命令种都有这个选项,而且往往简明扼要,很有帮助。
  • 一些可执行文件也有这样的帮助。
1
2
3
4
#查询命令的帮助
命令名 --help
#查询可执行文件的帮助(在所属目录下)
./可执行文件名字 --help

搜索命令

注意,在大范围搜索时,搜索命令会给系统带来很大的压力。

whereis

  • 用于查看命令的位置和帮助文档的位置
    image-20210216230307173
  • b:只查看二进制命令的位置
  • m:只查看帮助文档的位置

locate(fine files by name)

  • i:忽略大小写。
  • 由于 locate 命令时搜索 locate 数据库,所以耗费资源少,搜索速度快,但是要重启来更新,所以不包括新建的文件(所以删除后再查看还是可以发现,用 locate 查询后显示存在,但是实际不存在的情况)
  • 可以使用 updatedb 更新数据库
  • 系统认为某些文件系统或者文件类型和目录(光盘、临时目录、网盘等)是没有必要搜索的,无法用 locate 找到。可在/etc/updatedb.conf 设置
    image-20210216234744780

第一行蓝色的:是否开启

第二行蓝色的:排除的目录

第三行蓝色的:排除的文件类型

常用的搜索方式:

1
2
3
4
#先更新数据库
updatedb
#搜索文件名
locate 文件名

find

  • 功能强大,可以根据时间、权限、大小、inode 对硬盘进行搜索,但是比较消耗系统资源。
  • 必须完全匹配才会搜索到,只是包含搜索内容不会被列出
  • 格式:find 搜索路径 选项 搜索内容。 例如

按名字或 inode 搜索:

  • name:按文件名搜索
  • iname:按文件名搜索,不分大小写
  • inum:按 inode 搜索。常用于查找硬链接

按大小搜索

  • size -大小:比这个小的文件。

  • size +大小:比这个大的文件。

    大小单位如下:

    • c:字节
    • w:双字节。(因为一个汉字是两个字节)
    • k:KB
    • M:MB
    • G:GB

例如:

1
find /home -size +10M。

按时间搜索

  • atime:按访问时间搜索
  • mtime:按数据修改时间搜索
  • ctime:按状态修改时间搜索

-5:五天内修改的

5:五天前(前 5-6 天)修改的

+5:六天前及以前修改的

例如:

1
2
# 在/home目录下查找数据修改时间在前1天到现在的文件。
find /home -mtime -1

按权限搜索

  • perm:权限恰好相同的文件
  • perm -:权限包含于这个的文件(权限比较小)
  • perm /:只要所有者、所属组、其他人中有一个或多个满足条件的文件,相当于或。(perm +已经取消了)

例如:

1
find /home/learner/Interaction/ -perm /743

按所有者和所属组搜索

  • user:按所有者名查找指定所有者的文件
  • group:按所属组名找指定所属组的文件。
  • nouser:没有所有者的文件(外来文件,不是在 Linux 里创建或下载的)。

例如:find . -nouser find . -user root

按文件类型搜索

  • type d:查找目录。
  • type f:查找普通文件。
  • type l:查找软链接文件。

例如:find . -type l

逻辑运算多个限定条件搜索

  • -a:and 逻辑与
  • -o:or 逻辑或
  • -not:逻辑非

例如:find . -size +2M -a -type f 查找当前目录大小大于 2MB 的普通文件。

其他辅助命令

  • 命令一 -exect 命令二{}\

表示对查找到的命令执行命令二。{}代指命令一的结果。

例如: find /home/learner/Interaction/ -type f -a -iname matplolib -a -size -2M -exec rm -rf {} ; 表示对在/home/learner/Interaction/目录下的叫做 matplolib(不分大小写)的小于 2MB 的普通文件执行 强制递归删除操作。

  • ok

ok 的用法和 exec 几乎一样,但是多了一个询问是否操作。

grep

grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。用于过滤/搜索的特定字符。可使用正则表达式能配合多种命令使用,使用上十分灵活。

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
-a --text  # 不要忽略二进制数据。
-A <显示行数> --after-context=<显示行数> # 除了显示符合范本样式的那一行之外,并显示该行之后的内容。
-b --byte-offset # 在显示符合范本样式的那一行之外,并显示该行之前的内容。
-B<显示行数> --before-context=<显示行数> # 除了显示符合样式的那一行之外,并显示该行之前的内容。
-c --count # 计算符合范本样式的列数。
-C<显示行数> --context=<显示行数>或-<显示行数> # 除了显示符合范本样式的那一列之外,并显示该列之前后的内容。
-d<进行动作> --directories=<动作> # 当指定要查找的是目录而非文件时,必须使用这项参数,否则grep命令将回报信息并停止动作。
-e<范本样式> --regexp=<范本样式> # 指定字符串作为查找文件内容的范本样式。
-E --extended-regexp # 将范本样式为延伸的普通表示法来使用,意味着使用能使用扩展正则表达式。
-f<范本文件> --file=<规则文件> # 指定范本文件,其内容有一个或多个范本样式,让grep查找符合范本条件的文件内容,格式为每一列的范本样式。
-F --fixed-regexp # 将范本样式视为固定字符串的列表。
-G --basic-regexp # 将范本样式视为普通的表示法来使用。
-h --no-filename # 在显示符合范本样式的那一列之前,不标示该列所属的文件名称。
-H --with-filename # 在显示符合范本样式的那一列之前,标示该列的文件名称。
-i --ignore-case # 忽略字符大小写的差别。
-l --file-with-matches # 列出文件内容符合指定的范本样式的文件名称。
-L --files-without-match # 列出文件内容不符合指定的范本样式的文件名称。
-n --line-number # 在显示符合范本样式的那一列之前,标示出该列的编号。
-P --perl-regexp # PATTERN 是一个 Perl 正则表达式
-q --quiet或--silent # 不显示任何信息。
-R/-r --recursive # 此参数的效果和指定“-d recurse”参数相同。
-s --no-messages # 不显示错误信息。
-v --revert-match # 反转查找。
-V --version # 显示版本信息。
-w --word-regexp # 只显示全字符合的列。
-x --line-regexp # 只显示全列符合的列。
-y # 此参数效果跟“-i”相同。
-o # 只输出文件中匹配到的部分。
-m <num> --max-count=<num> # 找到num行结果后停止查找,用来限制匹配行数

规则表达式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
^    # 锚定行的开始 如:'^grep'匹配所有以grep开头的行。
$ # 锚定行的结束 如:'grep$' 匹配所有以grep结尾的行。
. # 匹配一个非换行符的字符 如:'gr.p'匹配gr后接一个任意字符,然后是p。
* # 匹配零个或多个先前字符 如:'*grep'匹配所有一个或多个空格后紧跟grep的行。
.* # 一起用代表任意字符。
[] # 匹配一个指定范围内的字符,如'[Gg]rep'匹配Grep和grep。
[^] # 匹配一个不在指定范围内的字符,如:'[^A-FH-Z]rep'匹配不包含A-R和T-Z的一个字母开头,紧跟rep的行。
\(..\) # 标记匹配字符,如'\(love\)',love被标记为1。
\< # 锚定单词的开始,如:'\<grep'匹配包含以grep开头的单词的行。
\> # 锚定单词的结束,如'grep\>'匹配包含以grep结尾的单词的行。
x\{m\} # 重复字符x,m次,如:'0\{5\}'匹配包含5个o的行。
x\{m,\} # 重复字符x,至少m次,如:'o\{5,\}'匹配至少有5个o的行。
x\{m,n\} # 重复字符x,至少m次,不多于n次,如:'o\{5,10\}'匹配5--10个o的行。
\w # 匹配文字和数字字符,也就是[A-Za-z0-9],如:'G\w*p'匹配以G后跟零个或多个文字或数字字符,然后是p。
\W # \w的反置形式,匹配一个或多个非单词字符,如点号句号等。
\b # 单词锁定符,如: '\bgrep\b'只匹配grep。

常见用法

在文件中搜索一个单词,命令会返回一个包含 “match_pattern” 的文本行:

1
2
grep match_pattern file_name
grep "match_pattern" file_name

在多个文件中查找:

1
grep "match_pattern" file_1 file_2 file_3 ...

输出除之外的所有行 -v 选项:

1
grep -v "match_pattern" file_name

标记匹配颜色 –color=auto 选项:

1
grep "match_pattern" file_name --color=auto

使用正则表达式 -E 选项:

1
2
3
grep -E "[1-9]+"
#
egrep "[1-9]+"

使用正则表达式 -P 选项:

1
grep -P "(\d{3}\-){2}\d{4}" file_name

只输出文件中匹配到的部分 -o 选项:

1
2
3
4
5
echo this is a test line. | grep -o -E "[a-z]+\."
line.

echo this is a test line. | egrep -o "[a-z]+\."
line.

统计文件或者文本中包含匹配字符串的行数 -c 选项:

1
grep -c "text" file_name

输出包含匹配字符串的行数 -n 选项:

1
2
3
4
5
6
grep "text" -n file_name
#
cat file_name | grep "text" -n

#多个文件
grep "text" -n file_1 file_2

打印样式匹配所位于的字符或字节偏移:

1
2
3
echo gun is not unix | grep -b -o "not"
7:not
#一行中字符串的字符便宜是从该行的第一个字符开始计算,起始值为0。选项 **-b -o** 一般总是配合使用。

搜索多个文件并查找匹配文本在哪些文件中:

1
grep -l "text" file1 file2 file3...

递归搜索文件

在多级目录中对文本进行递归搜索:

1
2
grep "text" . -r -n
# .表示当前目录。

忽略匹配样式中的字符大小写:

1
2
echo "hello world" | grep -i "HELLO"
# hello

选项 -e 制动多个匹配样式:

1
2
3
4
5
6
7
8
9
10
echo this is a text line | grep -e "is" -e "line" -o
is
line

#也可以使用 **-f** 选项来匹配多个样式,在样式文件中逐行写出需要匹配的字符。
cat patfile
aaa
bbb

echo aaa bbb ccc ddd eee | grep -f patfile -o

在 grep 搜索结果中包括或者排除指定文件:

1
2
3
4
5
6
7
8
# 只在目录中所有的.php和.html文件中递归搜索字符"main()"
grep "main()" . -r --include *.{php,html}

# 在搜索结果中排除所有README文件
grep "main()" . -r --exclude "README"

# 在搜索结果中排除filelist文件列表里的文件
grep "main()" . -r --exclude-from filelist

使用 0 值字节后缀的 grep 与 xargs:

1
2
3
4
5
6
7
8
# 测试文件:
echo "aaa" > file1
echo "bbb" > file2
echo "aaa" > file3

grep "aaa" file* -lZ | xargs -0 rm

# 执行后会删除file1和file3,grep输出用-Z选项来指定以0值字节作为终结符文件名(\0),xargs -0 读取输入并用0值字节终结符分隔文件名,然后删除匹配文件,-Z通常和-l结合使用。

grep 静默输出:

1
2
grep -q "test" filename
# 不会输出任何信息,如果命令运行成功返回0,失败则返回非0值。一般用于条件测试。

打印出匹配文本之前或者之后的行:

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
# 显示匹配某个结果之后的3行,使用 -A 选项:
seq 10 | grep "5" -A 3
5
6
7
8

# 显示匹配某个结果之前的3行,使用 -B 选项:
seq 10 | grep "5" -B 3
2
3
4
5

# 显示匹配某个结果的前三行和后三行,使用 -C 选项:
seq 10 | grep "5" -C 3
2
3
4
5
6
7
8

# 如果匹配结果有多个,会用“--”作为各匹配结果之间的分隔符:
echo -e "a\nb\nc\na\nb\nc" | grep a -A 1
a
b
--
a
b

压缩和解压缩命令

zip(package and compress files)

  • r :压缩目录
  • zip 压缩包名 源文件或目录名。 例如:zip -r test_bak.zip test

unzip(extract compressed files in a ZIP archive)

  • d:解压到指定位置。
  • l:查看.zip 文件

gzip(compress or expand files)

  • 用于.gz 格式的压缩或解压缩
  • c :保留源文件。格式是:gzip -c 源文件 > 目标文件。例如:gzip -c test >test.gz
  • d:解压缩
  • r:压缩目录。但是不是压缩目录,而是把目录下的文件逐个打包。
  • v:显示压缩文件的信息
  • 数字:压缩等级,1-9,数字越大压缩比越大,默认是 6

gunzip

  • r:解压缩目录下的所有压缩文件
  • 大多数情况下和 gzip -d 差不多。

zcat

  • 不解压缩直接查看 .gz 文件

bzip2(a block-sorting file compressor)

  • 比较先进,相对较好。
  • 不支持压缩目录。
  • d:解压缩。
  • k:压缩时保留源文件。默认压缩的同时删除源文件。
  • v:显示压缩的详细信息。
  • 数字:压缩比,1-9。

bunzip2

  • k:解压缩时保留源文件。
  • 与 bzip2 -d 相似

bzcat

  • 不解压缩直接查看 .bz2 文件

tar

  • c:打包。
  • f:指定压缩的文件名
  • v:显示打包过程。

一般使用时 tar -cvf test.tar test,有时打包了之后我们再用 gzip 或 bz2 压缩

解压缩时

  • x:解打包
  • t:测试(test),即只查看不解打包
  • C:指定解打包的位置。

一般使用 tar -xvf test.tar 解压缩

tar -tvf test.tar 查看压缩文件

  • z:压缩和解压缩.tar.gz 格式
  • j:压缩和解压缩.tar.bz2 格式

实际使用(这才是最常用的方法):

1
2
3
4
5
6
7
8
# 解压缩.tar.gz格式
tar -zxvf test.tar
# 压缩.tar.gz格式
tar -zcvf test.tar
# 同理:解压缩.tar.bz2格式
tar -jxvf test.tar
#压缩.tar.bz2格式
tar -jcvf test.tar

关机和重启命令

sync(Synchronize cached writes to persistent storage)

服务器这条命令很重要,最好手动执行几次

  • 将内存中的数据同步到硬盘中

shutdown

  • 最安全的开机重启命令
  • c:取消设定的 shutdown 命令
  • h:关机
  • r:重启

定时关机或重启:

方式一:指定时间。shutdown -r 05:30 指 5 点 30 重启

方式二:设定延迟时间。 shutdown -h +10 指十分钟后重启

shutdown -h now 立即关机

用 shutdown -c 取消

reboot

立即重启


下面的都不常用:

halt

poweroff

都是立即关机命令

init

  • 数字:调用系统的级别(以后了解)

例如:init 0 调用系统的 0 级别,关机

init 6 调用系统的 6 级别,重启。

网络命令

ifconfig(configure a network interface)

  • 用于查看以及修改网卡的 IP 地址和子网掩码

例如:inet 192.168.119.128 netmask 255.255.255.0 inet 是 ip 地址,netmask 是子网掩码。

那么,该设置 ifconfig eth0 192.168.119.128 netmask 255.255.255.0,其中 eth0 指的是设备的编号。

ifup

用于开启网卡 ifup eth0,指开启 eth0 网卡

ifdown

用于关闭网卡

ping

用于主机的通信情况,向网络主机发送 ICMP 请求。

格式 :ping IP 地址

  • b:后面加入广播地址,对整个网段进行探测
  • c:指定 ping 的次数
  • s:指定探测包大小

netstat

  • -a:列出所有网络状态,包括 Socket 程序
  • -c 秒数:指定每隔几秒刷新一-次网络状态
    -n:使用 IP 地址和端口号显示,不使用域名与服务名
  • -p:显示 PID 和程序名
  • -t:显示使用 TCP 协议端口的连接状况
  • -u:显示使用 UDP 协议端口的连接状况
  • -1 :仅显示监听状态的连接
  • -r:显示路由表

常用一下三个命令:

netstat -tlun

netstat -an

netstat -rn


以下的命令不常用:

write

格式:write 用户名 (然后回车)输入的文本 (CTRL+ D 保存并发送)

wall(write to all)

给所有登录用户发消息。

格式:wall 文本

mail

格式:mail 用户名 (然后出现 subject)主题的内容 (回车)正文(CTRL+D 保存并发送)

单独 mail 表示查看邮件。(有些版本不支持)

Vim 文本编辑器

首先要了解三种模式,可能叫法不同,但是能够识别就可以了。

命令模式

  • 按上下左右查看。

  • 按 ZZ 快捷退出,但是不会保存文件,不建议这么做。

输入模式

在命令模式下按 i,a,o 等键,就会进入输入模式(底部会出现 INSERT)。可以编辑。

按 ESC 退出到命令模式

编辑模式

在命令模式下按’:‘,即可开始进行指令操作

按 ESC 退出到命令模式

打开文件操作

一般打开文件:

1
2
vim 文件名

进入到第 n 行:

1
vim +n 文件名

进入到第一次特定字符的位置:

1
vim +/字符串 文件名

光标切换操作

(在命令模式下进行)

  • w:移动光标到下一个单词首
  • b:移动光标到上一个单词首
  • e:移动光标到下一个单词尾
  • $:移动光标到行尾
  • n$:移动光标到第 n 行行尾
  • ^或 0:移动光标到行首
  • nG:移动光标到第 n 行行首。在编辑模式直接输入数字,是同样的效果
  • f 字符:移动光标到该行指定位置
  • %:在匹配的括号切换

搜索命令

在命令模式下,/字符串:向下查询自动跳转到对应字符位置。回车即可完成跳转,删除命令则不跳转。(按下回车后)

  • n:向下匹配查找
  • N:向上匹配查找
  • 注意:1. 可以在编辑模式下输入:set ic 忽略大小写。 输入:set noic 调回来。2. 特殊字符需要转义,例如 \$来搜索$

在命令模式下,/^字符串:搜索行首出现的字符串。

/$字符串:搜索行尾出现的字符串。

编辑操作

  • r:在命令模式下,覆盖光标所在的字符,只能是一个
  • R:在命令模式下,覆盖光标之后的字符,直到按 ESC 才停止

字符串替换操作

在编辑模式下:起始行,结束行 s/源字符串/替换后的字符串/g

例如:68,72 s/sub1/sub2/g 表示 将 68-72 行出现的 sub1 全部替换成 sub2,g 表示进行不再再次询问确定,c 就是需要再次确认.

1,10 s/^/#/g 表示在 1-10 行的行首添加字符串#,。

删除、粘贴、复制操作

(在命令模式下)

  • x:删除光标所在的字符
  • nx:删除光标所在以及其后的 n 个字符
  • dd:删除光标所在的一行
  • ndd:删除光标所在即后面的行,总共 n 行
  • uG:删除光标所在行及其后面的所有内容
  • D:删除光标位置到行尾的内容
  • 在编辑模式下,起始行,终止行 d:删除起始行到终止行的内容。例如:84,86d 指删除第 84 到 86 行
  • yy 或 Y:复制这一行
  • nyy 或 nY:复制光标这一行及后面的行,共 n 行
  • p:把内容粘贴在这行下面
  • P:把内容粘贴在这行上面

另外,CTRL + SHIFT C 复制,CTRL + SHIFT D 粘贴

注意:上一步删除的内容可以用于粘贴

u ----(在命令模式下)撤销

保存与退出命令

  • w:保存不退出
  • q:不保存退出
  • !:强制执行。常常用于没有写权限时(readonly)。

常用:wq:保存后退出

w 新文件名:保存到其他地方,这样就保留了修改前的文件。

Vim 配置文件

编辑模式下输入:set nu

可以显示行号,同理:set nonu 取消显示行号。

可以在 ~/.vimrc 设置配置文件,填上自己需要的命令就足够了。

参数非常多,可以用 set all 查看参数。

多窗口编辑

方法一:sp/文件名。水平切分。vs 文件名,垂直切分。

方法二:打开文件时,直接 vim -o 第一个文件名 第二个文件名。

按 CTRL +ww 切换窗口。

输入 r 文件名,即可将一个文件的全部内容复制到这个文件。

定义快捷键

格式:map 快捷键 执行的命令

注意设置快捷键时,CTRL +P,需要按住 CTRL +V,表示这是快捷键,然后再按 CTRL +P 进行设置。

表示回退

例如:map ^p I#,^P 是指 CTRL+P,I#指行首添加#,然后退出编辑模式

map ^E a 文本 ,a 指在当前位置加入文本。

输入 unmap 对应快捷键 即可取消快捷键。

与 Shell 交互

!命令。可以在编辑模式下使用命令行

r ! 命令。可以把执行的结果加入文件。例如 r ! date 就是加入了时间。

宏记录

在命令模式下,q 宏的命名

进入输入模式,进行更改。

退出到命令模式,按@宏的命名 进行操作。

RPM 包的使用和管理

源代码包

源代码包指 直接是看得见源代码的安装包,需要编译成二进制文件才能够运行。具有如下特点:

主要包括:

  1. 源代码文件。
  2. 配置和检测程序
  3. 软件安装说明。比如 README 或者 INSTALL

优点:

  1. 开源。意味着如果你有能力,可以自己修改、完善,选择和定制需要的功能,甚至觉得不满意自己可以二次开发。
  2. 因为是编译后安装,更加稳定,效率更高。
  3. 卸载无残留。

缺点:

  1. 安装步骤多,容易出错。
  2. 编译时间很长。
  3. 一旦安装出错,必须懂才能够解决,新手的噩梦。

二进制包

已经编译完成,但是也看不到源代码了。主要有 DPKG 包和 RPM 包。Linux 默认使用 RPM 包。

RPM 包的优点:

  1. 简单,操作不多,只要几个命令。
  2. 安装速度更加快。

RPM 包的缺点:

  1. 看不到源代码。
  2. 依赖性。

RPM 包的有很强大而且方便的管理系统,方便查询、升级、卸载。

RPM 的依赖性

某些软件包,必须要有对应的软件包,才能够正常的安装和使用功能。

依赖分成 软件包依赖库依赖(属于软件包的一部分,常以 so.1 结尾,需要在www.rpmfind.net 查询所属的软件包)。

RPM 包的命名规则

包的全名:httpd-2.2.15-15. el6. centos.1. i686. rpm

分成 7 部分:

  1. 软件包名。这里是 httpd
  2. 软件版本。2.2.15
  3. 软件发布次数。15
  4. 软件发布商。el6
  5. 适用系统。centos
  6. 适用的硬件平台。i686
  7. 拓展名。rpm。注意这个是给人看的,Linux 系统本身没有拓展名的要求。

注意区分包名(即上面提到的第 1 部分)和包全名。使用包名是因为已经安装,在数据库里存在。在没有安装之前,都是用包全名。

安装路径

image-20210219224025462

安装命令:rpm

  • i:安装(install)
  • v:显示详细信息(verbose)
  • h:用#显示安装进度(hash)。
  • –replacefiles:替换文件安装。如果部分文件已近安装,那么正常安装会因为文件已经存在而报错。使用这个选项可以直接覆盖安装。
  • –replacepkgs:重新安装包。不管是否安装过了,都重新覆盖安装。
  • –force:强制安装,可以看成–replacefiles,–replacepkgs 的综合。
  • –test:测试安装。不会实际安装,只是检测依赖性。
  • –prefix:指定安装路径,不建议用,相互调用时要手工设置其他的东西,否则系统不能识别这个包。
  • U:升级安装(update)。如果没有安装,就直接安装。如果已经安装的版本低,就升级到新版本。
  • F:升级安装(freshen)。如果没安装。就不会安装。也就是说只有较低版本的软件包已经安装了,才能够实行。

一般我们都是直接使用:rpm -ivh 包全名 进行安装。

rpm -Uvh 包全名 也常常使用,效果差不多。

RPM 包的查询

实际上时查询/var/lib/rpm/ 目录里的数据库文件,不能直接用 Vim 查看二进制文件(全是乱码),

格式:rpm - q 包名

  • q:查询(query)
  • a:所有。rpm -qa 来查看所有的已经安装的包
  • i:查询软件详细信息(information)。rpm -qi 包名
  • l:列出软件包的安装目录和文件列表(list)。rpm -ql 包名
  • p:表示没有安装的软件包。rpm -alp 来查询没有安装的软件包的信息。rpm -qip 包全名 查询没有安装的某个包的信息。
  • R:软件包的依赖性。rpm -qR 包名 查询这个包的依赖信息。

RPM 包的卸载

卸载时也要注意依赖性,直接卸载会造成依赖这个包的其他包不能正常使用,直接卸载会报错。

rpm -e 包名 卸载这个包。

  • e:卸载(erase)。
  • –nodeps:忽视依赖性。不建议这么做。

包的检验和数字证书

RPM 包是否被修改过,或者出现了损坏,到底是哪个文件出问题了。这就靠包的检验了。实际上时把已安装文件和数据库内容进行比较。

rpm -Va

检验所有已安装的包

  • V:检验指定的 RPM 包文件。(verify)

  • Vf:检验是否包修改过

检验结果

验证内容:

  • S:文件大小。(size)
  • M:文件类型或权限有没有该改变。
  • 5:文件的 MD5 校验和是否改变
  • D:设备的主从代码是否改变。
  • L:文件路径是否改变。
  • U:文件的所有者是否改变。
  • G:文件的所属组是否改变
  • T:文件的修改时间是否改变

文件类型:**

  • c:配置文件(configuration file)
  • d:普通文档(documentation)
  • g:不该在该 RPM 中出现的文件(ghost file)
  • l:授权文件(license file)
  • r:描述文件。(read file)

校验结果演示:

image-20210219234133369

第一列,没有改变的用 “.” 表示,改变了的显示对应的字母或者数字。

数字证书(数字签名)

上面说的检验方法时依赖安装时自带的文件来校验,如果 RPM 包在安装之前就修改过,那么就必须使用数字证书。

数字证书也叫数字签名,有软件开发者直接发布。只要 RPM 包被更改了,数字证书验证就不会通过。

数字证书的特点:

  1. 必须找到原厂的公钥
  2. 安装时会提取 RPM 包的证书信息,然后与发布的数字证书进行校验。
  3. 校验通过则允许安装,不通过则不允许安装,并且发出警告。

安装数字证书rpm --import 数字证书名

**查询已经安装的数字证书:**rpm -qa | grep gpg-pubkey

数字证书本身也是 RPM 包,可以用以上的查询命令,如:rpm -qi 数字证书名。也可以用卸载:rpm -e 数字证书名

SRPM 包的使用

SRPM 包没有经过编译,可以查看源代码,但是包装成了 RPM 格式。

命名规则

命名规则和 RPM 基本一致,只是 rpm 变成了 src.rpm

用 rebuild 命令安装

rpmbuild [选项] 包全名

  • –rebuild:编译 SPRPM 包,不安装。
  • –recompile:编译 SRPM 包,同时安装。

安装目录

会在 /root/rpbuild/ 目录下创建以下文件夹:

image-20210220002012073

用*.spec 文件安装

  1. rpm -i *.src.rpm

    对于.rpm 文件是安装,但是对于*.src.rpm 文件是解开,放置到 rpmbuild 目录。

    rpmbuild 目录下会生成放置源码的 SOURCES 和放置设置文件的 SPEC 子目录。

  2. 利用 SPEC 目录下的.spec 文件生成 RPM 包。rpmbuild -ba *.spec

    • ba:编译,同时生成 RPM 包和 SRPM 包
    • bb:编译,只生成 RPM 包。

这两种方法使用一种就可以了。

源代码包的使用和管理

源代码安装的特点

  • 可以与 APT 安装的包共存。

  • 绝大多数源码包是用 C 写的。

  • 源代码包一般从互联网下载。

  • 一般是 .tar.gz 或者 .tar.bz2 的压缩格式。

  • 约定俗成 /usr/src 保存内核源代码。 /usr/local/src 保存用户下载的源代码。

  • 安装的位置一般规定在 /usr/local/各自的软件目录。

  • 如果保存比较难解决问题,如果出现 error 或者 warning 表示部分功能不能使用,停止安装则算报错。

安装步骤

首先查看 README 或者 INSTALL 的安装说明

  1. 下载。要注意匹配的版本。

  2. 解压缩,移动到 /usr/local/。

  3. 进入解压缩后的目录,执行 configure,如果没有这个文件,哪个绿色的执行哪一个,进行软件的配置和检查。

    1
    2
    3
    /.configure --prefix=安装路径
    # 或(如果没有configure文件)
    /.绿色的哪个文件的名字 --prefix=安装路径
  4. 进入安装目录,里面有个 Makefile 文件。

    1
    2
    3
    make
    # 如果编译报错,重新编译前要清空头文件,再编译。
    make clean
  5. 安装。

    1
    make install

有些包是可执行文件,不用安装,执行就可以了。

还有很重要的帮助文档

1
./可执行文件名 --help

源码包的升级

对于不用安装的可执行文件,替换就可以了。

对于已近安装的源码包,只要打上补丁,重新编译和安装即可。

image-20210221111624066

源码包卸载

源码包会把所有的文件放在安装的路径下,因此,没有卸载命令,只要删除安装的目录,就可以删的干干净净。

还有脚本安装,运行 .sh 文件,一步一步安装即可

APT 安装工具

Ubuntu 安装软件时,首选这个安装方式。

功能介绍

基本功能:

  1. 自动从软件源下载最新的软件包以及包含索引和摘要信息的元数据。
  2. 利用下载好的元数据,完成软件包的搜索和系统的更新。
  3. 开始安装或者卸载软件包时,自动寻找最新版本,自动解决依赖问题。

软件源和信息来源:

安装和卸载的数据储存在 /var/lib/dpkg/states 文件,它记录着系统已经安装的软件。

查询软件信息和下载软件的软件源在 /var/lib/dpkg/states

解决依赖关系:

大多数情况下依赖的软件包会自动装上,建议安装的软件包会给出提示,但不会自动安装。

如果在软件源中不存在合适的依赖包,就会报错,需要自己解决。

apt-cache

常用 apt-cache 查询软件包的相关信息。用 apt-get 执行软件包安装的相关操作,常常需要使用 root 权限。

显示所有可用软件包:

1
apt-cache pkgnames

搜索软件包并列出相关信息:

1
apt-cache search 软件包名

查看指定软件包的详细信息:

1
apt-cache show 软件包名

查看软件包的依赖信息:

1
apt-cache depends 软件报名

查看软件包被哪些包依赖:

1
apt-cache rdepends 软件包名

查看软件的安装状态和版本:

1
apt-cache policy 软件包名

apt-get

  • 获得最新的软件包列表,同步 source.list 和 source.lsit.d 中的源索引
1
apt-get update
  • 升级所有已经安装的软件包及其依赖的软件包,为了确保获得的时是最新的信息,需要执行上一条 update 命令。

    1
    apt-get upgrade
  • 如果想只升级某个软件包:

    1
    apt-get --reinsatll 软件包名
  • dist-upgrade:如果安装的软件包的依赖关系发生变化,upgrade 命令就不能对它升级,就需要使用这个命令,会自动安装引入的依赖包。

    1
    apt-get dist-upgrade
  • install:下载、安装、并自动解决依赖关系。

    1
    apt-get install 软件包名
  • remove:卸载。

    1
    apt-get remove 软件包名
  • autoremove:自动卸载这个包,并且删除它的依赖的且不再使用的包。

    1
    apt-get autoremove 软件包名
  • purge:卸载并且清除配置文件。下载的源文件、已经安装的源文件、卸载的源文件都备份在这里。

    1
    apt-get purge 软件包名
  • source:下载源文件。下载目录在 /var/cache/apt/archives/

    1
    apt-get source 软件包名
  • clean:删除已经下载的在 /var/cache/apt/archives/ 的软件包,不影响已安装软件的使用。

    1
    apt-get clean

选项:

  • h:查看帮助文件,超级重要!不记得了命令了,有问题了,先查看这个。

  • s:不实际安装。模拟运行命令。

  • y:不询问,一路 yes 安装下去。

  • u:更新时显示软件包的列表

    1
    apt-get -u upgrade

配置 APT 的源

用来安装和更新的地址储存在 /etc/apt/sources.list 文件中。而/etc/apt/sources.list.d/ 下的.list 文件使得可以自己定义软件源,这样就能很方便的安装第三方软件。

/etc/apt/sources.list 的结构:

1
2
deb http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse

第一个字段表示软件包的类型,Ubuntu 一般使用 deb 或者 deb-src,分别表示用.deb 文件安装和用源文件进行安装。

第二个字段定义 URL,便是提供软件源的 URL 地址。

第三个字段定义软件包的发新版本或者类型。

  • main:Canonical 支持的开源软件。
  • universe:社区维护的开源软件。
  • restricted:由设备生产商专有的设备驱动软件。
  • multiverse:受版权或者法律保护的相关软件。
  • security:重要的安全更新
  • updates:推荐的一般更新。
  • proposed:预览版的更新。
  • backports:无支持的更新,这种更新通常还存在一些 bug。

当打开 URL 地址时,进入 /pool/ 目录会出现

就分别把提供的软件包分成了 Canonical 支持的开源软件、有版权的软件、设备驱动软件和社区维护的开源软件。

Synaptic 包管理工具是图形化的界面,可以比较方便的管理包。

PPA 安装

一般储存在/etc/apt/sources.list.d/ 下的.list 文件

PPA 的语法格式如下:

1
ppa:user/ppa-name

添加 PPA 源:

1
add-apt-repository ppa:user/ppa-name

删除 PPA 源:

1
add-apt-repository-r ppa:user/ppa-name

Deb 软件包的使用和管理

除了 APT 在线软件外,Ubuntu 主要使用 Deb 软件包格式。

  • 查询未安装软件包简要信息

    1
    dpkg -I 包全名
  • 查询已安装包的详细信息

    1
    dpkg -s 包名
  • 查询已安装的软件包有哪些文件

    1
    dpkg -S 包名
  • 安装软件包

    1
    dpkg -i 包全名
  • 卸载软件包

    1
    dpkg -r 包名
  • 卸载软件包并删除配置文件

    1
    dpkg -P 包名

如果是 .rpm 格式,可以把他转化成 .deb 格式,再进行安装

1
alien rpm 格式的文件名

.run 和 .bin 二进制包的安装:

这两种包是由安装脚本和安装程序合成的,安装过程基本一样,我们以.run 为例

  1. 首先要有可执行的权限。

  2. 运行该文件。

    1
    ./包的名字

卸载包,到安装的目录里查找,里面会有 uninstall 文件,运行即可。或者安装目录里有 MaintenanceTool,运行。

用户组管理

用户命令

添加一般用户

1
# useradd 用户名

为添加的用户指定相应的用户组

1
# useradd -g root 用户名

创建一个系统用户

1
# useradd -r 用户名

为新添加的用户指定 home 目录

1
# useradd -d 指定目录 用户名

为新添加的用户自动设置 home 目录

1
# useradd -m 指定目录 用户名

建立用户且制定 ID

1
# useradd 用户名 -u 544

修改用户密码

1
passwd 用户名

删除用户

1
userdel 用户名