UNIX? 工具一直在变化。本文介绍 10 个有用的工具,其中一些是您以前可能不太关注的工具,一些是新工具。
与日常用语一样,UNIX 工具一直在变化。经常会出现新工具,同时老工具常常会改进以适应新的最佳实践。一些工具非常常用,其他工具不太常用。一些工具经久不衰,有些工具完全过时了。为了顺畅地操作 UNIX,您必须了解最新的 “行话”。
表 1 列出了 对话 UNIX 系列中以前讨论过的 11 个重要的软件包。
表 1. 重要的 UNIX 工具
名称 | 用途 |
---|---|
Cygwin | 一种适用于 Windows? 操作系统的与 UNIX 相似的 shell 和构建环境 |
fish | 一种交互性很强的 shell,具有针对命令名、选项和文件名的自动展开和语法彩色标记功能 |
locate | 构建并搜索所有文件的数据库 |
rename | 对大型文件集合进行批量重命名 |
rsync | 高效地本地或远程同步文件和目录 |
Screen | 创建和管理虚拟的持久的控制台 |
Squirrel | 一种跨平台的脚本编程 shell |
tac | 以相反的次序输出输入,首先输出最后一行(tac 的作用与 cat 相反) |
type | 判断一个命令是别名、可执行程序、内置的 shell 还是脚本 |
wget | 使用命令行下载文件 |
zsh | 一种高级的 shell,提供自动补全、高级的操作数重定向和高级替换 |
在这一期中,我们讨论另外 10 个实用程序和应用程序,它们可以扩展或改进现有的更著名的 UNIX 包。它们涉及从通用存档转换器到高速 Web 浏览器的多个领域。
根据您使用的 UNIX 风格不同,有时候必须安装新的软件包。可以从源代码构建它们,如果包管理软件提供等效的二进制包,也可以直接安装,这会节省时间和精力。例如,如果使用 Debian 风格的 Linux?,那么可以使用 apt-get
直接安装本期讨论的许多实用程序。
用 apropos 寻找命令
UNIX 的命令太多了,所以很容易忘记某个实用程序的名称;对于不常使用的工具,尤其可能出现这种情况。如果您正在努力回想一个命令名,那么试试 apropos(或等效的 man -k)。例如,如果您要找一个计算器,那么只需运行 apropos calculator:
$ apropos calculator
bc (1) – An arbitrary precision calculator language
dc (1) – An arbitrary precision calculator
bc 和 dc 都是命令行计算器。
每个 UNIX 手册页都有简短的描述,apropos 在描述中搜索指定的关键字。关键字可以是字面值(比如 calculator),也可以是正则表达式(比如 calc*)。如果使用后一种形式,那么一定要把表达式放在引号(””)中,以防止 shell 解释特殊字符:
$ apropos “calcu*”
allcm (1) – force the most important Computer-Modern-fonts to be calculated
allec (1) – force the most important Computer-Modern-fonts to be calculated
allneeded (1) – force the calculation of all fonts now needed
bc (1) – An arbitrary precision calculator language
dc (1) – An arbitrary precision calculator
在命令行上运行计算
如上所示,dc 是在每个 UNIX 系统上都可以找到的计算器。如果不带参数运行 dc,就会进入交互模式,可以编写和运算 Reverse Polish Notation (RPN) 表达式:
$ dc
5
6
*
10
/
p
3
但是,可以在命令行上做所有这些工作。指定 -e 选项并提供要运算的表达式。同样,要把表达式放在引号中,以防止 shell 解释它:
$ dc -e “5 6 * 10 /”
3
用 pgrep 寻找进程
您可能无数次使用 ps aux | grep … 寻找进程。这当然是有效的,但是有一种更高效的搜索进程的方法。请试试 pgrep。
例如,以下命令寻找 strike 的所有登录 shell(其中的 strike 是用户名):
$ pgrep -l -u strike zsh
10331 zsh
10966 zsh
pgrep 命令提供筛选选项,允许按用户名(上面给出的 -u)、进程组、组等筛选进程。配套的实用程序 pkill 接受 pgrep 的所有选项和一个信号,它把这个信号发送给与给定的条件匹配的所有进程。
例如,命令 pkill -9 -u strike zsh 与 pgrep -u strike zsh | xargs kill -9 等效。
用 pwgen 生成安全密码
UNIX 中每个重要的子系统都需要自己的密码。电子邮件、远程登录和超级用户特权都需要密码,这些密码最好各不相同而且难以通过自动化攻击猜测或推断出来。另外,如果希望开发生成账户的脚本,就需要一个可靠的随机安全密码来源。
pwgen 实用程序是一个用来生成密码的小程序。可以把密码设定为更容易记忆的或更安全的,还可以指定密码是否包含数字、符号、元音和大写字母。
许多 UNIX 系统都有 pwgen。如果没有,也很容易构建它:
$ # As of March 2009, the latest version is 2.06
$ wget http://voxel.dl.sourceforge.net/sourceforge/\
pwgen/pwgen-2.06.tar.gz
$ tar xzf pwgen-2.06.tar.gz
$ cd pwgen-2.06
$ ./configure && make && sudo make install
下面是一些使用示例:
输出容易记忆的密码集合: $ pwgen -C
ue2Ahnga Soom0Lu0 Hie8aiph gei9mooD eiXeex7N
Wid4Ueng taShee3v Ja3shii8 iNg0viSh iegh5ouF
…
zoo8Ahzu Iefev0ch MoVu4Pae goh1Ak6m EiJup5ei
生成一个安全的密码: $ pwgen -s -1
oYvy9WWa
生成一个安全的密码,其中不包含含糊(即容易混淆的)字符,至少包含一个非字母数字字符: $ ./pwgen -s -B -1 -y
7gEqT_V[
输入 pwgen –help 可以查看所有可用选项。
用 multitail 查看许多文件
无论您是调试新代码的开发人员,还是监视系统的系统管理员,都常常需要同时查看许多东西。如果您是开发人员,为了寻找 bug,可能要查看调试日志和 stdout;如果您是管理员,可能要根据需要调整策略活动。这些任务常常需要在屏幕上显示许多窗口;例如,在一个窗口中执行 tail,在另一个窗口中执行 less,在第三个窗口中显示命令提示。
如果必须同时监视多个文件,那么可以考虑使用 multitail。顾名思义,这个实用程序把一个控制台窗口分割为多个部分,每个日志文件一个部分。更棒的是,multitail 可以给已知的格式加颜色标记(还可以定义定制的颜色方案),可以把多个文件合并成一个流。
为了构建 multitail,需要下载源代码、解压它并运行 make。(发行版的通用 makefile 中的选项对于大多数 UNIX 系统应该足够了。如果 make 运行失败,那么在顶层目录中寻找适合自己系统的 makefile)。
# As this article was written, the latest version of multitail was 5.2.2
$ wget http://www.vanheusden.com/multitail/multitail-5.2.2.tgz
$ tar xzf multitail-5.2.2.tgz
$ cd multitail-5.2.2
$ make
$ sudo make install
下面是 multitail 的一些使用示例:
为了在同一窗口中查看多个日志文件,用一个文件名列表启动这个实用程序,比如 multitail /var/log/apache2/{access,error}.log。
为了在同一窗口中查看两个文件并缓冲读取的所有信息,使用 -I 选项把指定的文件与另一个文件合并,比如 multitail -M 0 /var/log/apache/access.log -I /var/log/apache/error.log。在这里,把 Apache 错误日志和访问日志合并在一起。-M 0 记录输入的所有数据;在任何时候,按 B 键即可看到缓冲区。
还可以组合命令和文件。例如,为了查看一个日志文件并监视 ping 的输出,可以使用 multitail logfile -l “ping 192.168.1.3″。这会在同一控制台中创建两个视图:一个视图显示 logfile 的内容,另一个视图显示 ping 192.168.1.3 的输出。
除了命令行选项之外,multitail 还提供一组交互式命令,它们影响显示的当前状态。例如,在显示中按 A 键可以添加新的日志文件。按 B 键显示保存的缓冲区。按 Q 键退出 multitail。命令的完整列表见 multitail 的手册页。
用 7zip 压缩和解压几乎任何格式
Windows 和 UNIX 各有多种流行的存档格式。Windows 常常使用 .zip 和 .cab 格式,UNIX 有 .tar、.cpio 和 .gzip 格式。UNIX 及其变体还使用 .rpm、.deb 和 .dmg。这些格式在网上都很常见,局面比较混乱。
为了以任意格式保存或解压数据,可以安装一大堆专用的实用程序,也可以安装 7zip。它是一种通用的转换器,可以压缩和解压任何存档。另外,7zip 还提供自己的格式,这种格式的压缩率比任何其他方案都高,容量限制达到 TB 级,支持强大的数据加密。
为了构建 7zip,需要从 SourceForge 上的项目页面下载 p7zip(7zip 的 UNIX 版本)的源代码(见 参考资料)。解压 tarball,进入源代码目录,运行 make。(与 multitail 相似,通用的 makefile 应该足够了;如果构建不成功,应该选择提供的专用 makefile 之一)。
$ wget http://voxel.dl.sourceforge.net/sourceforge/p7zip/\
p7zip_4.65_src_all.tar.bz2
$ tar xjf p7zip_4.65_src_all.tar.bz2
$ cd p7zip_4.65
$ make
$ sudo make install
构建过程会生成并安装实用程序 7za。输入不带参数的 7za,即可看到可用命令和选项的列表。与 tar 相似,每个命令都是一个字母,比如 a 在存档中添加文件,x 提取文件。
为了试试这个实用程序,以多种格式创建 p7zip 源代码的存档,然后用 7za 解压每个存档:
$ zip -r p7.zip p7zip_4.65
$ 7za -ozip x p7.zip
$ tar cvf p7.tar p7zip_4.65
$ 7za -otar x p7.tar
$ bzip2 p7.tar
$ 7za -so x p7.tar.bz2 | tar tf –
从上到下,7za 依次解压 .zip、.tar 和 .bz2 存档。在最后一个命令中,7za 解压 .bz2 存档并把输出写到 stdout,在这里 tar 解压文件并编制目录。与 tar 相似,7za 可以作为管道(|)的源或目的地,因此很容易与其他实用程序组合在一起。
用 zcat 查看压缩的文件
单个磁盘的容量现在已经超过了 1TB,但是大型数据文件、日志文件、图像以及电影等媒体文件很快就把磁盘装满了。为了节省空间,可以把许多文件压缩到原大小的几分之一。例如,Apache 日志文件(是简单的文本)可以压缩到原大小的十分之一。
尽管压缩可以节省磁盘空间,但是也会增加工作量。例如,如果需要分析压缩的 Apache 日志文件,就必须解压它,处理数据,然后重新压缩它。如果有大量日志文件(如果保留分析趋势所需的记录,这种情况很常见),那么开销会非常大。
幸运的是,gzip 套件包含许多可以 “在原地” 处理压缩文件的实用程序。zcat、zgrep、zless、zdiff 等实用程序的作用分别与 cat、grep、less 和 diff 相同,但是它们操作压缩的文件。
下面,用 gzip 压缩两个源代码文件并用 zdiff 进行比较:
$ cat old
This
is
Monday.
$ cat new
This
is
Tuesday.
$ gzip old new
$ zdiff -c old.gz new.gz
*** – 2009-03-30 22:26:34.518217647 +0000
— /tmp/new.10874 2009-03-30 22:26:34.000000000 +0000
***************
*** 1,3 ****
This
is
! Monday.
— 1,3 —-
This
is
! Tuesday.
用 cURL 在 Internet 上做各种事情
以前的一期 “对话 UNIX” 推荐使用 wget
从命令行直接下载文件。在无法使用 Web 浏览器的情况下,在 shell 脚本中使用 wget
是非常合适的。例如,如果要在远程服务器上安装新软件,wget
确实可以节省时间。
如果您喜欢 wget
,也一定会喜欢 cURL。与 wget
一样,cURL 可以下载文件,但是它还可以向 Web 页面表单提交数据、通过 File Transfer Protocol (FTP) 上传文件、作为代理、设置 Hypertext Transfer Protocol (HTTP) 头等等。cURL 在许多方面可以作为浏览器和其他客户机的命令行替代品。因此,它有许多潜在的应用。
通过常用的 ./configure && make && sudo make install
过程构建 cURL 实用程序。下载、解压并处理:
$ wget http://curl.haxx.se/download/curl-7.19.4.tar.gz |
cURL 实用程序有很多选项,最好通读它的手册页。下面是一些常见的 cURL 用法:
- 为了下载一个文件(比如 cURL tarball 本身),使用:
$ curl -o curl.tgz http://curl.haxx.se/download/curl-7.19.4.tar.gz
与
wget
不同,cURL 把它下载的东西发送到 stdout。使用-o
选项把下载的东西保存到指定的文件。
- 为了下载大量文件,可以提供序列、集或同时提供这两者。序列 是放在方括号(
[]
)中的一个数字范围;集 是放在花括号({}
)中的逗号分隔的列表。例如,下面的命令从目录 archive1996/vol1 到 archive1999/vol4(含)下载名为 parta.html、partb.html 和 partc.html 的所有文件,共有 48 个文件。
$ curl http://any.org/archive[1996-1999]/vol[1-4]/part{a,b,c}.html -o “archive#1_vol#2_part#3.html”
在指定序列或集时,可以提供
-o
选项和一个模板,模板中的#1
替换为第一个序列或集的当前值,#2
是第二个序列或集的占位符,以此类推。另外,还可以提供-O
选项以保持每个文件名不变。
- 为了把一组图像上传到服务器,可以使用
-T
选项:
$ curl -T “img[1-1000].png” ftp://ftp.example.com/upload/
在这里,把
img[1-1000].png
放在引号中,以避免 shell 解释它。这个命令把 img1.png 到 img1000.png 上传到指定的服务器和路径。
- 甚至可以用 cURL 在词典中查找单词:
$ curl dict://dict.org/d:stalwart
220 miranda.org dictd 1.9.15/rf on Linux 2.6.26-bpo.1-686
<auth.mime> <400549.18119.1238445667@miranda.org>
250 ok
150 1 definitions retrieved
151 “Stalwart” gcide “The Collaborative International Dictionary of English v.0.48″
Stalwart \Stal”wart\ (st[o^]l”w[~e]rt or st[add]l”-; 277),
Stalworth \Stal”worth\ (-w[~e]rth), a. [OE. stalworth, AS.
staelwyr[eth] serviceable, probably originally, good at
stealing, or worth stealing or taking, and afterwards
extended to other causes of estimation. See {Steal}, v. t.,
{Worth}, a.]
Brave; bold; strong; redoubted; daring; vehement; violent. “A
stalwart tiller of the soil.” –Prof. Wilson.
[1913 Webster]Fair man he was and wise, stalworth and bold. –R. of
Brunne.
[1913 Webster]Note: Stalworth is now diSUSEd, or but little used, stalwart
having taken its place.
[1913 Webster]
.
250 ok [d/m/c = 1/0/20; 0.000r 0.000u 0.000s]
221 bye [d/m/c = 0/0/0; 0.000r 0.000u 0.000s]
把单词 stalwart 替换为您要查找的单词。
除了通过命令行使用之外,还可以通过 libcurl 库使用 cURL 的所有功能。许多编程语言包含 libcurl 的接口,可以自动执行通过 FTP 传输文件等任务。例如,下面的 PHP 片段使用 libcurl 把通过表单上传的文件存放到 FTP 服务器上:
<?php |
如果必须自动执行任何 Web 访问,可以考虑使用 cURL。
使用 lighttpd 服务器实现更小的站点
XAMPP 和许多软件组合都包含 Apache HTTP Server。Apache 确实是出色的 Web 服务器,根据统计,世界上的大多数站点都使用它。它还有许多扩展,可以添加各种子系统并与编程语言紧密地集成。
但是,Apache 并非惟一的 Web 服务器,而且在某些情况下它并不是最合适的。复杂的 Apache 实例需要占用相当多的内存,这限制了吞吐量。另外,即使是小的 Apache 实例也可能得不偿失。
lighttpd(读音是 “lighty”)是一种小型的、非常高效的 Apache 替代品,它具有安全性、速度、兼容性和灵活性。更好的是,lighttpd 配置文件比 Apache 的配置文件简单得多。
从头构建 lighttpd 有点儿复杂,因为它依赖于其他一些库。至少需要 Perl Compatible Regular Expression (PCRE) 库和 Zlib 压缩库的开发版本(这个版本包含头文件)。在安装(或从头构建)这些库之后,编译 lighttpd 就很简单了:
$ # Lighttpd requires libpcre3-dev and zlib1g-dev |
接下来,必须创建一个配置。最简单的配置只需设置文档根、服务器端口、几个 Multipurpose Internet Mail Extension (MIME) 类型以及守护进程的默认用户和组:
server.document-root = “/var/www/lighttpd/host1” |
假设把这段文本保存到 /opt/etc/lighttpd.conf 文件中。用 lighttpd -D -f /opt/etc/lighttpd.conf
启动 lighttpd。
与 Apache 相似,lighttpd 可以支持虚拟主机。通过使用一个条件,只需三行即可建立一个虚拟主机:
$HTTP[“host”] == “www2.example.org” { |
在这里,如果主机名为 www2.example.org,就使用替代的文档根。
lighttpd 尤其适合管理大量并行请求。可以把 lighttpd 与 Rails、PHP 等结合起来。
结束语
这期的 “对话 UNIX” 结束了。准备好键盘,打开网络连接,开始下载吧!
SQLite:适合大多数场合的数据库
UNIX 提供多种数据库,其中许多是开放源码的,一些数据库适用于各种应用程序,一些数据库是专用的。但是,大多数数据库是很大的独立应用程序(例如,MySQL 需要单独的安装、一些配置和它自己的守护进程),对于许多软件可能不需要使用这么复杂的数据库。请考虑一个在桌面上使用的地址簿程序:它适合部署 MySQL 来存储姓名和电话号码吗?可能不适合。
另外,如果应用程序要在非常小的设备或能力很有限的计算机上运行,那么应该怎么办?这类硬件可能不支持多处理、大量内存占用或对物理存储的大量需求。显然,可以使用嵌入式数据库。通常情况下,嵌入式数据库打包为库,与应用程序代码直接链接。这种解决方案让应用程序独立于外部服务,但是也要付出一定的代价:通常不能用 Structured Query Language (SQL) 表达查询。
SQLite 结合了这两方面的优势:这个软件很小,可以把它嵌入任何应用程序,同时可以用 SQL 查询数据。PHP 和 Ruby on Rails 使用 SQLite 作为默认的存储引擎,Apple iPhone 也是如此。
为了构建 SQLite,需要从 SQLite 下载页面下载源代码集(由所有源代码组成的单一文件)、解压它并运行 ./configure && make && sudo make install。
$ # As of March 2009, the latest version was 3.6.11.
$ wget http://www.sqlite.org/sqlite-amalgamation-3.6.11.tar.gz
$ tar xzf sqlite-amalgamation-3.6.11.tar.gz
$ cd sqlite-3.6.11
$ ./configure && make
$ sudo make install
构建过程生成一个库和相关联的应用程序编程接口 (API) 头文件,以及一个单独的命令行实用程序 sqlite3,它有助于研究特性。用数据库名启动 sqlite3 即可创建数据库。甚至可以在命令行上直接放上 SQL,这对于脚本编程非常有意义:
$ sqlite3 comics.db “CREATE TABLE issues \
(issue INT PRIMARY KEY, \
title TEXT NOT_NULL)”
$ sqlite3 comics.db “INSERT INTO issues (issue, title) \
VALUES (‘1’, ‘Amazing Adventures’)”
$ sqlite3 comics.db “SELECT * FROM issues”
1|Amazing Adventures
第一个命令创建数据库(如果数据库还不存在的话)和一个表,这个表包含两列 —— 期号和标题。第二个命令插入一行,最后一个命令显示表的内容。
SQLite 提供触发器、日志记录和序列。SQLite 还是无类型的,除非您指定类型。例如,这里声明的 issues 表没有类型,但是仍然可以正常工作:
$ sqlite3 comics.db “create table issues (issue primary key, title)”
$ sqlite3 comics.db “INSERT INTO issues (issue, title) \
VALUES (1, ‘Amazing Adventures’)”
$ sqlite3 comics.db “SELECT * FROM issues”1|Amazing Adventures
没有类型是一个特性,而不是 bug,它有许多应用。
XAMPP,一个现成的 Web 软件组合
如果要使用 UNIX 计算机作为 Web 服务器,就需要选择 Web 软件组合。当然,最常用的软件组合是 Apache HTTP Server、MySQL、Perl、PHP、Python 和 Ruby on Rails。本文推荐您以前可能没有听说过的一些组件,包括 SQLite 和 lighttpd。
但是,从头构建软件组合并不适合所有人。配置 Apache 和其他软件包有时候很让人头疼,而且您可能不愿意自己维护源代码并在每次发布新补丁时重新编译。由于这些原因,可以选择现成的软件组合。只需安装即可直接使用!
XAMPP 是在网上可以找到的众多预打包 Web 软件组合之一。它包含 Apache 以及 MySQL、PHP 和 Perl 的兼容构建。有适用于 Linux、Sun Solaris、Windows 和 Mac OS X 的 XAMPP 版本。下载 XAMPP、解压它并启动:
# The latest version for Linux was 1.7 |
第二个命令解压 XAMPP 发行版并把它直接放在 /opt 中(因此需要在命令前面加上 sudo
)。如果希望把 XAMPP 放在其他地方,那么应该修改 -C
的参数。最后一个命令启动 Apache 和 MySQL,这是支持 Web 站点所需的两个守护进程。为了测试安装,只需在浏览器中访问 http://localhost。应该会看到与 图 1 相似的页面。
图 1. XAMPP 启动页面
单击 Status 查看运行状态。XAMPP 提供 phpMyAdmin 和 webalizer,它们分别用来在服务器上创建和管理 MySQL 数据库以及测量 Web 流量。
顺便说一句,XAMPP 还提供软件组合的完整源代码,所以如果需要的话,可以对它应用定制或添加新组件。XAMPP 源代码展示了如何构建软件组合,您可以据此调整或定制构建过程。