1.wget
、curl
和安全 Shell (ssh
)。wget
和 curl
工具可以用来传输文件,而使用
ssh
,您可以安全地登录到远程系统中,快速地和轻松地传输文件。
2.Telnet(和其他工具)存在的问题
如果您的系统中运行了 rsh
(或者其变种——rcp
、rexec
、rlogin
或 Irdist
)或 telnet
,那么请立即禁用并删除这些命令以及相关的守护进程。另外,如果您不允许使用匿名文件传输协议 (FTP),请同时禁用 FTP 软件。
尽管 rsh
和 telnet
在 UNIX 中使用了很长的时间,但是攻击者可以轻松地利用这两种实用工具的其中之一来危害您的系统。当发现该软件正在运行时,您或您的系统管理员应该停止并删除它,并使用 ssh
来代替这些包。
对于特权 FTP 访问,可以使用 sftp
。将 rdist
替换为更高级的 rsync
。或者,如果您必须提供匿名 FTP(或通过 HTTP 进行下载),请确保使用防火墙硬件和软件将所有可以公开访问的计算机与敏感的内部服务器隔离。
3.下载:
在大多数桌面计算机中,这两种 URL 将启动浏览器或缺省的 FTP 应用程序来下载指定的文件。然而,在 wget
命令行实用工具中也可以使用相同的 URL,它是一种用于通过 HTTP、HTTPS 和 FTP 进行文件下载的健壮的实用工具。它支持 .netrc 文件,并且无需进行交互,对于实现自动化来说,使用它非常合适。如果您的系统中没有 wget
,您可以从 GNU Software Foundation 下载其源代码。它包含几个简单的命令,适用于所有的 UNIX 变种,您可以将这个实用工具放到您个人的 bin 目录或者某个中央目录。
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.7 Connecting to ftp.gnu.org[199.232.41.7]:80... connected. HTTP request sent, awaiting response... 200 OK Length: 1,213,056 [application/x-tar] 100%[=====================>] 1,213,056 531.22K/s 16:02:37 (529.57 KB/s) - `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.html
3 $ cat url_list.txt
http://www.wikipedia.com http://valdez.barebones.com/pub/freeware/TextWrangler_2.1.3.dmg 4 $ wget -i -nv url_list.txt
16:06:00 URL:http://www.wikipedia.org/ [33606] -> "index.html" [1] 16:06:41 URL:http://valdez.barebones.com/pub/freeware/ TextWrangler_2.1.3.dmg [9488296/9488296] ->
"TextWrangler_2.1.3.dmg" [1]
FINISHED --16: 06:41 -- Downloaded: 9,521,902 bytes in 2 files 5 $ ls
RELEASE-NOTES-en.html index.html wget-1.10.2.tar.gz TextWrangler_2.1.3.dmg url_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 页面。
保持 URL 不变 提示:许多 HTTP URL 中包含一些在 Shell 中有特殊含义的字符。例如,许多 URL 中包含问号 (?),它用来将主机名和路径从参数列表中分隔出来。然而,Shell 却把问号解释为通配符。 要阻止 Shell 对其进行解释,只需要将 URL 放在单引号中即可。要避免奇怪的和长文件名,可以使用
|
4.上传
curl
命令行实用工具可以获取和上传数据,所以它非常适合于将本地文件传输到远程服务器。然而更有价值的是,curl
的基础是 libcurl 库,该库提供了丰富的应用程序编程接口 (API),允许您将各种 curl
特性集成到您自己的应用程序中。C
、C++
、PHP 和 Perl,这是许多语言中能够利用 libcurl 的 4 种编程语言。如果您的系统中没有 curl
和 libcurl,您可以从 libcurl 主页下载其源代码。
因为 curl
可以将本地文件复制到远程服务器,所以它非常适合用于完成少量信息的备份工作。例如,清单 2 介绍了一个 Shell 脚本,出于安全考虑,它可以用来将一个装满了数据库转储信息的目录复制到远程 FTP 服务器。
2. 使用 curl 以远程的方式保存数据库转储
foreach db (mydns mysql cms tv radio) /usr/bin/mysqldump --ppassword --add-drop-table -Q --complete-insert $db > $db.sql
end find dbs -mtime -1 -type f -name '*.sql' -print | foreach file (`xargs`) curl -n -T $file ftp://ftp1.archive.example.com
end |
curl -n
命令强制 curl
读取您的 .netrc 文件。-T
选项告诉 curl
将指定的文件上传到给定的 URL。如果您省略了目标文件名,那么 curl
将简单地重用上传文件的名称。
正如您可能猜测到的,curl
具有比 wget
更多的选项。您需要阅读 curl
的 man 页面,并将其记在心中。curl
项目还维护了一份使用列表,其中包括关于如何使用 HTTP POST
和 PUT
命令、如何提供登录凭据、如何使用 SSL 证书、以及如何调试 curl
请求的说明。一个简单的技巧:尝试使用 curl -v --trace-ascii ...
来生成跟踪信息。
5.SSH
ssh
是 rsh
的安全版本,而 scp
和 sftp
则分别是 rcp
和 FTP 的安全替代。它为什么是安全的呢?ssh
及其变种提供了更强的身份验证机制,并使用您所选择的几个密码对所有的通信内容进行加密。即使有人探查 您的网络,ssh
通信数据对他们来说也毫无意义。
ssh
最简单的用法是 ssh hostname
。该命令将连接到 hostname,并提示您输入登录名和密码。在提供了正确的凭据之后,您就可以登录到系统中:
(www.joe.com) $ ssh web.example.com
Login: arthur
Password: ******
( web.example.com) $
|
如果您只需要在远程系统中运行一个命令,那么就不需要进行登录。只需将该命令作为 ssh
的参数即可。例如,清单 3 中所示的命令用于在远程计算机上运行 hostname -a -v
。
清单 3. 使用 ssh 在远程系统中运行命令
(www.joe.com) $ ssh db.linux-mag.com hostname -a -v Login: vogon
Password: ******
db gethostname()=`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
参数传递到远程计算机,该参数将运行这个命令并将输出返回到本地计算机。
6.scp
ssh
还为将文件和整个目录从一台计算机复制到另一台计算机提供了一种便捷的方法。scp
与 cp
一样很容易使用。这里有一个示例:
(www.joe.com) $ scp -p -r ~/myproject web.example.com:
|
这个命令将 ~/myproject 目录复制到 web.example.com。如果您省略了目标路径名,那么将把这些文件复制到 home 目录。-p
选项保持所有文件的日期和时间戳,而 -r
则启动递归 模式,这样一来,scp
将进入并复制所有的子目录。
顺便提一下,前面的 scp
命令等价于:
(www.joe.com) $ tar czf - ~/myproject | ssh www.example.com tar xvzf -
Login: deepthought
Password: ******
|
7. DSA 加密方案来设置公钥或私钥对
ssh
支持公钥或私钥身份验证和系统别名。
下面,让我们使用 DSA 加密方案来设置公钥或私钥对。要完成这项工作,您必须生成密钥对,将公钥复制到远程系统,并将它添加到已知密钥列表中,然后对其进行验证,如清单 4 所示。
清单 4. 创建并安装公钥或私钥
1 $ cd ~
2 $ mkdir .ssh
3 $ chmod 700 .ssh
4 $ cd .ssh
5 $ ssh-keygen -t dsa
Generating public/private dsa key pair. Enter file in which to save the key (/home/mstreicher/.ssh/id_dsa): ./id_dsa Enter passphrase (empty for no 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 [email protected] 6 $ ls
id_dsa id_dsa.pub
7 $ chmod 600 *
8 $ scp id_dsa.pub www.example.com:
Login: marvin
Password: ******
id_dsa 100% 668 0.7KB/s 00:00 9 $ ssh www.example.com
Login: marvin
Password: ******
A $ mkdir .ssh
B $ chmod 700 .ssh
C $ cd .ssh
D $ cat ../id_dsa.pub >> authorized_keys
E $ rm ../id_dsa.pub
F $ chmod 600 *
G $ logout
10 $ ssh www.example.com
a $ hostname
www.example.com b $ 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。与系统管理员联系,以便弄清楚如何登录到特定的计算机。系统管理员可以进行一些全局设置,这样可以使得系统更容易访问。
Tips:
向远程 Shell 传递通配符 假设您需要列出远程 home 目录中所有的
可能会出现两种情况:如果在本地计算机的当前工作目录中不存在任何 问题在于,在发送 要实现这一点,您必须阻止本地 Shell 对通配符进行解释(前面曾出现过一次这样的情况)。您可以将 这里有两种不同的方法,可以根据实际情况选择使用合适的方法:
|