# 第十四章 软件包管理

Linux发行版发行版多种多样,常见的发行版有Red Hat,Centos、Ubuntu、Debian、OpenSUSE等。对于Linux用户来说,采用哪一种发行版除了需要考虑桌面背景是否漂亮外,更重要的是,需要考虑Linux发行版的软件包系统和支持该发行版本社区的活力。

许多一流的Linux发行版本每6个月就有一个新版本问世,而且许多个人程序每天都在更新。要想同步这些日新月异的软件,我们就需要好的工具进行软件包管理。

# 软件包管理的概念

软件包管理是一种在系统上安装、维护软件的方法。目前,很多人通过安装Linux经销商发布的软件包来满足他们所有的软件需求。这与早期的Linux形成了鲜明的对比。在Linux早期,想要安装软件必须下载软件源代码,然后对其进行编译。编译源代码赋予用户自主检查、提升系统的能力,但是,使用预编译的软件包更快、更容易。

因此,本章将介绍Linux软件包管理的命令行工具,它可以执行许多图形化程序很难甚至无法完成的任务。

# 软件包系统的概念

不同的Linux发行版用的是不同的软件包系统,并且原则上,适用于一种发行版的软件包与其它版本不兼容。

多数Linux发行版采用的无外乎两种软件包技术阵营。即Debian的.deb和Red Hat的.rpm技术。常见的发行版及其对应的软件包系统关系如下。

软件包系统 发行版本(部分)
Debian类(.deb) Debian、Ubuntu、Xandos
Red Hat类(.rpm) Fedora、Centos、Red Hat、OpenSUSE

# 软件包的概念

Linux的所有软件都可以在网络上找到,并且多数是以软件包的形式由发行商提供,其余则以可以手动安装的源代码形式存在。

软件包是组成软件包系统的基本软件单元,它是由组成软件包的文件压缩而成的文件集。一个包可能包含大量的程序以及支持这些程序的数据文件,包文件既包含了安装文件,又包含了有关包自身及其内容的文本说明之类的软件包元数据。此外,许多软件包中还包含了安装软件包前后执行配置任务的安装脚本。

# 库的概念

虽然一些软件项目选择自己包装和分销,但如今多数软件包均由发行商或感兴趣的第三方创建。Linux用户可以从其所使用的Linux版本的中心库中获得软件包。所谓中心库,一般包含了成千上万个软件包,而且每一个都是专门为该发行版本建立和维护的。

一个发行版本可能还会有相关的第三方库,这些库通常提供因法律原因而不能包含在发行版中的软件。第三方库主要用在软件专利和反规避法不适用的国家,这些库通常完全独立于它们所支持的Linux发行版本,用户必须充分了解后手动加入到软件包文件管理系统的配置文件中去。

# 软件间的依赖关系

几乎没有一个软件是独立的,通常情况下,程序之间相互依赖彼此完成既定的工作。一些共有的操作,如输入/输出,就是由多个程序共享的例程执行。这些例程存储在共享库里面,共享库里面的文件为多个程序提供必要的服务。

如果一个软件包需要共享库之类的共享资源,说明其具有依赖性。现代软件包管理系统都提供依赖性解决策略,从而确保用户安装了软件包的同时,安装了其所有的依赖。

# 高级和低级的软件包工具

软件包管理系统通常包含两类工具-执行如安装、删除软件包文件等任务的低级工具和进行元数据搜索以及提供依赖性解决的高级工具。

对于不同的Linux发行版,其使用的高级和低级的软件包工具是不同的,主要分为两大类。

发行版本 低级工具 高级工具
Debian类 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

例如,我们在Red Hat系统内搜索emacs文本编辑器

yum search emacs

则我们可以得到如下输出结果

Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: mirrors.aliyun.com
 * extras: mirrors.aliyun.com
 * updates: mirrors.aliyun.com
================================================== N/S matched: emacs ==================================================
emacs.x86_64 : GNU Emacs text editor
emacs-a2ps.x86_64 : Emacs bindings for a2ps files
emacs-a2ps-el.x86_64 : Elisp source files for emacs-a2ps under GNU Emacs
emacs-auctex.noarch : Enhanced TeX modes for Emacs
emacs-common.x86_64 : Emacs common files
emacs-el.noarch : Lisp source files included with GNU Emacs
emacs-filesystem.noarch : Emacs filesystem layout
emacs-gettext.noarch : Support for editing po files within GNU Emacs
emacs-git.noarch : Git version control system support for Emacs
emacs-git-el.noarch : Elisp source files for git version control system support for Emacs
emacs-gnuplot.noarch : Emacs bindings for the gnuplot main application
emacs-gnuplot-el.noarch : Emacs bindings for the gnuplot main application
emacs-libidn.noarch : GNU Emacs libidn support files
emacs-mercurial.x86_64 : Mercurial version control system support for Emacs
emacs-mercurial-el.x86_64 : Elisp source files for mercurial under GNU Emacs
emacs-nox.x86_64 : GNU Emacs text editor without X support
emacs-php-mode.noarch : Major GNU Emacs mode for editing PHP code
emacs-terminal.noarch : A desktop menu item for GNU Emacs terminal.
ocaml-emacs.x86_64 : Emacs mode for OCaml
protobuf-emacs.x86_64 : Emacs mode for Google Protocol Buffers descriptions
protobuf-emacs-el.x86_64 : Elisp source files for Google protobuf Emacs mode
ctags-etags.x86_64 : Exuberant Ctags for emacs tag format
emacs-auctex-doc.noarch : Documentation in various formats for AUCTeX

  Name and summary matches only, use "search all" for everything.

# 安装库中的软件包

高级工具运行下载、安装软件包,同时安装所有依赖包,对于不同类型的Linux系统,也有不同的安装命令。

系统类型 命令
Debian类 apt-get update
apt-get install package_name
Red Hat类 yum install package_name

例如,我们想在Deibian类系统安装emacs编辑器,则可以这样

apt-get update ;apt-get install emacs

# 安装软件包文件中的软件包

如果软件包文件并不是从库源中下载的,那么我们可以使用低级工具直接安装,但是,需要注意的是,这种安装方式无法安装依赖关系。

系统类型 命令
Debian系统 dpkg --install package_file
Red Hat系统 rpm -i package_file

例如,我们从非库网站下载了emacs-22.1-7.fc7-i386.rpm时,可以使用以下方式安装于Red Hat系统中

rpm -i emacs-22.1-7.fc7-i386.rpm

由于该方法采用低级rpm工具安装,若在安装时缺少相关的依赖包,工具并不会解决依赖性关系问题,rpm将会输出错误并退出。

若是有可能,还是应该使用高级工具安装软件包。

# 删除软件包

卸载软件包既可以使用高级工具也可以使用低级工具,高级工具的相关命令如下:

系统类型 命令
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

例如,判断emacs是否已经在系统中安装

dpkg --status emacs

# 显示已安装软件包的安装信息

在已知已安装软件包的情况下,可以使用下表的命令显示软件包的描述信息。

系统类型 命令
Debian系统 apt-cache show package_name
Red Hat系统 yum info package_name

例如,我们想知道已安装的emacs的软件包描述信息,可以使用如下命令。

apt-cache show emacs

此时,输出如下信息

Package: emacs
Architecture: all
Version: 47.0
Priority: optional
Section: editors
Source: emacs-defaults
Origin: Ubuntu
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Original-Maintainer: Rob Browning <rlb@defaultvalue.org>
Bugs: https://bugs.launchpad.net/ubuntu/+filebug
Installed-Size: 8
Depends: emacs25 | emacs25-lucid | emacs25-nox
Filename: pool/main/e/emacs-defaults/emacs_47.0_all.deb
Size: 1748
MD5sum: 9aff2b8c263afee42e6523b8e80f104d
SHA1: 4645bd1d489e3a3fa59934cd1a4070d07460c054
SHA256: c9954c63f41d32bd190303fe3f4abd12d63e8bec879ed4bcd6e501f2da847660
Description-en: GNU Emacs editor (metapackage)
 GNU Emacs is the extensible self-documenting text editor.
 This is a metapackage that will always depend on the latest
 recommended Emacs release.
Description-md5: 21fb7da111336097a2378959f6d6e6a8
Supported: 5y

可以看到,这里列出了软件包的报名,版本,安装大小等信息。

# 查看某具体文件是由哪个软件包安装得到的

有些时候,我们需要查看系统中的某个文件是由哪个软件包安装得到的,这时候就可以使用下面的命令。

系统类型 命令
Debian类 dpkg --search file_name
Red Hat类 rpm -qf file_name

通过上面的这些命令,我们可以完成安装和管理以后所需要的软件,至于其它用法,需要在实践中慢慢熟悉。

# 第十五章 编译程序

本章将介绍如何通过源代码生成可执行程序。编译程序曾经非常流行,但是现在,版本发行商维护着很大的预编译二进制库,以便用户下载使用。但是,在很多情况下,我们仍然需要通过源代码编译生成可执行程序。编译源代码有以下好处。

  • 可用性:尽管有些发行版中已经包含了一些预编译程序,但并不会包含用户所有可能需要的所有应用程序。这时候,我们只能通过编译源代码生成可执行程序。
  • 及时性:有些时候我们需要获取最新的程序,这时候自己编译源代码就有必要了。

编译软件源代码是一件非常复杂并有技术性的任务,然而,仍然有一些简单的编译的任务,只需要几个步骤即可完成。编译的复杂程度往往取决于所要安装的软件包。这时,我们需要使用一个维护程序的工具——make命令。

为了演示这一编译程序过程,我们尝试安装nginx服务器。在安装nginx之前,我们先安装nginx所需的编译环境。

# 安装nginx所需的编译环境

安装 nginx 需要先将官网下载的源码进行编译,编译依赖 gcc 环境,如果没有 gcc 环境,我们先使用which命令查看是否存在gcc,若gcc不存在,则需要安装gcc。

  1. 先查看并安装gcc环境
which gcc

若存在gcc环境,则输出/usr/bin/gcc。若不存在,则安装gcc。

yum install gcc gcc-c++
  1. 安装pcre pcre-devel

PCRE(Perl Compatible Regular Expressions) 是一个Perl库,包括 perl 兼容的正则表达式库。nginx的http模块使用pcre来解析正则表达式,所以需要在 linux 上安装pcre库,pcre-devel是使用 pcre 开发的一个二次开发库,nginx也需要此库,所以,我们一并安装了。

yum install -y pcre pcre-devel
  1. 安装zlib

zlib 库提供了很多种压缩和解压缩的方式, nginx 使用 zlib 对 http 包的内容进行 gzip ,所以需要在 Centos 上安装 zlib 库。

yum install -y zlib zlib-devel
  1. 安装OpenSSL

OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及 SSL 协议,并提供丰富的应用程序供测试或其它目的使用。nginx 不仅支持 http 协议,还支持 https(即在ssl协议上传输http),所以需要在 Centos 安装 OpenSSL 库。

yum install -y openssl openssl-devel

# 官网下载nginx源代码

现在,我们就可以从nginx官网下载nginx源代码了,执行命令。

wget http://nginx.org/download/nginx-1.16.0.tar.gz

wget是一个下载文件的工具,它用在命令行下。对于Linux用户是必不可少的工具。若没有安装wget,则需要先安装它。

yum -y install wget

# 解压nginx源代码

当我们下载完nginx源代码之后,需要对其进行解压,解压命令如下。

tar -zxvf nginx-1.16.0.tar.gz

如果解压正常,我们将在当前目录下多了一个名为nginx-1.16.0的文件夹。

anaconda-ks.cfg  lady_dog.txt  ls-output.txt  nginx-1.16.0  nginx-1.16.0.tar.gz  original-ks.cfg

# 分析生成的环境

此时我们进入到nginx-1.16.0目录下

 cd nginx-1.16.0

然后,我们就可以执行./configure命令了。

./configure

configure程序其实是源代码树下的一个shell脚本。它的任务就是分析生成环境。多数源代码都设计成可移植的。也就是说,源代码可以在多种UNIX系统上生成,只是源代码在生成时可能需要经过细微的调整以适应各系统之间的不同。configure同样会检查系统是否已经安装了必要的外部工具和组件。

由于configure并不是存放在shell通常期望程序所在的目录下,所以必须明确告知shell有关configure的位置,我们可以在命令前添加“./”目录符来实现这一目的。该符号表示configure程序在当前工作目录下。

执行configure之后,我们看到configure输出了很多信息

checking for OS
 + Linux 4.4.0-17763-Microsoft x86_64
checking for C compiler ... found
 + using GNU C compiler
 + gcc version: 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC)
checking for gcc -pipe switch ... found
checking for -Wl,-E switch ... found
checking for gcc builtin atomic operations ... found
checking for C99 variadic macros ... found
checking for gcc variadic macros ... found
checking for gcc builtin 64 bit byteswap ... found
checking for unistd.h ... found
checking for inttypes.h ... found
checking for limits.h ... found
checking for sys/filio.h ... not found
checking for sys/param.h ... found
checking for sys/mount.h ... found
checking for sys/statvfs.h ... found
checking for crypt.h ... found
checking for Linux specific features
checking for epoll ... found
checking for EPOLLRDHUP ... found
checking for EPOLLEXCLUSIVE ... not found
checking for O_PATH ... found
checking for sendfile() ... found
checking for sendfile64() ... found
checking for sys/prctl.h ... found
checking for prctl(PR_SET_DUMPABLE) ... found
checking for prctl(PR_SET_KEEPCAPS) ... found
checking for capabilities ... found
checking for crypt_r() ... found
checking for sys/vfs.h ... found
checking for nobody group ... found
checking for poll() ... found
checking for /dev/poll ... not found
checking for kqueue ... not found
checking for crypt() ... not found
checking for crypt() in libcrypt ... found
checking for F_READAHEAD ... not found
checking for posix_fadvise() ... found
checking for O_DIRECT ... found
checking for F_NOCACHE ... not found
checking for directio() ... not found
checking for statfs() ... found
checking for statvfs() ... found
checking for dlopen() ... not found
checking for dlopen() in libdl ... found
checking for sched_yield() ... found
checking for sched_setaffinity() ... found
checking for SO_SETFIB ... not found
checking for SO_REUSEPORT ... found
checking for SO_ACCEPTFILTER ... not found
checking for SO_BINDANY ... not found
checking for IP_TRANSPARENT ... found
checking for IP_BINDANY ... not found
checking for IP_BIND_ADDRESS_NO_PORT ... not found
checking for IP_RECVDSTADDR ... not found
checking for IP_SENDSRCADDR ... not found
checking for IP_PKTINFO ... found
checking for IPV6_RECVPKTINFO ... found
checking for TCP_DEFER_ACCEPT ... found
checking for TCP_KEEPIDLE ... found
checking for TCP_FASTOPEN ... found
checking for TCP_INFO ... found
checking for accept4() ... found
checking for eventfd() ... found
checking for int size ... 4 bytes
checking for long size ... 8 bytes
checking for long long size ... 8 bytes
checking for void * size ... 8 bytes
checking for uint32_t ... found
checking for uint64_t ... found
checking for sig_atomic_t ... found
checking for sig_atomic_t size ... 4 bytes
checking for socklen_t ... found
checking for in_addr_t ... found
checking for in_port_t ... found
checking for rlim_t ... found
checking for uintptr_t ... uintptr_t found
checking for system byte ordering ... little endian
checking for size_t size ... 8 bytes
checking for off_t size ... 8 bytes
checking for time_t size ... 8 bytes
checking for AF_INET6 ... found
checking for setproctitle() ... not found
checking for pread() ... found
checking for pwrite() ... found
checking for pwritev() ... found
checking for sys_nerr ... found
checking for localtime_r() ... found
checking for clock_gettime(CLOCK_MONOTONIC) ... found
checking for posix_memalign() ... found
checking for memalign() ... found
checking for mmap(MAP_ANON|MAP_SHARED) ... found
checking for mmap("/dev/zero", MAP_SHARED) ... found
checking for System V shared memory ... found
checking for POSIX semaphores ... not found
checking for POSIX semaphores in libpthread ... found
checking for struct msghdr.msg_control ... found
checking for ioctl(FIONBIO) ... found
checking for struct tm.tm_gmtoff ... found
checking for struct dirent.d_namlen ... not found
checking for struct dirent.d_type ... found
checking for sysconf(_SC_NPROCESSORS_ONLN) ... found
checking for sysconf(_SC_LEVEL1_DCACHE_LINESIZE) ... found
checking for openat(), fstatat() ... found
checking for getaddrinfo() ... found
checking for PCRE library ... found
checking for PCRE JIT support ... found
checking for zlib library ... found
creating objs/Makefile

Configuration summary
  + using system PCRE library
  + OpenSSL library is not used
  + using system zlib library

  nginx path prefix: "/usr/local/nginx"
  nginx binary file: "/usr/local/nginx/sbin/nginx"
  nginx modules path: "/usr/local/nginx/modules"
  nginx configuration prefix: "/usr/local/nginx/conf"
  nginx configuration file: "/usr/local/nginx/conf/nginx.conf"
  nginx pid file: "/usr/local/nginx/logs/nginx.pid"
  nginx error log file: "/usr/local/nginx/logs/error.log"
  nginx http access log file: "/usr/local/nginx/logs/access.log"
  nginx http client request body temporary files: "client_body_temp"
  nginx http proxy temporary files: "proxy_temp"
  nginx http fastcgi temporary files: "fastcgi_temp"
  nginx http uwsgi temporary files: "uwsgi_temp"
  nginx http scgi temporary files: "scgi_temp"

需要注意的是,若此时发生错误,则该configure操作将以失败告终,并且不会生成可执行程序。

可以看到,configure程序在源目录中创建了新文件,其中最重要的就是Makefile。

Makefile的作用

Makefile是指导make命令如何生成可执行程序的配置文件,如果没有该文件,make便无法运行。Makefile是一个文本文件,可以使用less命令查看。

总的来说,configure脚本程序的作用就是检查linux的运行环境,

# 编译生成nginx可执行程序

通过上面的步骤,我们可以使用make命令生成可执行程序了,执行make命令。

make

make程序运行时,会使用Makefile文件中的内容指导其操作,命令执行过程中将会产生许多信息。

若我们再次运行程序,make将不会重新生成所有文件,将只生成改动过的文件,即make能够智能地仅生成需要building操作地目标文件,这一点尤其重要,可以减少不必要的时间花费。

# 安装nginx的可执行程序

打包好的源代码一般包含一个特殊的make目标程序,它便是install。该目标程序将会在系统目录下安装最后生成的可执行程序。通常会安装在目录/usr/local/bin下,该目录是本地主机上生成软件的常用安装目录,执行命令。

make install

当然,nginx设置了默认的安装位置/usr/local/nginx。在安装完之后,就可以使用该安装程序了。

# 安装成功与否校验

为了验证nginx是否安装成功,我们切换目录,启动nginx。我们先切换到nginx安装目录

cd /usr/local/nginx

然后,执行命令./sbin/nginx

./sbin/nginx

为了查看nginx是否正常运行,执行命令

ps -ef | grep nginx

若正常运行,可以看到类似如下的输出结果

root      2616     1  0 16:51 ?        00:00:00 nginx: master
nobody    2617  2616  0 16:51 ?        00:00:00 nginx: worker
root      2620     1  0 16:52 ?        00:00:00 nginx: master
nobody    2621  2620  0 16:52 ?        00:00:00 nginx: worker
root      2623     4  0 16:52 tty1     00:00:00 grep --color=auto nginx

# 第十六章 网络

在网络连接方面,Linux可以说是万能的。Linux工具可以建立各种网络系统及应用,包括防火墙、路由器、域名服务器、NAS(网络附加存储)盒等。

由于网络连接涉及的领域很广,所以用于控制、配置网络的命令很多。本章只讨论常见的相关命令。

# ping-验证网络连接是否正常

在Linux的网络命令中最基础的命令就是ping命令。 ping命令会向指定的网络主机发送特殊的网络数据包IMCP ECHO_REQUEST。多数网络设备收到该数据包之后会做出回应,通过此方法可以验证网络连接是否正常。

例如,我们可以尝试验证本机和百度网站的连接是否正常,则可以使用如下命令。

ping baidu.com

一旦我们启动命令,则命令会以既定的时间间隔(默认是1秒)发送数据包知道该命令被中断。

PING baidu.com (39.156.69.79) 56(84) bytes of data.
64 bytes from 39.156.69.79 (39.156.69.79): icmp_seq=1 ttl=48 time=66.5 ms
64 bytes from 39.156.69.79 (39.156.69.79): icmp_seq=2 ttl=48 time=53.2 ms
64 bytes from 39.156.69.79 (39.156.69.79): icmp_seq=3 ttl=48 time=54.6 ms
64 bytes from 39.156.69.79 (39.156.69.79): icmp_seq=4 ttl=48 time=59.5 ms
64 bytes from 39.156.69.79 (39.156.69.79): icmp_seq=5 ttl=48 time=55.0 ms
64 bytes from 39.156.69.79 (39.156.69.79): icmp_seq=6 ttl=48 time=66.4 ms
64 bytes from 39.156.69.79 (39.156.69.79): icmp_seq=7 ttl=48 time=57.3 ms
64 bytes from 39.156.69.79 (39.156.69.79): icmp_seq=8 ttl=48 time=53.0 ms
64 bytes from 39.156.69.79 (39.156.69.79): icmp_seq=9 ttl=48 time=56.5 ms
64 bytes from 39.156.69.79 (39.156.69.79): icmp_seq=10 ttl=48 time=57.6 ms
64 bytes from 39.156.69.79 (39.156.69.79): icmp_seq=11 ttl=48 time=83.1 ms
64 bytes from 39.156.69.79 (39.156.69.79): icmp_seq=12 ttl=48 time=52.6 ms
64 bytes from 39.156.69.79 (39.156.69.79): icmp_seq=13 ttl=48 time=54.8 ms
64 bytes from 39.156.69.79 (39.156.69.79): icmp_seq=14 ttl=48 time=54.8 ms
64 bytes from 39.156.69.79 (39.156.69.79): icmp_seq=15 ttl=48 time=64.2 ms
^C
--- baidu.com ping statistics ---
15 packets transmitted, 15 received, 0% packet loss, time 18199ms
rtt min/avg/max/mdev = 52.615/59.308/83.105/7.791 ms

按组合键Ctrl-C键终止ping程序,ping命令会将反映运行情况的数据显示出来。数据丢失0%表示网络运行正常,ping连接成功则表明网络各组成成员(接口卡、电缆、路由和网关)总体处于良好的工作状态。

# traceroute-跟踪网络数据包的传输路径

traceroute程序会显示通过网络从本地传输到指定主机过程中所有停靠点的列表。 我们再次尝试一下。

 traceroute baidu.com

若提示命令不存在,则需要手动安装。

yum install traceroute

此时,输出结果

traceroute to baidu.com (220.181.38.148), 30 hops max, 60 byte packets
 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  * * *

这些信息包含了文件从本地系统到路由器3次往返时间。对于那些因为路由器配置、网络堵塞或是防火墙等原因不提供信息的路由器,直接用星号表示,否则输出主机名、IP地址以及运行状态信息。

# netstat -检查网络设置及相关统计数据

netstat程序可以用于查看不同的网络设置及数据。通过其丰富的选项可以查看网络的许多信息。

  1. 使用-ie选项,可以检查网络中的网络接口信息
netstat -ie

执行命令,输出如下信息。

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 1500
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0xfe<compat,link,site,host>
        loop  (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

wifi0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.0.104  netmask 255.255.255.0  broadcast 192.168.0.255
        inet6 fe80::fcd5:21b7:3787:d528  prefixlen 64  scopeid 0xfd<compat,link,site,host>
        ether 48:89:e7:e5:42:37  (Ethernet)
        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

以上信息中,第一个称为lo,是系统用来自己访问自己的回环虚拟接口。

  1. 使用-r选项显示内核的网络路由表
netstat -r

执行命令,输出如下结果

Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
loopback        0.0.0.0         255.0.0.0       U         0 0          0 lo
127.0.0.1       0.0.0.0         255.255.255.255 U         0 0          0 lo
127.255.255.255 0.0.0.0         255.255.255.255 U         0 0          0 lo
224.0.0.0       0.0.0.0         240.0.0.0       U         0 0          0 lo
255.255.255.255 0.0.0.0         255.255.255.255 U         0 0          0 lo
0.0.0.0         192.168.0.1     255.255.255.255 U         0 0          0 wifi0
224.0.0.0       0.0.0.0         240.0.0.0       U         0 0          0 wifi0
255.255.255.255 0.0.0.0         255.255.255.255 U         0 0          0 wifi0
192.168.0.255   0.0.0.0         255.255.255.255 U         0 0          0 wifi0
192.168.0.0     0.0.0.0         255.255.255.0   U         0 0          0 wifi0
192.168.0.104   0.0.0.0         255.255.255.255 U         0 0          0 wifi0

# wget-非交互式网络下载工具

wget是一个用于文件下载的命令行程序。该命令既可以从网站上下载内容,也可以用于从FTP站点下载单个、多个或整个网站。

  1. 下载页面
wget http://linuxcommand.org/index.php

可以看到,输出如下结果

--2019-08-07 22:54:37--  http://linuxcommand.org/index.php
Resolving linuxcommand.org (linuxcommand.org)... 216.105.38.10
Connecting to linuxcommand.org (linuxcommand.org)|216.105.38.10|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 4005 (3.9K) [text/html]
Saving to: ‘index.php’

100%[==============================================================================>] 4,005       --.-K/s   in 0s

2019-08-07 22:54:44 (133 MB/s) - ‘index.php’ saved [4005/4005]

网站内容被成功下载。

  1. 下载文件
wget http://nginx.org/download/nginx-1.16.0.tar.gz
  1. 下载文件并重命名

当然,我们也可以下载完文件的同时重命名文件名称,其格式如下

wget -O filename url

例如,我们可以下载maven压缩包apache-maven-3.6.1-bin.tar.gz,并改名为apache-maven-3.6.1.tar.gz 。

wget -O apache-maven-3.6.1.tar.gz http://mirror.bit.edu.cn/apache/maven/maven-3/3.6.1/binaries/apache-maven-3.6.1-bin.tar.gz

查看目录文件,可以看到此时磁盘中的文件名称为apache-maven-3.6.1.tar.gz。

  1. wget后台下载文件

使用wget命令后台下载文件也很简单,只需要使用参数-b即可。

wget -b url

当然,wget命令还支持递归下载,后台文件下载以及继续下载部分被下载的文件等操作。

有些时候,我们在下载之前,还需要确认一下下载链接是否有误,确保链接可用。这时,我们通过wget选项--spider来完成测试功能。下面,我们测试一下下载maven的链接。

wget --spider http://mirror.bit.edu.cn/apache/maven/maven-3/3.6.1/binaries/apache-maven-3.6.1-bin.tar.gz

此时,输出如下信息

Spider mode enabled. Check if remote file exists.
--2019-08-07 23:16:29--  http://mirror.bit.edu.cn/apache/maven/maven-3/3.6.1/binaries/apache-maven-3.6.1-bin.tar.gz
Resolving mirror.bit.edu.cn (mirror.bit.edu.cn)... 219.143.204.117, 202.204.80.77, 2001:da8:204:2001:250:56ff:fea1:22
Connecting to mirror.bit.edu.cn (mirror.bit.edu.cn)|219.143.204.117|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 9136463 (8.7M) [application/octet-stream]
Remote file exists.

查看上面的信息,我们可以正常下载文件。

若我们将链接地址修改成错误的地址,再执行一次操作。

wget --spider http://mirror.bit.edu.cn/apache/maven/maven-3/3.6.1/binaries/apache-maven-3.6.1.tar.gz

再次测试一下,返回如下结果

Spider mode enabled. Check if remote file exists.
--2019-08-07 23:20:26--  http://mirror.bit.edu.cn/apache/maven/maven-3/3.6.1/binaries/apache-maven-3.6.1.tar.gz
Resolving mirror.bit.edu.cn (mirror.bit.edu.cn)... 202.204.80.77, 219.143.204.117, 2001:da8:204:1::22
Connecting to mirror.bit.edu.cn (mirror.bit.edu.cn)|202.204.80.77|:80... connected.
HTTP request sent, awaiting response... 404 Not Found
Remote file does not exist -- broken link!!!

看到最后一句话,可以看到文件apache-maven-3.6.1.tar.gz不存在,这个链接有问题。

当然,在几种情况下,我们也是可以使用--spider选项的。

  • 定时下载之前进行检查
  • 间隔检测网站是否可用
  • 检查网站页面的死链接

总之,wget命令是一个非常强大的命令行程序。

# 第十七章 文件搜索

本章将介绍文件搜索的两个命令locatefind命令。

# locate-根据文件名查找文件

locate命令通过快速搜索数据库,以寻找路径名与给定字符串相匹配的文件,同时输出匹配的结果。例如:查询bin目录下以zip开头的文件。

locate bin/zip

有时候,我们可以使用locate命令结合grep命令完成搜索功能。

locate bin | grep bin

注意:locate的搜索数据库由updatedb程序创建,并且该程序以一个定时任务执行,多数系统每天执行一次更新搜索数据库,所以不能保证搜索数据库是实时更新的。

# find-较复杂方式查找文件

locate命令查找文件主要是依据文件名查找,而find命令则是根据文件的各种属性在指定的目录及其子目录下进行查找文件。

find命令最简单的使用方法就是用户给定一个或是更多目录名作为其搜索范围,例如:搜索当前系统主目录下的文件。

find ~

当然,它也可以将输出结果作为其它命令的输入。

find ~ | wc -l

find命令可以通过test选项、action选项以及options选项来实现高级搜索。

# 搜索test选项

  • 使用-type选项指定文件类型完成搜索限定。
文件类型 描述
b 块设备文件
c 字符设备文件
d 目录
f 普通文件
l 符号连接
  • 使用-size选项指定文件大小
字母 单位
b 512子节的块
c 字节
w 两个字节的字
k k字节
M MB,兆
G GB
  • 使用-name pattern匹配有特定通配符模式的文件或目录。

# 逻辑操作符

操作符 含义
-and 逻辑与
-or 逻辑或
-not 逻辑非
() 括号操作

# 搜索action选项

动作 含义
-delete 删除匹配文件
-ls 对匹配的文件执行ls操作,以标准格式输出其文件名以及所要求的其他信息
-print 将匹配的文件的全路径以标准形式输出,当没有指定任何操作时,这是默认操作
-quit 一旦匹配成功就退出

# 第十八章 文件归档

LastUpdated: 3/19/2021, 9:45:31 PM