在Unix下用命令行中完成所有的工作

UNIX 命令行是一种WYTIWYG(即所输即所得)的接口。UNIX 提供了大量的命令,使用这些命令,您可以对内核和用户空间中各种可用的资源进行操作。您需要对 CPU 的使用情况进行监视吗?可以尝试使用 top 或 ps。您需要删除所有以 .bak 结尾的文件吗?可以尝试使用 rm .bak。您需要获得关于一个新的命令的帮助吗?可以运行 man。

但是,当您所需要的资源位于广域网 和全球 Internet 中的远程系统时,那又应该如何处理呢?这里引用 The Hitchhiker‘s Guide to the Galaxy 中的一句话,“您不必惊慌失措”。通过 UNIX 命令行可以很轻易地和上传文件、连接到远程计算机并询问遥远的服务器和网络的状态。请做好预备:让我们开始一次“太阳系外”的奇妙旅行。

在本地进行工作,将传输到全球

在本系列的第 1 部分和第 2 部分中,您了解了使用 UNIX 命令行可以完成各种各样的工作。只需要输入相应的内容,包括管道 或重定向,您就可以创建即兴的数据处理器,从而实现比将其中的这些部分简单地加在一起更强大的功能。

尽管日常使用的某些资源很可能位于本地,即位于您的工作站中,但是相当数量的、并且越来越多的资产(如文件、电子邮件消息和工具)可能存储在远程系统中,即位于连接到您的 WAN 或者 Internet 的计算机中。Web 浏览器提供了对这些资源的通用访问方式,但是有一点需要注重:指向-点击很快会变得令人厌倦,甚至很麻烦,非凡是当您必须对大量的条目进行检索时。而且,假如您希望使用脚本 来完成重复性的或轻易出错的任务时(从本质上说,是进行捕捉和重放),窗口浏览器并不是一种好的工具。

与 ls、cp、mail、uptime、du manage 和 query local resources 一样,UNIX 还提供了一套用于访问远程资源的命令行工具。本文将向您介绍其中的一些工具,包括一个有用的技巧,它可以简化对远程系统的访问并保护您的身份验证凭据。具体来说,您将了解 wget、curl 和安全 Shell 。wget 和 curl 工具可以用来传输文件,而使用 ssh,您可以安全地登录到远程系统中,快速地和轻松地传输文件。

Telnet(和其他工具)存在的问题

假如您的系统中运行了 rsh(或者其变种——rcp、rexec、rlogin 或 Irdist)或 telnet,那么请立即禁用并删除这些命令以及相关的守护进程。另外,假如您不答应使用匿名文件传输协议 ,请同时禁用 FTP 软件。

rsh 和 FTP 的漏洞

有关 rsh 和 FTP 中可能存在的漏洞的更具体的和说明,请参阅“Security Vulnerability between FTP and Berkeley Rsh/Rlogin Protocols”和“Stupid, Stupid Protocols:Telnet, FTP, rsh/rcp/rlogin”。

尽管 rsh 和 telnet 在 UNIX 中使用了很长的时间,但是攻击者可以轻松地利用这两种实用工具的其中之一来危害您的系统。当发现该软件正在运行时,您或您的系统治理员应该停止并删除它,并使用 ssh 来代替这些包。

对于特权 FTP 访问,可以使用 sftp。将 rdist 替换为更高级的 rsync。或者,假如您必须提供匿名 FTP(或通过 HTTP 进行),请确保使用防火墙硬件和软件将所有可以公开访问的计算机与敏感的内部服务器隔离。

但是首先,让我们来讨论一下密码所带来的讨厌的问题。

“您不需要讨厌的密码!”

通常,对大多数计算机和服务的访问都受到保护。在有些情况下,进行身份验证(从而获得访问该系统的权限)可能需要复杂的质询-响应交换、安全套接字层 证书、甚至生物测定扫描。然而在一般情况下,通过密码就可以获得访问权限。与您的个人识别号码 相同,您的密码也是保密的,假如您选择了合适的密码,那么其他的人将很难猜到它。将您的用户名和强密码组合在一起,这样可以提供足够的安全性加强。

当然,强密码可能难以记住,并且当您需要收集和记住另一个 8 字符的密钥(数字、标点符号及其组合)时,情况变得更复杂。反复地输入同一个密码会让人感到讨厌,更糟糕的是,它极大地阻碍了自动化的实现。

正因为熟悉到这些阻碍的存在,所以许多命令行实用工具都答应您将用户名和密码作为命令行参数。例如,您可以使用下面的命令登录到一个 FTP 站点,而无需进行人工干预:

ftp ftp://joe:passwd@www.example.com

 

然而,使用这种方法可能会将您的凭据泄漏给共享该计算机的其他用户。(可以尝试使用 ps -Aeww,例如,查看完整的命令行和系统中每个进程的环境。)

为了提供与命令行相同的简洁性,而又不会带来危险,许多程序可以从一个名为 .netrc(读做 net-r-c)的文件中读取您的凭据,该文件通常位于 ~/.netrc 目录中。您的 .netrc 文件必须仅具有所有者读写模式(即模式 0600 或者 -rw-------),并且该文件中的每个条目都必须遵守下面这种简单的语法格式:

machine ftp.example.com login zaphod password ITrillian!machine www.magazine.com login abner password MmG8ytrdefault login anonymous password zaphod@heartofgold.com

 

前面两行提供了 machine 关键字和该计算机的域名、login 关键字和您在该计算机上的登录名、password 关键字以及紧跟其后的登录密码。最后一行中的凭据为任何没有专门指定的系统提供了缺省值。default 行必须是您的 .netrc 文件中的最后一行。(有关 .netrc 文件完整的配置选项,可以输入 man 5 netrc 以查看 .netrc 的 man 页面。)

显然,假如文件中包含任何标识数据,那么请确保它仅具有用户读写模式(模式 600)或用户只读模式(模式 400),以防止意外地覆盖或删除该文件。您可能还希望使用模式 700 来保护您的 home 目录。

现在,每当您启动一个支持 .netrc 的应用程序(包括接下来将要讨论的那些应用程序)时,会自动地将登录名和密码传递给所需的服务,而无需通过键盘进行输入。通常,您可以使用 -n 选项禁用这种自动登录 特性。

传递的过程

除了用于浏览 Web 页面的 HTTP 和基于 SSL 的 HTTP 外,FTP 是最常用的 Internet 应用程序协议之一。通过 FTP,客户端可以连接到服务器、获取目录和文件的列表、文件(即,从服务器请求一个文件)或上传文件(即,向服务器发送一个文件,以进行持久保存)。ftp://ftp.example.com/path/to/anotherfile.zip 和 ftp://user:password@ftp.example.com/path/to/file.zip URL 格式表示,使用 FTP 协议连接到 ftp.example.com 并 /path/to/anotherfile.zip 文件。后面的这个 URL 简单地为登录添加了相应的凭据。

在大多数桌面计算机中,这两种 URL 将启动浏览器或缺省的 FTP 应用程序来指定的文件。然而,在 wget 命令行实用工具中也可以使用相同的 URL,它是一种用于通过 HTTP、HTTPS 和 FTP 进行文件的健壮的实用工具。它支持 .netrc 文件,并且无需进行交互,对于实现自动化来说,使用它非常合适。假如您的系统中没有 wget,您可以从 GNU Software Foundation 其源代码。它包含几个简单的命令,适用于所有的 UNIX 变种,您可以将这个实用工具放到您个人的 bin 目录或者某个中心目录。

假设已经有了 .netrc 文件,让我们来研究一些示例,看看 wget 究竟可以完成哪些工作。(在下面的示例中,提供了相应的行号以供参考,您不需要输入这些数值。)清单 1 显示了如何在命令行中轻松地使用 wget 来文件。

 

 


清单 1. 在命令行中使用 wget 文件

 1 $ wget http://ftp.gnu.org/pub/gnu/wget/wget-1.10.2.tar.gz--16:02:29--http://ftp.gnu.org/pub/gnu/wget/wget-1.10.2.tar.gz = `wget-1.10.2.tar.gz‘Resolving ftp.gnu.org... 199.232.41.7Connecting to ftp.gnu.org[199.232.41.7]:80... connected.HTTP request sent, awaiting response... 200 OKLength: 1,213,056 [application/x-tar]100%[=====================] 1,213,056531.22K/s 16:02:37  - `wget-1.10.2.tar.gz‘ saved [1213056/1213056]2 $ wget -q ftp://mirror.linux.duke.edu/pub/centos/4.3/os“/i386/RELEASE-NOTES-en.html3 $ cat url_list.txthttp://www.wikipedia.comhttp://valdez.barebones.com/pub/freeware/TextWrangler_2.1.3.dmg4 $ wget -i -nv url_list.txt16:06:00 URL:http://www.wikipedia.org/ [33606] - "index.html" 16:06:41 URL:http://valdez.barebones.com/pub/freeware/TextWrangler_2.1.3.dmg [9488296/9488296] - "TextWrangler_2.1.3.dmg" FINISHED --16:06:41--Downloaded: 9,521,902 bytes in 2 files5 $ lsRELEASE-NOTES-en.html index.htmlwget-1.10.2.tar.gzTextWrangler_2.1.3.dmgurl_list.txt

 

命令 1 通过 HTTP 从该项目的主页最新的 wget 源代码。在缺省情况下,wget 将向您报告的过程。您可以使用 -q(表示 quiet 模式)选项来禁止所有的消息。命令 2 通过 FTP 获取 CentOS 的发布说明,同样也使用了 quiet 模式。

假如有很长的 URL 列表需要进行,您不需要分别将每个 URL 放到命令行中。相反,您可以创建(或生成)需要进行的 URL 列表。命令 3 显示了 url_list.txt 文件,简单的文本目录中包含了两个 URL;命令 4 则对这两个 URL 进行。在提供列表时,可以使用 -i 选项。-nv 选项(not verbose 的首字母缩写)则提供更简洁的消息。

除非您为的文件提供了相应的文件名(使用 -o 选项),否则 wget 将创建一个与远程文件名称相同的新的本地文件,而省略前面的 URL 部分。命令 5 显示了在命令 1 到 3 中的 4 个文件。

wget 实用工具有许多选项和特性。它可以访问 FTP 或 Web 站点,并具有层次结构的所有文件。您还可以为自动设置相应的配额、提供 cookies、并继续进行以前被中断的任务。要了解关于使用该工具的技巧,请阅读 wget 的 man 页面。

进行上传

对于自动的任务,wget 实用工具非常有价值,但是它却不能用来上传文件。它也不能够与安全 FTP、telnet 和大量其他的(更早的和更少使用的)Internet 协议进行互操作。对于这些类型的传输工作,您必须使用“瑞士军刀”般锐利的网络工具: curl。

curl 命令行实用工具可以获取和上传数据,所以它非常适合于将本地文件传输到远程服务器。然而更有价值的是,curl 的基础是 libcurl 库,该库提供了丰富的应用程序编程接口 ,答应您将各种 curl 特性集成到您自己的应用程序中。C、C++、PHP 和 Perl,这是许多语言中能够利用 libcurl 的 4 种编程语言。假如您的系统中没有 curl 和 libcurl,您可以从 libcurl 主页其源代码。

因为 curl 可以将本地文件复制到远程服务器,所以它非常适合用于完成少量的备份工作。例如,清单 2 介绍了一个 Shell 脚本,出于安全考虑,它可以用来将一个装满了数据库转储的目录复制到远程 FTP 服务器。


清单 2. 使用 curl 以远程的方式保存数据库转储

 foreach db /usr/bin/mysqldump --ppassword --add-drop-table -Q --complete-insert $db  $db.sql endfind dbs -mtime -1 -type f -name ‘.sql‘ -print  foreach file curl -n -T $file ftp://ftp1.archive.example.comend

 

curl -n 命令强制 curl 读取您的 .netrc 文件。-T 选项告诉 curl 将指定的文件上传到给定的 URL。假如您省略了目标文件名,那么 curl 将简单地重用上传文件的名称。

正如您可能猜测到的,curl 具有比 wget 更多的选项。您需要阅读 curl 的 man 页面,并将其记在心中。curl 项目还维护了一份使用列表,其中包括关于如何使用 HTTP POST 和 PUT 命令、如何提供登录凭据、如何使用 SSL 证书、以及如何调试 curl 请求的说明。一个简单的技巧:尝试使用 curl -v --trace-ascii ... 来生成跟踪。

 

 

 

六处需要说明的地方

现代计算任务的完成在很大程度上依靠于各种型号、规模和服务的计算机之间无数的互连。实际上,即使在一个小型的计算环境中,也可能有一台计算机专门负责电子邮件,另一台计算机负责提供 Web 页面,而其他的计算机则用来执行更专门的任务。在这种环境中(通常使用局域网 、WAN 或虚拟专用网 进行连接),天天都需要登录到不同的计算机。系统治理员需要不停地从一台计算机转到另一台计算机,但是对于开发人员和其他的用户来说,通常则需要登录到不同的计算机以实现对关键的应用程序的远程访问。

X Window System 和现有的桌面软件使得远程访问变得相当透明:窗口仅仅只是窗口,而基础应用程序可以运行于任何计算机。这里再次说明,即使在这个以鼠标为中心的环境中,命令行也还是有其一席之地的。例如,如何轻松地在多台计算机上运行相同的命令呢?或者,更简单地说,如何在远程系统中启动一个 xterm 窗口呢?

提供远程系统访问正是 ssh 及其派生工具(scp 和 sftp)的任务。ssh 是 rsh 的安全版本,而 scp 和 sftp 则分别是 rcp 和 FTP 的安全替代。它为什么是安全的呢?ssh 及其变种提供了更强的身份验证机制,并使用您所选择的几个密码对所有的通信内容进行加密。即使有人探查 您的网络,ssh 通信数据对他们来说也毫无意义。

ssh 最简单的用法是 ssh hostname。该命令将连接到 hostname,并提示您输入登录名和密码。在提供了正确的凭据之后,您就可以登录到系统中:

 $ ssh web.example.comLogin: arthurPassword:  $

 

假如您只需要在远程系统中运行一个命令,那么就不需要进行登录。只需将该命令作为 ssh 的参数即可。例如,清单 3 中所示的命令用于在远程计算机上运行 hostname -a -v。


清单 3. 使用 ssh 在远程系统中运行命令

  $ ssh db.linux-mag.com hostname -a -vLogin: vogonPassword: dbgethostname=`db.linux-mag.com‘Resolving `db.linux-mag.com‘ ...Result: h_name=`db.linux-mag.com‘Result: h_aliases=`db‘Result: h_addr_list=`64.34.170.230‘

 

ssh 建立到 db.linux-mag.com 的连接,然后将 hostname -a -v 参数传递到远程计算机,该参数将运行这个命令并将输出返回到本地计算机。

ssh 还为将文件和整个目录从一台计算机复制到另一台计算机提供了一种便捷的方法。scp 与 cp 一样很轻易使用。这里有一个示例:

 $ scp -p -r ~/myproject web.example.com:

 

这个命令将 ~/myproject 目录复制到 web.example.com。假如您省略了目标路径名,那么将把这些文件复制到 home 目录。-p 选项保持所有文件的日期和时间戳,而 -r 则启动递归 模式,这样一来,scp 将进入并复制所有的子目录。

顺便提一下,前面的 scp 命令等价于:

 $ tar czf - ~/myproject  ssh www.example.com tar xvzf - Login: deepthoughtPassword: 

 

是的,您可以通过管道将本地命令的输出传递给远程命令(反之亦然)。

您可能已经厌倦了这些密码输入提示。同样,这些反复出现的提示将降低工作效率并影响自动化的实现。您也可能厌倦了一次又一次地输入冗长的用户名。幸运的是,ssh 支持公钥或私钥身份验证和系统别名。

下面,让我们使用 DSA 加密方案来设置公钥或私钥对。要完成这项工作,您必须生成密钥对,将公钥复制到远程系统,并将它添加到已知密钥列表中,然后对其进行验证,如清单 4 所示。


清单 4. 创建并安装公钥或私钥

 1 $ cd ~2 $ mkdir .ssh3 $ chmod 700 .ssh4 $ cd .ssh5 $ ssh-keygen -t dsa Generating public/private dsa key pair.Enter file in which to save the key : ./id_dsaEnter passphrase : Enter same passphrase again: Your identification has been saved in ./id_dsa.Your public key has been saved in ./id_dsa.pub.The key fingerprint is:40:6c:26:e7:53:df:d1:7b:c4:79:c5:a8:cd:6b:fe:8e mstreicher@db.linux-mag.com6 $ lsid_dsaid_dsa.pub7 $ chmod 600 8 $ scp id_dsa.pub www.example.com:Login: marvinPassword: id_dsa100%668 0.7KB/s 00:009 $ ssh www.example.comLogin: marvinPassword: A $ mkdir .sshB $ chmod 700 .sshC $ cd .sshD $ cat ../id_dsa.pub  authorized_keysE $ rm ../id_dsa.pubF $ chmod 600 G $ logout10 $ ssh www.example.coma $ hostnamewww.example.comb $ logout

 

 

 

命令 1 到 3 在您的 home 目录中创建了一个名为 .ssh 的私有本地目录。这个目录的模式必须为 700,否则 ssh 无法使用公钥或私钥身份验证。(您可以看到,步骤 A 到 C 对远程计算机运行了相同的命令序列。)命令 5 使用 DSA 创建了密钥对。接下来,保持其中的两个 Passphrase 为空。(它们提供了额外的安全级别,但却添加了一项身份验证步骤。)ssh-keygen 生成两个文件:id_dsa(私钥)和 id_dsa.pub(公钥)。步骤 6 显示了这些文件,而步骤 7 则对这两个密钥进行保护。您的密钥的模式必须为 0600 或 0400。

步骤 8 将公钥复制到远程计算机。接下来,您必须输入您的密码,但这是最后一次输入了。命令 A 到 C 创建了私有的 .ssh 目录,而步骤 D 则将公钥添加到授权密钥列表中。该文件的名称为 authorized_keys,这是有意这样做的。不要将该文件命名为其他的名称。步骤 E 删除了密钥的副本,步骤 F 和步骤 7 一样,对文件进行保护。

当您注销,然后重新登录时,不再需要使用密码。ssh(以及 scp 和 sftp)可以使用您的私钥对远程公钥进行测试。假如匹配,则表示您的凭据是有效的,您可以成功登录而无需进一步的识别。

有些系统始终需要使用密码,而其他的系统可能使用 RSA 而不是 DSA。与系统治理员联系,以便弄清楚如何登录到特定的计算机。系统治理员可以进行一些全局设置,这样可以使得系统更轻易访问。

任何时间、任何地点都处于联机状态

如今,Internet 以一种人类历史上前所未有的方式将身在各处的人们联系到一起。无论是在博客中分享生活的细节,还是为您的下一个项目相关的源代码,都可以通过网络来完成,而不再需要驱车奔走。

Web 冲浪仍然是一项流行的活动,但是为了能够留出时间进行真正的冲浪,开发人员创建了各种方式用来对各类文件的传输进行自动化。使用脚本和一些 UNIX 实用工具,可以保持您的外部 Web 和站点是最新的。您只需输入简单的命令就可以和上传文件,这使得整个过程变得快速而简单。假如您创建一个 .netrc 文件,可以得到更大程度的加速。不再需要任何密码。

既然已经清楚了这一点,那么您就可以放下汽车顶棚,驾车驶入超高速公路了。让我们在网络尽头的餐馆见。后到的人付帐哟!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值