Unix的輕巧“約取而實得”(下篇)

 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 [email protected]  //查看主機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操作系統使用的基本介紹將就此告一段落。有智者曰:“人之知識,若登梯然,進一級則所見愈廣。”本系列拙文僅作引玉之磚、鋪路之石,若有關注與興趣者籍此登梯而上,所見愈廣,後能返得指教與輔導,則實爲筆者遂願之幸事!
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章