Unix的轻巧“约取而实得”(下篇)
六、网络通信相关命令
“功能性文盲”的概念是1965年联合国教科文组织在伊朗德黑兰召开的各国教育部长会议上首次提出的,它最初的含义是指未能获得读、写及计算能力的人。时至今日,此概念的内涵已经发生了很大的变化。读——不仅要读印刷的文本,而如何快捷、有效地读取互联网上丰富的信息资源已成了现代人必备的才能;写——不仅是以往习惯的“爬格子”,而且会借用计算机的“神手”,更要将自己的所思所想写在网上,与全世界的人进行交流和互助;算——不仅需要核算物质成本和产出,而且要节约时间与精力,把握生命的张弛节律,将积极有效的精力投到最有意义的活动中去。
对于现代人来说,若离开了网络,那就真要返回到“功能性文盲”状态了。当然,Unix系统也离不开网络,它的缺省网络协议即为当今网络架构基础的TCP/IP协议。TCP/IP协议由一系列协议组成,统称TCP/IP协议族。TCP/IP协议是TCP/IP协议族中的基本协议,协议族常用协议有:
(1)传输控制协议/互联网络协议(TCP/IP - Transmission Control Protocol/Internet Protocol)是协议族的基本协议。
(2)用户数据报协议(UDP - User Datagram Protocol)提供无连接的传输层协议,不保证传输的可靠性。
(3)远程登录协议(telnet)定义了远程登录的标准。
(4)文件传输协议(FTP - File Transfer Protocol)定义了不同系统间进行文件拷贝的标准。
下面再介绍基于TCP/IP协议族的Unix系统的相关命令。
1、Telnet命令
前文中我们曾经使用过telnet命令,该命令的主要功能是在用户使用的本地计算机上通过网络登陆远程Unix主机,把本地计算机当成远程主机的一个仿真终端,而此处的网络可以是任何采用了TCP/IP协议的网络,如LAN、WAN、Internet等。在本地计算机上运行的telnet或下文将要介绍的ftp程序,实际上都是telnet/ftp的客户端程序,它通过TCP/IP协议与远程主机中的服务端程序相连。当用户利用telnet完成与远程Unix主机的连接后,就能像是在Unix主机终端上操作一样了,不过此时用户所能使用的功能和资源将取决于该系统所赋予用户的使用权限。
telnet的命令格式如下:
telnet IP地址或域名 [端口号]
此处的IP地址或域名是指远程Unix主机的IP地址或域名。当建立连接之后,将会出现信息提示用户输入登陆的用户名及口令,正确输入后就可以进入Unix系统了。
2、FTP命令
FTP的主要功能是实现本地计算机与远程主机之间的文件传输,它可以将远程Unix系统上的一个或多个文件下载到本地计算机,也可以将本地计算机上的一个或多个文件上传到远程Unix系统上。
FTP的命令格式如下:
ftp IP地址或域名
此处的IP地址或域名是指远程Unix主机的IP地址或域名。当建立连接之后,将会出现信息提示用户输入登陆的用户名及口令,正确输入后就会出现ftp提示符“ftp>”,我们就可以在此提示符后输入ftp命令进行相关的操作了。
FTP的常用命令及解释列表如下:
ftp命令
解释
bin
设定以二进制模式传输文件
asc
设定以ASCII模式传输文件(缺省值)
pwd
列出当前所处的远程主机目录
cd [directory]
改变所处的远程目录
ls
显示所处的远程目录的内容
lcd [directory]
设定本地欲上传或下载文件的目录
put file
将本地计算机中的文件上传到远程主机上
get file
将远程主机中的文件下载到本地计算机上
mput files
将本地计算机中的多个文件上传到远程主机上
mget files
将远程主机中的多个文件下载到本地计算机上
bye
退出ftp
下面是一次模拟的FTP登陆实例。假设远程主机的IP地址为198.4.30.25,现在要求将本地计算机系统/home/zcl中的文件Calculator.java上传到远程主机/newusers/zcl目录中,同时将/newusers/zcl目录中所有的文件下载到本地计算机目录/home/zcl/down中。
解:
ftp 198.4.30.25
Name:
Password:
(输入Unix用户名及口令)
ftp> asc
ftp> lcd /home/zcl
ftp> cd /newusers/zcl
ftp> put Calculator.java
ftp> bin
ftp> lcd /home/zcl/down
ftp> mget *
ftp> bye
说明:
当我们使用ftp时,可简单地把文件分为两种基本类型:文本文件和二进制文件。文本文件也称为ASCII文件,其文件内容遵循ASCII的定义,其主要特征是文件内容由若干行组成,可以使用操作系统的显示、编辑命令来显示和编辑ASCII文件的内容,它使用的传输模式是“asc”。二进制文件(Binary File)是指除ASCII文件以外的所有文件格式,它使用的传输模式是“bin”。需要注意的是,可以将ASCII文件按二进制模式传输,但决不能将二进制文件按ASCII模式传输,否则二进制文件的内容会遭到破坏而无法使用。
3、用户间通讯命令
对于QQ、MSN这类聊天工具,大家应该是再熟悉不过了,那么在Unix系统中能否进行此类的聊天操作呢?答案当然是肯定的。Unix提供了多种方式让用户相互通信,它允许以文本的方式给某个用户或所有用户传递信息,而信息来源可以是文本文件或直接由键盘输入的内容。
(1)使用write发送消息
使用write命令可以向任何已登录同一系统的另一位用户发送消息,这时在对方用户终端上就会自动显示出信息,而对方也同样可以使用write 命令来回复消息,这样双方之间就能互相通信了。
write命令的格式如下:
write user-name
此处user-name是将要与之通信的用户名,可以使用who 命令来查看系统中已登陆的用户名。输入write命令后,即可进入发送消息状态,这时就可以通过键盘输入消息,回车即可向对方发送此条消息了。要想退出发送消息状态,可以使用“Ctrl + d”退出write 命令回到shell。
(2)使用talk进行双方对话
talk命令允许双方实现类似于MSN、QQ这样的实时对话,其命令格式如下:
talk user-name
当用户向另一用户发送对话请求,只有在对方同意接受对话请求,即对方也使用talk命令后,双方的对话才会建立。这时双方终端上都会显示“[connect established]”,这样双方就可以从键盘输入文字,talk会把这些输入显示在对方的屏幕上,若任意一方按<Delete>键就会退出对话状态。
(3)使用wall进行广播式消息传送
使用wall命令可以向所有用户广播通知信息,而所有登录系统的用户都可收到该消息。wall命令有以下几种格式:
wall
wall filename
wall “send a message to all the people!”
(4)使用mesg允许或拒绝接收消息
当一位用户正在全身心的投入某项工作的时候,可能会不想被另外一位用户用上述方式突然发送来的消息打断思路,那么就可使用mesg命令来设置是否允许接收由其它用户发来的信息。mesg命令的格式如下:
mesg –n
或
mesg -y
其中,y表示允许接收信息,n 表示拒绝接收信息。如果mesg后面没有跟参数,则报告当前的许可状态。
4、其它命令
(1)查看网上用户信息
使用finger命令可以显示当前正在使用Unix系统的所有用户信息,它的命令格式如下:
finger [用户名][@主机域名或ip地址]
如:
finger //显示当前正在使用Unix系统的所有用户信息
finger anray@198.4.30.25 //查看主机198.4.30.26上用户anray的信息
此外,常用的显示当前系统登陆用户信息的命令还有:
who //可查看每个登陆用户的IP地址
w //可查看每个登陆用户的当前行为
who am i //查看使用者自己的信息
(2)查看网络的相关信息
hostname //显示主机名
cat /etc/hostname.hme0 //显示主机名
cat /etc/hosts //查看同一网段中存在的所有主机
cat /etc/services //查看当前系统所运行的所有程序的端口
ping 主机IP地址 //检测是否可以访问某个主机
netstat //列出系统中所有的网络连接
/usr/sbin/traceroute 主机IP地址 //显示从本地到目标IP所经过的所有路由器
七、文本编辑器 vi 的使用简介
古希腊克里特岛迷宫里有一个牛头人身的怪物米诺陶洛斯,如果不是美女公主阿里阿德涅赠送给英雄忒修斯一把魔剑,英勇的忒修斯还真奈何不了这牛头人身的怪物。
vi编辑器就是Unix系统赋予我们的魔剑,它是一款强有力的文本文件编辑工具。对初学者而言,常因其特殊的使用方法,而不得径门而入;对已经在使用 vi 的操作者来说,也常因对 vi 的不够熟悉与了解,而无法发挥出 vi 强大的编辑能力。以下将介绍vi 的基本使用方法。
vi 提供了两种操作模式:文本输入模式和命令模式,前者用于文本输入,后者用于输入控制指令。要启动vi进行文本操作,用户可在Shell提示符后输入如下命令:
vi 文件名
如果该名称的文件不存在,则系统会自动创建该文件。用户进入vi编辑器后,便自动处于命令模式,此时键入的任何字符皆被视为指令。此模式下可对文本进行删除、替换、拷贝、移动等操作,而对文本进行操作的前提是输入文本,那就先让我们进入输入模式吧。文本输入模式的进入,有以下的指令可供使用:
a
将在光标所在位置之后插入文本
A
将在光标所在行末插入文本
i
将在光标所在位置之前插入文本
I
将在光标所在行的第一个非空字符前插入文本
o
将在光标所在行的下一行开始插入文本
O
将在光标所在行的上一行开始插入文本
俗话说:“仙人打鼓时有差,脚步踏错谁人无。”在输入文本过程中,出现差错在所难免,但在vi编辑器中可不像在Word中那样能使用backspace或delete键来删除差错之处,而是首先应该按“ESC”键进入命令模式,然后可利用下面的指令移动光标位置进行准确定位:
k
上移一个字符
j
下移一个字符
h
左移一个字符
l
右移一个字符
行号G
光标移到该指点行(如1G表示光标移到第一行)
G
光标移到文件结尾
接着就可以使用下述指令进行删除或替换操作了:
x
删除光标所在字符
X
删除光标所在的前一字符
s
删除光标所在的字符,并进入输入模式
dd
删除光标所在行
nd
删除编辑器第n行的所有字符(n代表具体数字,下同)
ndd
删除从光标所在行开始往下的n行
:n,md
删除从指定的n到m行之间的所有字符(如::5,10d 将会删除编辑器中从第5行开始至第10行的内容)
D
删除光标所在处到行尾的字符
r
用跟在此指令之后的字符替换光标所在的字符(如:ra 是以 a 替换光标所在的字符)
C
替换从光标到行尾的内容
cc
替换整行的内容
“Ctrl + C”、“Ctrl + X”、“Ctrl + V”这几个组合键对于Windows用户来说是再熟悉不过了,在vi编辑器当然也具备了一般编辑的拷贝、移动、粘贴功能,下面就让我们来试试吧!
yw
拷贝当前光标所在处的词
yy
拷贝当前光标所在行的所有字符
P
在光标所在行的下一行粘贴
:i,jcok
将第i行至第j行之间的文本拷贝到第k行之后(此处i、j、k分别代表不同的数字)
:i,jmok
将第i行至第j行之间的文本移动到第k行之后(此处i、j、k分别代表不同的数字)
上列表中第4、5项如::10,20co30 将第10行至第20行的文本复制到第30行之后;:10,20mo30 将第10行至第20行的文本移动到第30行之后。
在完成所有的编辑工作之后,大家可要记得存盘退出vi 编辑器。在命令模式下使用下述指令:
:w
存盘
:w newfile
存盘成新的文件
:wq
存盘并退出vi
:q
退出vi,若文件被修改过,则会被要求确认是否放弃修改的内容。
:q!
不存盘并强行退出vi
下面再介绍一些较常使用的指令:
~
改变大小写
u
取消上次操作,即复原执行上一指令前的内容
/字符串
从当前行往下查找指定的字符串
n
往下继续查找下一个指定的字符串
?字符串
从当前行往上查找指定的字符串
N
往上继续查找下一个指定的字符串
:r file
将某文件的内容插入到光标位置
J
将光标所在行与其下一行连接起来,即下一行文本移动至光标所在行的末尾
:set nu
让编辑器自动显示出每一行的行号
:set nonu
取消显示每行前的行号
对以上所列指令用户只有稔熟在心,才能熟练自如地使用vi编辑器。在此基础之上,大家可以参考其它相关资料来掌握vi编辑器的一些更高级的指令。在后续关于Unix平台上程序开发的介绍中,大家将更能感受到vi编辑器的重要性。
八、环境变量及其它设置
在中医理论中,纵向叫‘脉’,横向叫‘络’,任督二脉正好是在人体的前后中心,前面是任脉,后面是督脉,是人体的子午线,因此在金庸的武侠小说里,想要练成上乘的功夫,首先就是要打通任督二脉。环境变量就是Unix系统中的任督二脉,那就让我们来打通它吧!
在介绍环境变量之前,我们先来了解一下变量这个概念。变量顾名思义就是值会变化的量,在使用变量之前必须先进行定义,变量名可以是任何符合命令规则的字母、下划线和数字的组合。对于为变量赋值,在csh与bash中的操作方式会略有不同。在csh中为变量赋值的格式如下:
setenv variable value
在bash中可以使用赋值操作符“=”来为一个变量进行赋值,格式如下:
variable=value
export variable
注意在“=”的周围不应该有任何的空格,使用export命令是为了使此变量在所有嵌套的Shell中都有效。一旦为一个变量赋值之后,就可以通过在变量名之前放置“$”来引用该变量的值了。如果想要查看某个变量的值,则可以使用echo命令,命令格式为:
echo $variable
如在csh中键入如下命令,将当前系统的主机名赋值给变量WTO,并输出变量WTO的值:
setenv WTO `uname –n`
echo $WTO
在bash中的操作方式如下:
WTO=` uname –n`
export WTO
echo $WTO
变量的使用用途较广,经常的用法是将其作为某个命令的参数。如将某一经常用到的目录路径名赋值给一个变量,这样就可以避免一遍又一遍地反复敲入同样的内容了。看下面一个例子,要将当前目录中的文件myfile1、myfile2拷贝到目录/home/anray/mydocument中,就可以使用如下的命令(以bash为例):
mydir=/home/anray/mydocument
cp myfile1 $mydir
cp myfile2 $mydir
如果想了解所有已定义的变量情况,则可以使用set命令。当用户不再需要某一个变量时,可以用unset命令来删除此变量,格式如下:
unset variable
值得注意的是,当前所定义变量的作用域范围是当前正在使用的Shell环境,即一旦退出Shell后再次登录,则此前所设置的所有变量都将失效。如果需要再次使用这些变量的话,都必须重新进行定义。
要想使定义的变量在每次登入系统时都有效,则需将其定义成为环境变量。环境变量可以用于定制用户的工作环境,即使用环境变量可以保存用户对系统进行设置的信息。环境变量被定义在“初始化文件”中,csh的初始化文件是.cshrc文件,bash的初始化文件是.bashrc(或.bash_profile,两者等效)。在每次系统启动时,系统会自动读取初始化文件中的内容来配置相应的工作环境,常见的环境变量有HOME、PATH、SHELL等。HOME变量的值是用户主目录的路径名。PATH变量的值包含了各种命令所在目录的路径名,路径名之间用冒号隔开,当用户执行某一命令时,系统就将会自动在这些目录下查询此命令并执行,若未查询到则会提示命令没有找到。SHELL变量的值代表了用户登陆系统时默认的Shell环境。当然用户也可以定义自己所需的环境变量,定义方法与普通变量定义相同,两者的不同之处在于环境变量被定义在初始化文件中。通常在定义环境变量之后,需要重新进入系统才会生效。如果想在不重启系统的情况下立即使当前的配置生效,csh中可以使用如下的命令:
source .cshrc
bash中可以使用如下的命令:
. .bashrc
关于使用Java、Oracle、CVS、Tomcat等时应该定义的环境变量,计划在后续的系列文章中陆续介绍,此处就先行略过。要想查看系统已定义的所有环境变量的情况,可以使用setenv命令。
下面我们再来介绍一下Unix系统中的一些其它设置。
1、计划任务的设置
Unix系统允许在指定的时刻执行指定的任务,这一功能是靠cron进程来实现的。cron进程会检查系统的计划任务文件,并在指定的时间执行这些指定的操作。计划任务文件内容格式如下:
min hour day month day_of_week command
0-59 0-23 1-31 1-12 0-6(Sunday=0)
计划任务文件由若干行组成,每行表示一个任务。每行由若干字段组成,字段间用空格分开。每行中字段分别代表:分、时、日、月、星期、要执行的命令。每个字段取值举例:
各字段取值举例
说明
*
表示任何时间
1,3,4
表示离散数字,即一系列点值
1-5
表示从1到5,即一范围
例如:
30 0 * * * /usr/tmp/a.txt
0 7 * 1,3,6,8 1-5 /usr/tmp/makefile
第一行表示在每天的午夜0:30启动/usr/tmp/a.txt文件运行,第二行表示每当1、3、6和8月的周1到周五,启动/usr/tmp/makefile文件运行。
计划任务文件是不能直接通过vi等编辑工具进行修改的,要对计划任务文件进行操作可使用crontab命令。crontab命令的常用格式如下:
crontab命令举例
说明
crontab -l
显示计划任务文件的内容
crontab –e
编辑计划任务文件的内容
crontab myfile
用myfile文件内容覆盖原计划任务文件内容
crontab -r
删除现有的计划任务文件
需要补充的是,crontab –e命令在默认情况下会使用编辑器ed来编辑计划任务文件。此编辑器的操作非常烦琐,因此最好是通过设置环境变量EDITOR来指定编辑器,方法如下:
setenv EDITOR vi
此外,也可通过先将计划任务文件的内容读入某一临时文件,编辑完成后再覆盖原计划任务文件的方式来修改计划任务。
[例] 在原计划任务文件基础上增加如下任务:每月1日凌晨3时运行/usr/tmp/run程序。
解:
(1) 运行 crontab -l > temp
(2) 对temp文件进行编辑,追加下面一行:
0 3 1 * * /usr/tmp/run
(3) 运行 crontab temp
2、别名的设置
可以使用alias命令来为一个命令创建一个别名,它的命令格式如下:
alias alias-name value
比如,熟悉的DOS的用户可能会一下子不习惯ls这个命令,那么就可以使用如下的方法来为ls命令取个别名:
alias dir ls
此外,还可以用一个别名来代替一个命令及它的参数,这样就可以简化常用的操作命令以便使用。不过这时需要用单引号将命令及其参数括起来,如:
alias dir ‘ls –l’
若想查看已定义的所有别名的别名表,则直接使用alias命令即可。当想删除某个别名时,则可使用unalias命令,格式如下:
unalias alias-name
3、命令历史设置
在Unix系统中,history程序会自动保留用户最近所使用过的命令。历史表中的命令从1开始编号,上限为所设置的保留个数,默认值是500。我们可以重设此保留个数,如:
set history=30
上述操作设定命令历史表长度为 30,即可记载已执行过的30个命令,可通过使用history命令查看此30个命令记录。使用“!n”命令可以执行历史表中所记录的第n个命令,“!!”则是重复执行前一个命令。
九、Shell脚本编程
在执行某个具体任务的时候,有时可能需要把几个Unix命令结合起来一起使用。如果这样的操作较为频繁,则可以考虑将这些命令放入一个文件中。那么每次使用时只需执行此文件即可,这样的文件就被称为脚本文件。
我们先来看一个简单的例子。首先使用vi创建一个名为lsjava的文件,在文件中输入如下内容:
pwd
cal
date
ls *.java
保存退出。由于默认情况下vi编辑器创建的文件仅有读和写权限,因此需要使用chmod命令来使脚本文件具备可执行权限,使用命令如下:
chmod u+x lsjava
在shell提示符后输入脚本文件名并回车,将可执行此脚本文件中的命令了,即先显示当前所处的工作目录,再显示出日历和日期,最后列表显示出当前目录下所有以“.java”为后缀名的文件。这样,脚本文件名就变成了一个新的shell命令。使用此种方法,我们就可以设计并创建自己的命令了。要补充说明的是,如果是在bash中,我们就无需更改脚本文件的权限,使用如下的命令格式即可执行此脚本文件:
. lsjava //此处的点号“.”表示执行
像其它的Unix命令一样,在命令行中调用一个脚本时,也可以在此脚本名后输入参数。这样在脚本文件中就可以接收来自命令行中的参数信息,并将此作为脚本文件中某命令的参数。命令行中的参数通过使用“$”操作符和参数序号来引用,参数以“1”开始顺续引用,第一个参数用$1来引用,第二个参数用$2来引用,以此类推。每次还可以引用多个参数,使用操作符“$*”即可表示引用所有的参数。此外,在脚本文件中,除了可以使用一系列的Unix系统命令外,还可以使用变量、算术表达式、条件选择、循环控制等来共同完成相应的任务。脚本文件功能强大,在处理较大的任务或需要循环执行某一个命令时可节省大量的时间。由于此部分涉及到编码,且内容较多,足可另写一本书,且又是非Unix初级使用者所必须掌握的知识,故在此不再赘述,请感兴趣的读者查阅相关的书籍与资料。
关于对Unix操作系统使用的基本介绍将就此告一段落。有智者曰:“人之知识,若登梯然,进一级则所见愈广。”本系列拙文仅作引玉之砖、铺路之石,若有关注与兴趣者籍此登梯而上,所见愈广,后能返得指教与辅导,则实为笔者遂愿之幸事!
上一篇:《Unix的轻巧“约取而实得”(中篇)》