UNIX®命令行是WYTIWYG界面-也就是说, 您输入的就是您得到的。 UNIX提供了数百个(甚至数千个)命令,您可以使用这些命令来操纵内核和用户空间中的各种可用资源。 需要监控CPU使用率吗? 尝试top
或ps
。 是否需要删除所有以.bak结尾的文件? 尝试rm *.bak
。 在新命令方面需要帮助吗? 跑man
。
但是,当您需要的资源驻留在广域网(WAN)和全球Internet上的远程系统上时,该怎么办? 引用《银河旅行者指南 》,“不要惊慌!”。 UNIX命令行可以轻松下载和上传文件,连接到远程计算机,并查询远程服务器和网络的状态。 拿起毛巾:现在是时候去逛太阳系。
本地工作,全球转移
在本系列的第1部分和第2部分中,您了解了使用UNIX命令行可以完成的工作。 只需几次击键(包括管道(|)或重定向),您就可以创建一个即兴数据处理机,其功能要比其各个部分的总和更强大。
尽管您日常使用的某些资源可能是本地资源 (即驻留在您自己的工作站上),但是可能会存储大量且不断增长的资产(文件,电子邮件和工具)一定距离(例如,在连接到WAN或Internet的计算机上)。 Web浏览器提供了对此类资源的几乎通用的访问权限,但有一个警告:指向和单击很快就会变得乏味,甚至繁琐,尤其是在必须检索多个项目的情况下。 而且,如果您要编写脚本 (本质上是捕获和重放)重复性或易出错的任务,那么窗口浏览器将是一个困难的盟友。
就像ls
, cp
, mail
, uptime
, du manage
以及query local resources
,UNIX也提供了一套命令行工具来访问远程资源。 本文向您介绍了其中一些工具,包括一种有用的技术,它既可以帮助访问远程系统,又可以保护您的身份验证凭据。 具体来说,您将学习wget
, curl
和Secure shell( ssh
)。 wget
和curl
工具传输文件; 使用ssh
,您可以安全地登录到远程系统并快速轻松地传输文件。
Telnet(和其他)的麻烦
如果您的系统运行rsh
(或其变体- rcp
, rexec
, rlogin
,或Irdist
)或telnet
,禁止并立即删除,并伴随守护进程。 此外,如果您不允许匿名文件传输协议(FTP),请也禁用FTP软件。
尽管rsh
和telnet
是UNIX的长期支持者,但攻击者可以利用这两个实用程序来(轻松)破坏您的系统。 您或您的系统管理员应停止并在运行该软件的地方删除该软件,并用ssh
替换这些软件包的功能。
对于特权FTP访问,请使用sftp
。 将rdist
替换为更高级的rsync
。 或者,如果必须提供匿名FTP(或通过HTTP下载),请确保使用防火墙硬件和软件将所有可公开访问的计算机与敏感的内部服务器隔离开。
但是首先,让我们讨论密码存在的令人讨厌的问题。
“您不需要臭气熏天的密码!”
通常,大多数计算机和服务的访问都受到保护。 在某些情况下,验证您的身份(并因此获得访问系统的特权)可能需要复杂的质询-响应交换,安全套接字层(SSL)证书,甚至是生物特征扫描。 但是,通常,密码足以获得访问权限。 就像您的个人识别码(PIN)一样,密码是您的秘密; 如果您选择了正确的密码,其他人可能很难随机猜出它。 您的姓名和强密码共同构成了充分的佐证。
当然,强密码可能很难记住,并且仅当您收集并记住另一个八个字符的密钥(例如,数字,标点和大小写混合)时,这种压力才会加剧。 一遍又一遍地输入密码可能会很烦人-更糟的是,它为自动控制自动化带来了重大障碍。
认识到这种麻烦,许多命令行实用程序允许您提供用户名和密码作为命令行参数。 例如,您可以使用以下命令来登录FTP站点,而无需干预:
ftp ftp://joe:passwd@www.example.com
但是,使用这种工具可以向共享您计算机的其他用户显示您的凭据。 (例如,尝试使用ps -Aeww
来查看系统上每个进程的完整命令行和环境。)
为了提供与命令行选项相同的便利而没有固有的风险,许多程序可以从称为.netrc (发音为net-rc )的特殊文件中读取您的凭据,该文件通常位于〜/ .netrc中。 .netrc文件必须仅是所有者读写模式(模式0600
或-rw-------
),并且文件中的每个条目都必须遵循以下简单语法:
machine ftp.example.com login zaphod password I()Trillian!
machine www.magazine.com login abner password MmG8y*tr
default login anonymous password zaphod@heartofgold.com
前两行提供了machine
关键字和计算机的域名, login
关键字和您在计算机上的登录名,以及password
关键字,后跟与您的登录名关联的密码。 最后一行的凭据为任何未特别命名的系统提供了默认值。 default
行必须是.netrc文件中的最后一行。 (有关.netrc文件配置选项的完整信息,请键入man 5 netrc
以查看.netrc手册页。)
显然,如果任何文件中包含任何身份数据,请使用用户只读模式(模式600
)或用户只读模式(模式400
)保护它,以防止意外覆盖或删除它。 您可能还希望使用模式700
保护主目录。
现在,每当启动启用.netrc的应用程序(包括我接下来讨论的那些应用程序)时,相应的登录名和密码都会自动传递给所需的服务,而只需按一下键盘即可。 您通常可以使用-n
选项禁用此自动登录功能。
移转的过程
与网页的HTTP和SSL上的HTTP(HTTPS)一起,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应用程序以下载指定的文件。 但是,您可以将相同的URL与wget
命令行实用程序一起使用-一种强大的实用程序,可通过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.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
(用于安静模式)选项禁用所有消息。 命令2通过FTP检索了CentOS发行说明的版本,尽管非常安静。
保持网址完整
提示:许多HTTP URL都包含一些Shell特有的字符。 例如,许多URL包含一个问号(?),它将主机名和路径与参数列表分开。 但是,shell将问号解释为通配符。
要绕过shell的解释,只需将URL放在单引号中即可。 为避免文件名奇怪而又长,请使用wget -o
命名输出文件。 这是一个例子:
$ wget -o sharkey\
'http://www.example.com/\
download.cgi?proj=science&file=sharkey'
如果要下载的URL列表很长,则无需将每个URL都放在命令行中。 相反,您可以创建(或生成)要下载的URL列表。 命令3显示url_list.txt,这是一个包含两个URL的简单文本目录; 命令4下载两个URL。 提供列表时,请使用-i
选项。 -nv
选项- 不详细的首字母缩写-提供更简洁的消息。
除非您提供下载文件的文件名(使用-o
选项),否则wget
会创建一个新的本地文件,该文件的名称与远程文件的名称相同,而忽略整个开头的URL。 命令5显示了从命令1到命令3下载的四个文件。
wget
实用程序具有许多选项和功能。 它可以抓取 FTP或网站并下载完整的文件层次结构。 您还可以为自动下载设置配额,提供cookie并继续先前被中断的下载。 阅读wget
手册页以了解该工具的许多技巧。
往上走
wget
实用程序对于手动下载非常有用,但无法上传文件。 它也不能与安全的FTP, telnet
和许多其他(旧的和较少使用的)Internet协议互操作。 对于这种传输,您必须转向名副其实的瑞士军刀网: curl
。
curl
命令行实用程序可以获取和放置数据,因此非常适合将本地文件传输到远程服务器。 更好的是, curl
的基础-libcurl库-具有丰富的应用程序编程接口(API),使您可以将curl
所有功能直接询问到自己的应用程序中。 C
, C++
,PHP和Perl编程语言只是可以利用libcurl的众多语言中的四种。 如果您的系统缺少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
手册页并牢记这一点。 curl
项目还维护一个使用列表 ,包括有关如何使用HTTP POST
和PUT
命令,如何提供登录凭据,如何使用SSL证书以及如何调试curl
请求的说明。 快速提示:尝试curl -v --trace-ascii ...
生成跟踪信息。
分离的六个地址
现代计算在很大程度上取决于各种形状,大小和服务的机器之间无数,尖锐的互连。 确实,即使在小型计算环境中,一台计算机可能专用于电子邮件,另一台计算机专用于服务网页,而其他计算机则用于执行更专门的任务。 在这种环境中-通常通过局域网(LAN),WAN或虚拟专用网络(VPN)连接-每天登录多台计算机非常普遍和必要。 系统管理员每小时都会从一台计算机反弹到另一台计算机,但是对于开发人员和其他用户来说,登录后需要对关键应用程序进行远程访问是很常见的。
X窗口系统和当前的桌面软件使远程访问变得相当透明:窗口是一个窗口,基础应用程序可以在任何计算机上运行。 但是同样,即使在以鼠标为中心的世界中,命令行也占有特殊的位置。 例如,如何轻松地在多台计算机上运行同一命令? 或者,更简单地说,如何在远程系统上启动xterm
窗口?
远程系统访问是ssh
及其衍生物scp
和sftp
的职责。 ssh
是rsh
的安全版本,而scp
和sftp
分别是rcp
和FTP的安全替代品。 为什么安全? ssh
及其变种提供了更强大的身份验证机制,并使用您选择的几种密码对所有流量进行加密。 即使有人嗅探您的网络, ssh
流量看起来也是如此。
ssh
最简单的用法是ssh 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
参数传递给远程计算机,该计算机运行命令并将输出返回给本地计算机。
ssh
还提供了一种将文件和整个目录从一台计算机复制到另一台计算机的便捷方法。 scp
几乎和cp
一样容易使用。 这是一个例子:
(www.joe.com) $ scp -p -r ~/myproject web.example.com:
此命令将〜/ myproject目录复制到web.example.com。 如果省略目标路径名,则文件将复制到您的主目录。 -p
选项保留所有文件的日期和时间戳,而-r
启用递归模式,其中scp
下降并复制所有子目录。
顺便说一句,前面的scp
命令等效于运行:
(www.joe.com) $ tar czf - ~/myproject | ssh www.example.com tar xvzf -
Login: deepthought
Password: ******
是的,您可以将本地命令的输出通过管道传输到远程命令(反之亦然)。
您可能已经厌倦了所有这些密码提示。 同样,重复的提示只会减慢工作速度并阻止自动化。 您可能还会厌倦一遍又一遍地键入长主机名。 幸运的是, 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 mstreicher@db.linux-mag.com
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在您的主目录中创建一个名为.ssh的私有本地目录。 该目录必须为模式700
,否则ssh
将不使用公共或私有密钥身份验证。 (您可以在步骤A到C中看到在远程计算机上运行的相同命令序列。)命令5使用DSA创建密钥对。 现在,将两个密码短语留空。 (它们提供了更高级别的安全性,但增加了另一个认证步骤。) ssh-keygen
生成两个文件:id_dsa(私钥)和id_dsa.pub(公钥)。 步骤6显示文件,而步骤7保护两个密钥。 您的密钥必须为模式0600
或模式0400
。
将通配符传递到远程Shell
假设您要列出远程主目录中的所有C
源文件。 在本地,您可以输入ls -l *.c
,因此可以通过ssh
尝试:
$ ssh www.example.com ls -l *.c
可能会发生两件事:如果本地计算机上当前工作目录中没有任何C
文件,则外壳程序会抱怨zsh: no matches found: *.c
,或者如果当前工作目录中有C
文件不在远程计算机上的主目录中,则远程计算机上的外壳可能会报错, ls: whosit.c: No such file or directory
。 挠头?
问题在于,在发送ssh
命令之前,通配符*
首先由本地外壳扩展 。 您打算将*
扩展到远程系统上。
为此,您必须防止本地外壳程序再次解释通配符。 您可以将*
放在单引号中,也可以使用反斜杠( \
)来使星号转义 。 然后,星号作为常规字符传递到远程外壳程序,在远程计算机的上下文中解释它。
这是这两种方法-使用适合每种情况的一种方法:
$ ssh www.example.com ls -l \*.c
$ ssh www.example.com ls -l '*'.c
步骤8将公钥复制到远程计算机。 目前,您必须输入密码,但这是最后一次。 命令A到C创建私有.ssh目录,步骤D将公共密钥添加到授权密钥列表中。 文件名--authorized_keys-是有意的。 请勿使用其他名称。 步骤E删除密钥的副本; 与步骤7一样,步骤F保护文件。
注销并重新登录时,不再需要密码。 ssh
(以及scp
和sftp
)针对远程公钥测试您的私钥。 如果找到匹配项,则您的凭据是正确的,并且无需进一步标识即可登录。
有些系统将始终要求输入密码。 其他系统可能更喜欢RSA,而不是DSA。 请与系统管理员联系,以了解如何登录到特定计算机。 系统管理员也可以设置一些全局设置,以使系统更易于访问。
随时随地在线
如今,互联网以人类历史上从未有过的方式将人们广泛地联系在一起。 无论是在博客中共享一天的详细信息,还是为下一个项目下载源代码,电线都已取代轮胎,成为了解决之道。
网上冲浪仍然是一种流行的运动,但是为了腾出时间进行真正的网上冲浪,开发人员创建了自动进行各种文件传输的方法。 使用脚本和一些UNIX实用程序,您可以使外部Web保持最新并下载站点。 您只需敲击几下即可下载和上传文件,从而使该过程变得快速,简单。 而且,如果您创建.netrc文件,则可以进一步加快工作量。 没有更多密码。
现在您已经清楚了,将其放下并在信息高速公路上进行公路旅行。 在光纤尽头的餐厅见。 那里的最后一个拿起了标签!
翻译自: https://www.ibm.com/developerworks/aix/library/au-speakingunix3.html