csdn_spider/blog/ds19991999/原创-- Liunx常见任务和基本工具(上篇).md

557 lines
22 KiB
Markdown
Raw Normal View History

2021-02-27 15:01:45 +00:00
# 原创
Liunx常见任务和基本工具(上篇)
# Liunx常见任务和基本工具(上篇)
### 文章目录
## 一、软件包管理
**主要的包管理系统家族:**
|包管理系统|发行版 (部分列表)
|------
|Debian Style (.deb)|Debian, Ubuntu, Xandros, Linspire
|Red Hat Style (.rpm)|Fedora, CentOS, Red Hat Enterprise Linux, OpenSUSE, Mandriva, PCLinuxOS
如果一个软件包需要一些共享的资源,如一个动态链接库,它就被称作有一个**依赖**。软件包管理系统通常由两种工具类型组成:**底层工具**用来处理这些任务,比方说安装和删除软件包文件;**上层工具**,完成元数据搜索和依赖解析。
**包管理工具:**
|发行版|底层工具|上层工具
|------
|Debian-Style|dpkg|apt-get, aptitude
|Fedora, Red Hat Enterprise Linux, CentOS|rpm|yum
**使用上层工具来搜索资源库元数据,可以根据软件包的名字和说明来定位它:**
|风格|命令
|------
|Debian|apt-get update; apt-cache search search_string
|Red Hat|yum search search_string
**上层工具允许从一个资源库中下载一个软件包,并经过完全依赖解析来安装它:**
|风格|命令
|------
|Debian|apt-get update; apt-get install package_name
|Red Hat|yum install package_name
**底层软件包安装命令:**
|风格|命令
|------
|Debian|dpkg --install package_file
|Red Hat|rpm -i package_file
**使用上层工具来卸载软件:**
|风格|命令
|------
|Debian|apt-get remove package_name
|Red Hat|yum erase package_name
**上层工具软件包更新命令:**
|风格|命令
|------
|Debian|apt-get update; apt-get upgrade
|Red Hat|yum update
**底层软件包升级命令:**
|风格|命令
|------
|Debian|dpkg --install package_file
|Red Hat|rpm -U package_file
**列出所安装的软件包:**
|风格|命令
|------
|Debian|dpkg --list
|Red Hat|rpm -qa
**底端工具可以用来显示是否安装了一个指定的软件包:**
|风格|命令
|------
|Debian|dpkg --status package_name
|Red Hat|rpm -q package_name
**查看软件包信息:**
|风格|命令
|------
|Debian|apt-cache show package_name
|Red Hat|yum info package_name
**确定哪个软件包对所安装的某个特殊文件负责:**
|风格|命令
|------
|Debian|dpkg --search file_name
|Red Hat|rpm -qf file_name
## 二、存储媒介
```
mount 挂载一个文件系统
umount 卸载一个文件系统
fsck 检查和修复一个文件系统
fdisk 分区表控制器
mkfs 创建文件系统
fdformat 格式化一张软盘
dd — 把面向块的数据直接写入设备
genisoimage (mkisofs) 创建一个 ISO 9660的映像文件
wodim (cdrecord) 把数据写入光存储媒介
md5sum 计算 MD5检验码
```
### 挂载和卸载存储设备
管理存储设备的第一步是把设备连接到文件系统树中,即挂载。有一个叫做`/etc/fstab`的文件可以列出系统启动时要挂载的设备(典型地,硬盘分区)。
Fedora 7系统的/etc/fstab 文件实例:
```
LABEL=/12 / ext3 defaults 1 1
LABEL=/home /home ext3 defaults 1 2
LABEL=/boot /boot ext3 defaults 1 2
```
字段说明:
|字段|内容|说明
|------
|1|设备名|传统上,这个字段包含与物理设备相关联的设备文件的实际名字,比如说/dev/hda1第一个 IDE 通道上第一个主设备分区)。然而今天的计算机,有很多热插拔设备(像 USB 驱动设备),许多 现代的 Linux 发行版用一个文本标签和设备相关联。当这个设备连接到系统中时, 这个标签(当储存媒介格式化时,这个标签会被添加到存储媒介中)会被操作系统读取。 那样的话,不管赋给实际物理设备哪个设备文件,这个设备仍然能被系统正确地识别。
|2|挂载点|设备所连接到的文件系统树的目录。
|3|文件系统类型|Linux 允许挂载许多文件系统类型。大多数本地的 Linux 文件系统是 ext3 但是也支持很多其它的,比方说 FAT16 (msdos), FAT32 (vfat)NTFS (ntfs)CD-ROM (iso9660),等等。
|4|选项|文件系统可以通过各种各样的选项来挂载。有可能,例如,挂载只读的文件系统, 或者挂载阻止执行任何程序的文件系统(一个有用的安全特性,避免删除媒介。)
|5|频率|一位数字,指定是否和在什么时间用 dump 命令来备份一个文件系统。
|6|次序|一位数字,指定 fsck 命令按照什么次序来检查文件系统。
### 查看挂载的文件系统列表
```
# mount 命令被用来挂载文件系统
# 设备 on 挂载点 type 文件系统类型(选项)
alien@localhost:~$ mount
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
udev on /dev type devtmpfs (rw,nosuid,relatime,size=1947612k,nr_inodes=486903,mode=755)
/dev/hdc on /media/live-1.0.10-8 type iso9660 (ro,noexec,nosuid,
nodev,uid=500)
...
```
```
# umount卸载文件系统
alien@localhost:~$ su
密码:
root@localhost:/home/alien# umount /dev/hdc
```
```
# 把设备挂载到了一个目录
mkdir /mnt/cdrom
mount -t iso9660 /dev/hdc /mnt/cdrom
# 卸载设备
umount /dev/hdc
```
>
tips打印机缓存是一个包含一些 RAM 内存 的设备,位于计算机和打印机之间。通过打印机缓存,计算机把要打印的结果发送到这个缓存区, 数据会迅速地存储到这个 RAM 中,这样计算机就能回去工作,而不用等待。与此同时,打印机缓存将会 以打印机可接受的速度把缓存中的数据缓慢地输出给打印机。
### 确定设备名称
```
# 列出目录/dev所有设备的住所
alien@localhost:~$ ls /dev
autofs i2c-8 sda tty21 tty55 ttyS3
block initctl sda1 tty22 tty56 ttyS30
bsg input sda10 tty23 tty57 ttyS31
btrfs-control kmsg sda11 tty24 tty58 ttyS4
...
```
**Linux 存储设备名称:**
|模式|设备
|------
|/dev/fd*|软盘驱动器
|/dev/hd*|老系统中的 IDE(PATA)磁盘。典型的主板包含两个 IDE 连接器或者是通道,每个连接器 带有一根缆线,每根缆线上有两个硬盘驱动器连接点。缆线上的第一个驱动器叫做主设备, 第二个叫做从设备。设备名称这样安排,/dev/hdb 是指第一通道上的主设备名;/dev/hdb 是第一通道上的从设备名;/dev/hdc 是第二通道上的主设备名,等等。末尾的数字表示 硬盘驱动器上的分区。例如,/dev/hda1是指系统中第一硬盘驱动器上的第一个分区而 /dev/hda 则是指整个硬盘驱动器。
|/dev/lp*|打印机
|/dev/sd*|SCSI 磁盘。在最近的 Linux 系统中,内核把所有类似于磁盘的设备(包括 PATA/SATA 硬盘, 闪存,和 USB 存储设备,比如说可移动的音乐播放器和数码相机)看作 SCSI 磁盘。 剩下的命名系统类似于上述所描述的旧的/dev/hd*命名方案。
|/dev/sr*|光盘CD/DVD 读取器和烧写器)
### 创建新的文件系统
假设我们使用一个16MB 闪存备,名称是/dev/sdb 指整个设备,/dev/sdb1是这个设备的第一分区fdisk 命令操作分区:
```
# 操作分区
sudo fdisk /dev/sdb
# 创建一个新的文件系统
sudo mkfs -t ext3 /dev/sdb1
# 重新格式化为它最初的 FAT32文件 系统
sudo mkfs -t vfat /dev/sdb1
```
### 测试和修复文件系统
```
# 检查我们的闪存驱动器
sudo fsck /dev/sdb1
```
### 格式化软盘
使用 fdformat 程序,同时指定软盘设备名称(通常为/dev/fd0
```
sudo fdformat /dev/fd0
# 通过 mkfs 命令,给这个软盘创建一个 FAT 文件系统
sudo mkfs -t msdos /dev/fd0
```
### 直接把数据移入/出设备
dd 程序把磁盘驱动器简单地看成一个数据块大集合,可以克隆设备:
```
dd if=input_file of=output_file [bs=block_size [count=blocks]]
```
```
# 把第一个驱动器中的所有数据复制到第二个 驱动器中。
dd if=/dev/sdb of=/dev/sdc
# 如果只有第一个驱动器被连接到计算机上,我们可以把它的内容
# 复制到一个普通文件中供 以后恢复或复制数据:
dd if=/dev/sdb of=flash_drive.img
```
### 创建 CD-ROM 映像
```
# 适用于 DVD 光盘, 对于音频 CD看一下 cdrdao 命令
dd if=/dev/cdrom of=ubuntu.iso
```
创建一个包含目录内容的 iso 映像文件,我们使用 genisoimage 程序:
```
genisoimage -o cd-rom.iso -R -J ~/cd-rom-files
```
“-R”选项添加元数据为 Rock Ridge 扩展,这允许使用长文件名和 POSIX 风格的文件权限。 同样地,这个”-J”选项使 Joliet 扩展生效,这样 Windows 中就支持长文件名了。
```
# 直接挂载一个 ISO 镜像
mkdir /mnt/iso_image
mount -t iso9660 -o loop image.iso /mnt/iso_image
# 清除一张可重写入的 CD-ROM
wodim dev=/dev/cdrw blank=fast
# 写入镜像
wodim dev=/dev/cdrw image.iso
```
**checksum 文件:**
iso 映像文件的贡献者也会提供 一个 checksum 文件,它是一个神奇的数学运算的计算结果,这个数学计算会产生一个能表示目标文件内容的数字。生成 checksum 数字的最常见方法是使用 md5sum 程序。
```
md5sum image.iso
34e354760f9bb7fbf85c96f6a3f94ece image.iso
```
这就可以验证我们下载的镜像和发行商提供的镜像是否一致。如检验映像文件 dvd-image.iso 以及 DVD 光驱中磁盘 /dev/dvd 文件的完整性:
```
md5sum dvd-image.iso; dd if=/dev/dvd bs=2048 count=$(( $(stat -c "%s" dvd-image.iso) / 2048 )) | md5sum
```
## 三、网络系统
```
ping - 发送 ICMP ECHO_REQUEST 数据包到网络主机
traceroute - 打印到一台网络主机的路由数据包
netstat - 打印网络连接,路由表,接口统计数据,伪装连接,和多路广播成员
ftp - 因特网文件传输程序
wget - 非交互式网络下载器
ssh - OpenSSH SSH 客户端(远程登录程序)
```
### 检查和监测网络
```
alien@localhost:~ $ traceroute slashdot.org
traceroute to slashdot.org (216.105.38.15), 30 hops max, 60 byte packets
1 10.35.0.1 (10.35.0.1) 43.175 ms 71.185 ms 71.203 ms
2 10.0.5.185 (10.0.5.185) 71.196 ms 71.165 ms 71.134 ms
3 10.0.8.5 (10.0.8.5) 71.052 ms 10.0.6.5 (10.0.6.5) 70.984 ms 10.0.8.5 (10.0.8.5) 70.978 ms
...
28 * * *
29 * * *
30 * * *
```
一共经由30个路由器对于那些 提供标识信息的路由器我们能看到它们的主机名IP 地址和性能数据,这些数据包括三次从本地到 此路由器的往返时间样本。对于那些没有提供标识信息的路由器(由于路由器配置,网络拥塞,防火墙等 方面的原因),我们会看到几个星号,正如行中所示。
```
# 使用“-ie”选项我们能够查看系统中的网络接口
alien@localhost:~ $ netstat -ie
Kernel Interface table
enp7s0 Link encap:以太网 硬件地址 74:e6:e2:41:f6:62
UP BROADCAST MULTICAST MTU:1500 跃点数:1
接收数据包:689500 错误:0 丢弃:0 过载:0 帧数:0
发送数据包:156502 错误:0 丢弃:0 过载:0 载波:0
碰撞:0 发送队列长度:1000
接收字节:300138422 (300.1 MB) 发送字节:23781675 (23.7 MB)
...
```
其中`enp7s0`是一个网络接口,`lo`是内部回环网络接口,它是一个虚拟接口,系统用它来自言自语。
### 网络中传输文件
**ftp**
|命令|意思
|------
|ftp fileserver|唤醒 ftp 程序,让它连接到 FTP 服务器fileserver。
|anonymous|登录名。输入登录名后,将出现一个密码提示。一些服务器将会接受空密码, 其它一些则会要求一个邮件地址形式的密码。如果是这种情况,试着输入 “user@example.com”。
|cd pub/cd_images/Ubuntu-8.04|跳转到远端系统中,要下载文件所在的目录下, 注意在大多数匿名的 FTP 服务器中,支持公共下载的文件都能在目录 pub 下找到
|ls|列出远端系统中的目录。
|lcd Desktop|跳转到本地系统中的 ~/Desktop 目录下。在实例中ftp 程序在工作目录 ~ 下被唤醒。 这个命令把工作目录改为 ~/Desktop
|get ubuntu-8.04-desktop-i386.iso|告诉远端系统传送文件到本地。因为本地系统的工作目录 已经更改到了 ~/Desktop所以文件会被下载到此目录。
|bye|退出远端服务器,结束 ftp 程序会话。也可以使用命令 quit 和 exit。
**lftp - 更好的 ftp**
虽然 lftp 工作起来与传统的 ftp 程序很相似,但是它带有额外的便捷特性,包括 多协议支持(包括 HTTP若下载失败会自动地重新下载后台处理用 tab 按键来补全路径名,还有很多。
**wget**
不只能下载单个文件,多个文件,甚至整个网站都能下载,这个程序的许多选项允许 wget 递归地下载,在后台下载文件(你退出后仍在下载),能完成未下载 全的文件。
### 与远程主机安全通信
**ssh**Secure Shell它要认证远端主机是否为它 所知道的那台主机(这样就阻止了所谓的“中间人”的攻击),其次,它加密了本地与远程主机之间 所有的通讯信息。
SSH 由两部分组成。SSH 服务端运行在远端主机上,在端口 22 上监听收到的外部连接,而 SSH 客户端用在本地系统中,用来和远端服务器通信。
为了能让系统接受远端的连接,它必须安装 OpenSSH-server 软件包,它必须允许在 TCP 端口 22 上接收网络连接。
**scp 和 sftp**
OpenSSH 软件包也包含两个程序scp安全复制被用来复制文件与熟悉的 cp 程序非常相似。
```
# 主机名后面跟":"
scp bob@remote-sys:./document.txt ./
```
sftp:任何一台能用 SSH 客户端连接的远端机器,也可当作类似于 FTP 的服务器来使用.
## 四、查找文件
```
locate 通过名字来查找文件
find 在一个目录层次结构中搜索文件
xargs 从标准输入生成和执行命令行
touch 更改文件时间
stat 显示文件或文件系统状态
```
### locate - 查找文件的简单方法
### find - 查找文件的复杂方式
locate 程序只能依据文件名来查找文件,而 find 程序能基于各种各样的属性 搜索一个给定目录(以及它的子目录),来查找文件。
上面`find ~`将产生一张很大的列表。
```
# wc 程序来计算出文件的数量
alien@localhost:~ $ sudo find ~ | wc -l
76602
# 文件数
alien@localhost:~ $ sudo find ~ -type f | wc -l
67531
# 目录数
alien@localhost:~ $ sudo find ~ -type d | wc -l
8899
```
**文件类型:**
<th align="center">文件类型</th>|描述
|------
<td align="center">b</td>|块特殊设备文件
<td align="center">c</td>|字符特殊设备文件
<td align="center">d</td>|目录
<td align="center">f</td>|普通文件
<td align="center">l</td>|符号链接
```
# 限定名字和大小
alien@localhost:~ $ sudo find ~ -type f -name "*.png" -size +1k | wc -l
5409
```
**大小单位:**
|字符|单位
|------
|b|512 个字节块。如果没有指定单位,则这是默认值。
|c|字节
|w|两个字节的字
|k|千字节(1024个字节单位)
|M|兆字节(1048576个字节单位)
|G|千兆字节(1073741824个字节单位)
**find常用测试条件**
|测试条件|描述
|------
|-cmin n|匹配内容或属性最后修改时间正好在 n 分钟之前的文件或目录。 指定少于 n 分钟之前,使用 -n指定多于 n 分钟之前,使用 +n。
|-cnewer file|匹配内容或属性最后修改时间晚于 file 的文件或目录。
|-ctime n|匹配内容和属性最后修改时间在 n*24小时之前的文件和目录。
|-empty|匹配空文件和目录。
|-group name|匹配属于一个组的文件或目录。组可以用组名或组 ID 来表示。
|-iname pattern|就像-name 测试条件,但是不区分大小写。
|-inum n|匹配 inode 号是 n的文件。这对于找到某个特殊 inode 的所有硬链接很有帮助。
|-mmin n|匹配内容被修改于 n 分钟之前的文件或目录。
|-mtime n|匹配的文件或目录的内容被修改于 n*24小时之前。
|-name pattern|用指定的通配符模式匹配的文件和目录。
|-newer file|匹配内容晚于指定的文件的文件和目录。这在编写执行备份的 shell 脚本的时候很有帮。 每次你制作一个备份,更新文件(比如说日志),然后使用 find 命令来判断哪些文件自从上一次更新之后被更改了。
|-nouser|匹配不属于一个有效用户的文件和目录。这可以用来查找 属于被删除的帐户的文件或监测攻击行为。
|-nogroup|匹配不属于一个有效的组的文件和目录。
|-perm mode|匹配权限已经设置为指定的 mode的文件或目录。mode 可以用 八进制或符号表示法。
|-samefile name|类似于-inum 测试条件。匹配和文件 name 享有同样 inode 号的文件。
|-size n|匹配大小为 n 的文件
|-type c|匹配文件类型是 c 的文件。
|-user name|匹配属于某个用户的文件或目录。这个用户可以通过用户名或用户 ID 来表示。
**操作符:**
```
find ~ \( -type f -not -perm 0600 \) -or \( -type d -not -perm 0700 \)
```
|操作符|描述
|------
|-and|如果操作符两边的测试条件都是真,则匹配。可以简写为 -a。 注意若没有使用操作符,则默认使用 -and。
|-or|若操作符两边的任一个测试条件为真,则匹配。可以简写为 -o。
|-not|若操作符后面的测试条件是真,则匹配。可以简写为一个感叹号(!)。
|()|把测试条件和操作符组合起来形成更大的表达式。这用来控制逻辑计算的优先级。 默认情况下find 命令按照从左到右的顺序计算。经常有必要重写默认的求值顺序,以得到期望的结果。 即使没有必要,有时候包括组合起来的字符,对提高命令的可读性是很有帮助的。注意 因为圆括号字符对于 shell 来说有特殊含义,所以在命令行中使用它们的时候,它们必须 用引号引起来,才能作为实参传递给 find 命令。通常反斜杠字符被用来转义圆括号字符。
上述表达式`( expression 1 ) -or ( expression 2 )`解释为:`( file with bad perms ) -or ( directory with bad perms )`,圆括号对于 shell 有特殊含义,我们必须转义它们,来阻止 shell 解释它们。
|expr1 的结果|操作符|expr2 is…
|------
|真|-and|总要执行
|假|-and|从不执行
|真|-or|从不执行
|假|-or|总要执行
### 预定义的操作
find 命令允许基于搜索结果来执行操作
|操作|描述
|------
|-delete|删除当前匹配的文件。
|-ls|对匹配的文件执行等同的 ls -dils 命令。并将结果发送到标准输出。
|-print|把匹配文件的全路径名输送到标准输出。如果没有指定其它操作,这是 默认操作。
|-quit|一旦找到一个匹配,退出。
`-ok`:交互式地执行一个用户定义的行为。
```
-exec command {} ;
```
这里的 command 就是指一个命令的名字,{}是当前路径名的符号表示,分号是必要的分隔符 表明命令的结束。
### xargs
xargs 命令从标准输入接受输入,并把输入转换为一个特定命令的 参数列表。find 命令提供的 -print0 行为, 则会产生由 null 字符分离的输出,并且 xargs 命令有一个 null 选项,这个选项会接受由 null 字符 分离的输入。这里有一个例子:
```
find ~ -iname *.jpg -print0 xargs null ls -l
```
```
alien@localhost:~ $ mkdir -p playground/dir-{00{1..9},0{10..99},100}
alien@localhost:~ $ touch playground/dir-{00{1..9},0{10..99},100}/file-{A..Z}
alien@localhost:~ $ find playground -type f -name 'file-A' | wc -l
100
alien@localhost:~ $ touch playground/timestamp
alien@localhost:~ $ stat playground/timestamp
文件:'playground/timestamp'
大小0 块0 IO 块4096 普通空文件
设备80ah/2058d Inode1316820 硬链接1
权限:(0664/-rw-rw-r--) Uid( 1000/ alien) Gid( 1000/ alien)
最近访问2018-09-20 00:12:17.421846149 +0800
最近更改2018-09-20 00:12:17.421846149 +0800
最近改动2018-09-20 00:12:17.421846149 +0800
创建时间:-
alien@localhost:~ $ touch playground/timestamp
alien@localhost:~ $ stat playground/timestamp
文件:'playground/timestamp'
大小0 块0 IO 块4096 普通空文件
设备80ah/2058d Inode1316820 硬链接1
权限:(0664/-rw-rw-r--) Uid( 1000/ alien) Gid( 1000/ alien)
最近访问2018-09-20 00:12:55.566202684 +0800
最近更改2018-09-20 00:12:55.566202684 +0800
最近改动2018-09-20 00:12:55.566202684 +0800
创建时间:-
alien@localhost:~ $ find playground -type f -name 'file-B' -exec touch '{}' ';'
alien@localhost:~ $ find playground -type f -newer playground/timestamp
playground/dir-051/file-B
playground/dir-007/file-B
playground/dir-092/file-B
playground/dir-068/file-B
...
```
**find 命令选项:**
|选项|描述
|------
|-depth|指示 find 程序先处理目录中的文件,再处理目录自身。当指定-delete 行为时,会自动 应用这个选项。
|-maxdepth levels|当执行测试条件和行为的时候,设置 find 程序陷入目录树的最大级别数
|-mindepth levels|在应用测试条件和行为之前,设置 find 程序陷入目录数的最小级别数。
|-mount|指示 find 程序不要搜索挂载到其它文件系统上的目录。
|-noleaf|指示 find 程序不要基于自己在搜索 Unix 的文件系统的假设,来优化它的搜索。 在搜索DOS/Windows 文件系统和CD/ROMS的时候我们需要这个选项