The Linux Command 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
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
58
59
60
61
62
我们仅仅会关注一些最经常    使用到的命令。我们要研究的命令包括那些被用来监测网络和传输文件的命令。
ping - 发送 ICMP ECHO_REQUEST 软件包到网络主机
traceroute - 打印到一台网络主机的路由数据包
netstat - 打印网络连接,路由表,接口统计数据,伪装连接,和多路广播成员
ftp - 因特网文件传输程序
wget - 非交互式网络下载器
ssh - Open SSH SSH 客户端(远程登录程序)

ping,网络连接验证, 按下组合键 Ctrl-c,中断这个命令之后
[me@linuxbox ~]$ ping www.baidu.com

网络中传输文件
ftp
ftp 命令属于真正的“经典”程序之一,它的名字来源于其所使用的协议,就是文件传输协议。FTP(它的原始形式)并不是安全的,因为它会以明码形式发送帐号的姓名和密码,由于此种原因,几乎因特网中所有 FTP 服务器 都是匿名的

在下面的例子中,我们将展示一个典型的会话,从匿名 FTP 服务器,其名字是 fileserver,的/pub/_images/Ubuntu-8.04的目录下,使用 ftp 程序下载一个 Ubuntu 系统映像文件。

[me@linuxbox ~]$ ftp fileserver
Name (fileserver:me): anonymous
ftp> cd pub/cd\_images/Ubuntu-8.04
ftp> ls
ftp> lcd Desktop
ftp> get ubuntu-8.04-desktop-i386.iso
ftp> bye
|---------|------------|
1、 唤醒 ftp 程序,让它连接到 FTP 服务器,fileserver。 |
2、 登录名。输入登录名后,将出现一个密码提示。一些服务器将会接受空密码, 其它一些则
会要求一个邮件地址形式的密码。如果是这种情况,试着输入 “user@example.com”。 |
3、 跳转到远端系统中,要下载文件所在的目录下,注意在大多数匿名的 FTP 服务器中,支持公共下载的文件都能在目录 pub 下找到 |
4、列出远端系统中的目录。 |
5、 跳转到本地系统中的 ~/Desktop目录下。在实例中,ftp 程序在工作目录 ~ 下被唤醒。这个命令把工作目录改为 ~/Desktop |
6、 告诉远端系统传送文件到本地。因为本地系统的工作目录 已经更改到了 ~/Desktop,所以文件会被下载到此目录。 |

另外还有两个常用传输文件程序:
lftp - 更好的 ftp,包括 多协议支持(包括 HTTP),若下载失败会自动地重新下载
wget - 不只能下载单个文件,多个文件,甚至整个网站都能下载

与远程主机安全通信
明码形式来传输所有的交流信息(包括登录命令和密码)。这使它们完全不 适合使用在因特网时代。
ssh
为了解决这个问题,开发了一款新的协议,叫做 SSH(Secure Shell)。 SSH 首先,它要认证远端主机是否为它 所知道的那台主机(这样就阻止了所谓的“中间人”的攻击),其次,它加密了本地与远程主机之间 所有的通讯信息。SSH 由两部分组成。SSH 服务器运行在远端主机上运行,在端口号22上监听将要到来的连接,而 SSH 客户端用在本地系统中,用来和远端服务器通信。

用来与远端 SSH 服务器相连接的 SSH 客户端程序,顺理成章,叫做 ssh。连接到远端名为 remote-sys主机,我们可以这样使用 ssh 客户端程序:

[me@linuxbox ~]$ ssh remote-sys
The authenticity of host 'remote-sys (192.168.1.4)' can't be
established.
RSA key fingerprint is
41:ed:7a:df:23:19:bf:3c:a5:17:bc:61:b3:7f:d9:bb.
Are you sure you want to continue connecting (yes/no)?
一旦建立了连接,会提示 用户输入他或她的密码:

远端 shell 会话一直存在,直到用户输入 exit 命令后,则关闭了远程连接。这时候,本地的 shell 会话 恢
复,本地 shell 提示符重新出现。


也有可能使用不同的用户名连接到远程系统。例如,如果本地用户“me”,在远端系统中有一个帐号名“bob”,则用户 me 能够用 bob 帐号登录到远端系统,如下所示:

[me@linuxbox ~]$ ssh bob@remote-sys
bob@remote-sys's password:
Last login: Sat Aug 30 13:03:21 2008
[bob@remote-sys ~]$

第十八章:查找文件

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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
在这一章中,我们将察看    两个用来在系统中查找文件的工具。这些工具是:
locate – 通过名字来查找文件
find – 在目录层次结构中搜索文件
我们也将看一个经常与文件搜索命令一起使用的命令,它用来处理搜索到的文件列表:

xargs – 从标准输入生成和执行命令行
另外,我们将介绍两个命令来协助我们探索:

touch – 更改文件时间
stat – 显示文件或文件系统状态

locate - 查找文件的简单方法
这个 locate 程序快速搜索路径名数据库,并且输出每个与给定字符串相匹配的文件名,例如,我们想要找到所有名字以“zip”开头的程序,假定包含 匹配程序的目录以”bin/”结尾。

[me@linuxbox ~]$ locate bin/zip
locate 命令将会搜索它的路径名数据库,输出任一个包含字符串“bin/zip”的路径名:

/usr/bin/zip
/usr/bin/zipcloak
/usr/bin/zipgrep
/usr/bin/zipinfo
/usr/bin/zipnote
/usr/bin/zipsplit
locate 可以结合其它工具,比如说 grep 命令,来设计更加 有趣的搜索:

[me@linuxbox ~]$ locate zip | grep bin
/bin/bunzip2
/bin/bzip2
/bin/bzip2recover
/usr/bin/gpg-zip
/usr/bin/funzip
...

find - 查找文件的复杂方式
locate 程序只能依据文件名来查找文件,而 find 程序能基于各种各样的属性, 搜索一个给定目录(以及它的子目录),来查找文件.

find 命令的最简单使用是,搜索一个或多个目录。例如,输出我们的家目录列表。
[me@linuxbox ~]$ find ~
对于最活跃的用户帐号,这将产生一张很大的列表,让我们使用 wc 程序来计算出文件的数量:
[me@linuxbox ~]$ find ~ | wc -l
47068

比如说我们想要目录列表。我们可以添加以下测试条件:

[me@linuxbox ~]$ find ~ -type d | wc -l
这里添加测试条件-type d 限制了只搜索目录

表18-1: find 文件类型
| 文件类型 | 描述 |
|---------|------------|
| b | 块设备文件 |
| c | 字符设备文件 |
| d | 目录 |
| f | 普通文件 |
| l | 符号链接 |
我们也可以通过加入一些额外的测试条件,根据文件大小和文件名来搜索:让我们查找所有文件名匹配 通
配符模式“*.JPG”和文件大小大于1M 的文件:

[me@linuxbox ~]$ find ~ -type f -name "\*.JPG" -size +1M | wc -l
840

在这个例子里面,我们加入了 -name 测试条件,后面跟通配符模式。注意,我们把它用双引号引起来,从而阻止 shell 展开路径名。紧接着,我们加入 -size 测试条件,后跟字符串“+1M”。开头的加号表明我们正在寻找文件大小大于指定数的文件。若字符串以减号开头,则意味着查找小于指定数的文件。 若没有符号意味着“精确匹配这个数”。结尾字母“M”表明测量单位是兆字节。

find 命令支持大量不同的测试条件。下表是列出了一些常见的测试条件。请注意,在需要数值参数的 情况下,可以应用以上讨论的“+”和”-“符号表示法:
表18-3: find 测试条件
| 测试条件 | 描述 |
|---------|------------|
| -name pattern | 用指定的通配符模式匹配的文件和目录。 |
| -size n | 匹配的文件大小为 n。 |
| -type c | 匹配的文件类型是 c。 |
| -user name | 匹配的文件或目录属于某个用户。这个用户可以通过用户名或用户 ID 来表示。 |


操作符
幸运地是,find 命令提供了 一种方法来结合测试条
件,通过使用逻辑操作符来创建更复杂的逻辑关系。 为了表达上述的测试条件,我们可以这样做(括号转义,不要被自动展开):
[me@linuxbox ~]$ find ~ \( -type f -not -perm 0600 \) -or \( -type d -not -perm 0700 \)
| 操作符 | 描述 |
|---------|------------|
| -and | 如果操作符两边的测试条件都是真,则匹配。可以简写为 -a。 注意若没有使用操作符,则默认使
用 -and。 |
| -or | 若操作符两边的任一个测试条件为真,则匹配。可以简写为 -o。 |
| -not | 若操作符后面的测试条件是真,则匹配。可以简写为一个感叹号(!)。 |
| () | 把测试条件和操作符组合起来形成更大的表达式。这用来控制逻辑计算的优先级


预定义的操作
幸运地是,find 命令允许基于搜索结果来执行操作
表18-6: 几个预定义的 find 命令操作
| 操作 | 描述 |
|---------|------------|
| -delete | 删除当前匹配的文件。 |
| -ls | 对匹配的文件执行等同的 ls -dils 命令。并将结果发送到标准输出。 |
| -print | 把匹配文件的全路径名输送到标准输出。如果没有指定其它操作,这是 默认操作。 |
| -quit | 一旦找到一个匹配,退出。 |

find ~ -type f -name '*.BAK' -delete
在这个例子里面,用户家目录(和它的子目录)下搜索每个以.BAK 结尾的文件名。当找到后,就删除它们。
警告:当使用 -delete 操作时,不用说,你应该格外小心。首先测试一下命令, 用 -print 操作代替 -delete,来确认搜索结果。
记住,在每个测试和操作之间会默认应用 -and 逻辑运算符。 我们也可以这样表达这个命令,使逻辑关系更容易看出:

find ~ -type f -and -name '*.BAK' -and -print

因为测试和行为之间的逻辑关系决定了哪一个会被执行,我们知道测试和行为的顺序很重要

1
2
3
4
5
6
7
8
9
10
11
12
用户定义的行为
除了预定义的行为之外,我们也可以唤醒随意的命令。传统方式是通过 -exec 行为。这个 行为像这样工作:
-exec command {} ;
{}是当前路径名的符号表示,分号是要求的界定符 表明命令结束。这里是一个使用 -exec 行为的例子,其作用如之前讨论的 -delete 行为:

-exec rm '{}' ';'
重述一遍,因为花括号和分号对于 shell 有特殊含义,所以它们必须被引起来或被转义。
通过使用 -ok 行为来代替 -exec,在执行每个指定的命令之前, 起提示用户作用:

touch命令通常被用来设置或更新文件的访问,更改,和修改时间。然而,如果一个文件名参数是一个不存在的文件,则会创建一个空文件。
注意不同于 ls 命令,find 命令的输出结果是无序的。其顺序由存储设备的布局决定
stat,是一款加大马力的 ls 命令版本

第十九章:归档和备份

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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
它们就是文件压缩程序:

gzip – 压缩或者展开文件
bzip2 – 块排序文件压缩器,另外一种压缩算法,基本和gzip一样
归档程序:

tar – 磁带打包工具
zip – 打包和压缩文件
还有文件同步程序:

rsync – 同步远端文件和目录


gzip
这个 gzip 程序被用来压缩一个或多个文件。当执行 gzip 命令时,则原始文件的压缩版会替代原始文件。
相对应的 gunzip 程序被用来把压缩文件复原为没有被压缩的版本

[me@linuxbox ~]$ gzip foo.txt
[me@linuxbox ~]$ gunzip foo.txt.gz
接下来,我们运行 gzip 命令,它会把原始文件替换为一个叫做 foo.txt.gz 的压缩文件。接下来,我们运行 gunzip 程序来解压缩文件。随后,我们能见到压缩文件已经被原始文件替代了, 同样地保留了相同的权限和时间戳。
如果我们的目标只是为了浏览一下压缩文本文件的内容,我们可以这样做:

[me@linuxbox ~]$ gunzip -c foo.txt | less


归档文件
归档就是收集许多文件,并把它们 捆绑成一个大文件的过程。归档经常作为系统备份的一部分来使用。
我们经常看到扩展名为 .tar 或者 .tgz 的文件,它们各自表示“普通” 的 tar 包和被 gzip程序压缩过的 tar 包。一个 tar 包可以由一组独立的文件,一个或者多个目录,或者 两者混合体组成。命令语法如下:

tar mode[options] pathname... # 语法
表19-2: tar 模式
| 模式 | 说明 |
|---------|------------|
| c | 为文件和/或目录列表创建归档文件。 |
| x | 抽取归档文件,相当于归档后复制到另外一个位置。 |
| r | 追加具体的路径到归档文件的末尾。 |
| t | 列出归档文件的内容。 |


让我们创建整个操练场的 tar 包:

[me@linuxbox ~]$ tar cf playground.tar playground #f选项可能是force
列出归档文件的内容

[me@linuxbox ~]$ tar tf playground.tar
抽取 tar 包 playground 到一个新位置

[me@linuxbox ~]$ cd foo #进到目标目录
[me@linuxbox ~]$ tar xf ../playground.tar #xf为抽取后的文件
有一个警告,然而:除非你是超级用户,要不然从归档文件中抽取的文件和目录的所有权由执行此复原操作的用户所拥有,而不属于原始所有者。
tar 命令另一个有趣的行为是它处理归档文件路径名的方式。默认情况下,路径名是相对的,而不是绝对路径。

假定我们想要复制家目录及其内容到另一个系统中, 并且有一个大容量的 USB 硬盘,可以把它作为传输工具
[me@linuxbox ~]$ sudo tar cf /media/Big Disk/home.tar /home
[me@linuxbox2 /]$ sudo tar xf /media/Big Disk/home.tar
c参数为创建归档,x参数为提取归档内容,f应该是强制。第一个路径为归档后放置的路径,第二个路径是对什么内容进行归档。

GNU 版本的 tar 命令(在 Linux 发行版中最常出现)通过 --wildcards 选项来 支持通配符。这个例子使用了之前 playground.tar 文件:这个命令将只会抽取匹配特定路径名的文件,路径名中包含了通配符 dir-*

[me@linuxbox ~]$ cd foo
[me@linuxbox foo]$ tar xf ../playground2.tar --wildcards 'home/me/playground/dir-\*/file-A'

tar 命令经常结合 find 命令一起来制作归档文件。在这个例子里,我们将会使用 find 命令来 产生一个文件集合,然后这些文件被包含到归档文件中。

[me@linuxbox ~]$ find playground -name 'file-A' -exec tar rf playground.tar '{}' '+'
这里我们使用 find 命令来匹配 playground 目录中所有名为 file-A 的文件,然后使用-exec 行为,来 唤
醒带有追加模式(r)的 tar 命令,把匹配的文件添加到归档文件 playground.tar 里面。

zip
这个 zip 程序既是压缩工具,也是一个打包工具,Windows 用户比较熟悉。然而,在 Linux 中 gzip 是主要的压缩程序,而 bzip2则位居第二。例如,制作一个 playground 的 zip 版本的文件包,这样做:

[me@linuxbox ~]$ zip -r playground.zip playground
除非我们包含-r 选项,要不然只有 playground 目录(没有任何它的内容)被存储

使用 unzip 程序,来直接抽取一个 zip 文件的内容。

[me@linuxbox ~]$ cd foo
[me@linuxbox foo]$ unzip ../playground.zip
使用-l 选项,导致 unzip 命令只是列出文件包中的内容而没有抽取文件

对于 zip 命令(与 tar 命令相反)要注意一点,就是如果指定了一个已经存在的文件包,其被更新 而不是
被替代。这意味着会保留此文件包。

同步文件和目录
通过使用 rsync 远端更新协议,此协议 允许 rsync 快速地检测两个目录的差异,执行最小量的复制来达到目录间的同步。
rsync 被这样唤醒:

rsync options source destination
这里 source 和 destination 是下列选项之一:
一个本地文件或目录
一个远端文件或目录,以[user@]host:path 的形式存在
一个远端 rsync 服务器,由 rsync://[user@]host[:port]/path 指定
注意 source 和 destination 两者之一必须是本地文件。rsync 不支持远端到远端的复制。

下一步,我们将同步 playground 目录在 foo 目录中

[me@linuxbox ~]$ rsync -av playground foo
我们包括了-a 选项(递归和保护文件属性)和-v 选项(冗余输出)

第二十章:正则表达式

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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
grep    程序会在文本文件中查找一个指定的正则表达式,并把匹配行输出到标准输出。就像这样:

[me@linuxbox ~]$ ls /usr/bin | grep zip
这个命令会列出,位于目录 /usr/bin 中,文件名中包含子字符串“zip”的所有文件。
这个 grep 程序以这样的方式来接受选项和参数:

grep [options] regex [file...] #这里的 regx 是指一个正则表达式。

这是一个常用的 grep 选项列表:
表20-1: grep 选项
选项 描述
-i 忽略大小写。不会区分大小写字符。也可用--ignore-case 来指定。
-v 不匹配。通常,grep 程序会打印包含匹配项的文本行。这个选项导致 grep 程序 只会不包含匹配项的文本行
-c 打印匹配的数量(或者是不匹配的数目,若指定了-v 选项),而不是文本行本身。
-l 打印包含匹配项的文件名,而不是文本行本身
-L 相似于-l 选项,但是只是打印不包含匹配项的文件名
-h 应用于多文件搜索,只输出匹配项,不输出文件名(因为默认两个都会输出)


[me@linuxbox ~]$ grep bzip dirlist*.txt #搜索字符串bzip
dirlist-bin.txt:bzip2
dirlist-bin.txt:bzip2recover
[me@linuxbox ~]$ grep -l bzip dirlist*.txt # 只输出包含匹配项的文件名
dirlist-bin.txt


元字符和文本
表达式元字符由以下字符组成:^ $ . [ ] { } - ? * + ( ) | \ 然后其它所有字符都被认为是原义字符

圆点字符,其被用来匹配任意字符
[me@linuxbox ~]$ grep -h '.zip' dirlist*.txt
bunzip2
bzip2

插入符号和美元符号被看作是锚点,表示以**开头和以**结尾
[me@linuxbox ~]$ grep -h '^zip' dirlist*.txt
zip
zipcloak
[me@linuxbox ~]$ grep -h 'zip$' dirlist*.txt
gunzip
gzip

通过中括号表达式,我们能够指定 一个字符集合
[me@linuxbox ~]$ grep -h '[bg]zip' dirlist*.txt
bzip2recover
gzip

否定,如果在正则表示式中的第一个字符是一个插入字符,则剩余的字符被看作是不会在给定的字符位置出现的字符集合
[me@linuxbox ~]$ grep -h '[^bg]zip' dirlist*.txt #zip之前的字符一定不是b或者g
bunzip2
gunzip

字符区域
[me@linuxbox ~]$ grep -h '^[A-Z]' dirlist*.txt
MAKEDEV

扩展的正则表达式
正则表达式的实现分成了两类: 基本正则表达式(BRE)和扩展的正则表达式(ERE),因为我们将要讨论的下一个特性是 ERE 的一部分,由 egrep 程序来执行这项操作,但是 GUN 版本的 grep 程序也支持扩展的正则表达式,当使用了-E 选项
之后。

Alternation
我们将要讨论的扩展表达式的第一个特性叫做 alternation(交替),其是一款允许从一系列表达式 之间选择匹配项的实用程序。

[me@linuxbox ~]$ echo "AAA" | grep AAA #左边传过来的和右边匹配
AAA
[me@linuxbox ~]$ echo "BBB" | grep AAA
[me@linuxbox ~]$
一个相当直截了当的例子,我们把 echo 的输出管道给 grep,然后看到输出结果。当出现 一个匹配项时,我们看到它会打印出来;当没有匹配项时,我们看到没有输出结果。现在我们将添加 alternation,以竖杠线元字符为标记:

[me@linuxbox ~]$ echo "AAA" | grep -E 'AAA|BBB'
AAA
[me@linuxbox ~]$ echo "BBB" | grep -E 'AAA|BBB'
BBB
[me@linuxbox ~]$ echo "CCC" | grep -E 'AAA|BBB'
[me@linuxbox ~]$
这里我们看到正则表达式’AAA|BBB’,这意味着“匹配字符串 AAA 或者是字符串 BBB”。注意因为这是 一个扩展的特性,我们给 grep 命令(虽然我们能以 egrep 程序来代替)添加了-E 选项,并且我们 把这个正则表达式用单引号引起来,为的是阻止 shell 把竖杠线元字符解释为一个 pipe 操作符。

限定符
扩展的正则表达式支持几种方法,来指定一个元素被匹配的次数。
? - 匹配零个或一个元素
* - 匹配零个或多个元素
+ - 匹配一个或多个元素
{ } - 匹配特定个数的元素
表20-3: 指定匹配的数目
| 限定符 | 意思 |
|-------|-------|
| {n} | 匹配前面的元素,如果它确切地出现了 n 次。 |
| {n,m} | 匹配前面的元素,如果它至少出现了 n 次,但是不多于 m 次。 |
| {n,} | 匹配前面的元素,如果它出现了 n 次或多于 n 次。 |
| {,m} | 匹配前面的元素,如果它出现的次数不多于 m 次。 |
-------------Thanks for Reading!-------------