top命令是Linux下常用的性能分析工具,能夠實時顯示系統(tǒng)中各個進程的資源占用狀況,類似于Windows的任務管理器。下面詳細介紹它的使用方法。
認識top的顯示結果top命令的顯示結果如下所示:
top - 01:06:48 up 1:22, 1 user, load average: 0.06, 0.60, 0.48 Tasks: 29 total, 1 running, 28 sleeping, 0 stopped, 0 zombie Cpu(s): 0.3% us, 1.0% sy, 0.0% ni, 98.7% id, 0.0% wa, 0.0% hi, 0.0% si Mem: 191272k total, 173656k used, 17616k free, 22052k buffers Swap: 192772k total, 0k used, 192772k free, 123988k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1379 root 16 0 7976 2456 1980 S 0.7 1.3 0:11.03 sshd 14704 root 16 0 2128 980 796 R 0.7 0.5 0:02.72 top 1 root 16 0 1992 632 544 S 0.0 0.3 0:00.90 init 2 root 34 19 0 0 0 S 0.0 0.0 0:00.00 ksoftirqd/0 3 root RT 0 0 0 0 S 0.0 0.0 0:00.00 watchdog/0統(tǒng)計信息區(qū)
前五行是系統(tǒng)整體的統(tǒng)計信息。第一行是任務隊列信息,同 uptime 命令的執(zhí)行結果。其內容如下:
01:06:48 當前時間 up 1:22 系統(tǒng)運行時間,格式為時:分 1 user 當前登錄用戶數 load average: 0.06, 0.60, 0.48 系統(tǒng)負載,即任務隊列的平均長度。三個數值分別為 1分鐘、5分鐘、15分鐘前到現在的平均值。
第二、三行為進程和CPU的信息。當有多個CPU時,這些內容可能會超過兩行。內容如下:
Tasks: 29 total 進程總數 1 running 正在運行的進程數 28 sleeping 睡眠的進程數 0 stopped 停止的進程數 0 zombie 僵尸進程數 Cpu(s): 0.3% us 用戶空間占用CPU百分比 1.0% sy 內核空間占用CPU百分比 0.0% ni 用戶進程空間內改變過優(yōu)先級的進程占用CPU百分比 98.7% id 空閑CPU百分比 0.0% wa 等待輸入輸出的CPU時間百分比 0.0% hi ? 0.0% si ?最后兩行為內存信息。內容如下:
Mem: 191272k total 物理內存總量 173656k used 使用的物理內存總量 17616k free 空閑內存總量 22052k buffers 用作內核緩存的內存量 Swap: 192772k total 交換區(qū)總量 0k used 使用的交換區(qū)總量 192772k free 空閑交換區(qū)總量 123988k cached 緩沖的交換區(qū)總量。內存中的內容被換出到交換區(qū),而后又被換入到內存,但使用過的交換區(qū)尚未被覆蓋,
該數值即為這些內容已存在于內存中的交換區(qū)的大小。
相應的內存再次被換出時可不必再對交換區(qū)寫入。 進程信息區(qū)
統(tǒng)計信息區(qū)域的下方顯示了各個進程的詳細信息。首先來認識一下各列的含義。
序號 列名 含義 a PID 進程id b PPID 父進程id c RUSER Real user name d UID 進程所有者的用戶id e USER 進程所有者的用戶名 f GROUP 進程所有者的組名 g TTY 啟動進程的終端名。不是從終端啟動的進程則顯示為 ? h PR 優(yōu)先級 i NI nice值。負值表示高優(yōu)先級,正值表示低優(yōu)先級 j P 最后使用的CPU,僅在多CPU環(huán)境下有意義 k %CPU 上次更新到現在的CPU時間占用百分比 l TIME 進程使用的CPU時間總計,單位秒 m TIME+ 進程使用的CPU時間總計,單位1/100秒 n %MEM 進程使用的物理內存百分比 o VIRT 進程使用的虛擬內存總量,單位kb。VIRT=SWAP+RES p SWAP 進程使用的虛擬內存中,被換出的大小,單位kb。 q RES 進程使用的、未被換出的物理內存大小,單位kb。RES=CODE+DATA r CODE 可執(zhí)行代碼占用的物理內存大小,單位kb s DATA 可執(zhí)行代碼以外的部分(數據段+棧)占用的物理內存大小,單位kb t SHR 共享內存大小,單位kb u nFLT 頁面錯誤次數 v nDRT 最后一次寫入到現在,被修改過的頁面數。 w S 進程狀態(tài)。D=不可中斷的睡眠狀態(tài)
R=運行
S=睡眠
T=跟蹤/停止
Z=僵尸進程 x COMMAND 命令名/命令行 y WCHAN 若該進程在睡眠,則顯示睡眠中的系統(tǒng)函數名 z Flags 任務標志,參考 sched.h
默認情況下僅顯示比較重要的 PID、USER、PR、NI、VIRT、RES、SHR、S、%CPU、%MEM、TIME+、COMMAND 列??梢酝ㄟ^下面的快捷鍵來更改顯示內容。
更改顯示內容通過 f 鍵可以選擇顯示的內容。按 f 鍵之后會顯示列的列表,按 a-z 即可顯示或隱藏對應的列,最后按回車鍵確定。
按 o 鍵可以改變列的顯示順序。按小寫的 a-z 可以將相應的列向右移動,而大寫的 A-Z 可以將相應的列向左移動。最后按回車鍵確定。
按大寫的 F 或 O 鍵,然后按 a-z 可以將進程按照相應的列進行排序。而大寫的 R 鍵可以將當前的排序倒轉。
?
二 Grep學習筆記 作者:楊文軍 日期:2006-06-13 1. grep簡介grep (global search regular expression(RE) and print out the line,全面搜索正則表達式并把行打印出來)是一種強大的文本搜索工具,它能使用正則表達式搜索文本,并把匹配的行打印出來。Unix的grep家族包括grep、egrep和fgrep。egrep和fgrep的命令只跟grep有很小不同。egrep是grep的擴展,支持更多的re元字符, fgrep就是fixed grep或fast grep,它們把所有的字母都看作單詞,也就是說,正則表達式中的元字符表示回其自身的字面意義,不再特殊。linux使用GNU版本的grep。它功能更強,可以通過-G、-E、-F命令行選項來使用egrep和fgrep的功能。
grep的工作方式是這樣的,它在一個或多個文件中搜索字符串模板。如果模板包括空格,則必須被引用,模板后的所有字符串被看作文件名。搜索的結果被送到屏幕,不影響原文件內容。
grep可用于shell腳本,因為grep通過返回一個狀態(tài)值來說明搜索的狀態(tài),如果模板搜索成功,則返回0,如果搜索不成功,則返回1,如果搜索的文件不存在,則返回2。我們利用這些返回值就可進行一些自動化的文本處理工作。
2. grep正則表達式元字符集(基本集)
^ 錨定行的開始 如:'^grep'匹配所有以grep開頭的行。
$ 錨定行的結束 如:'grep$'匹配所有以grep結尾的行。
. 匹配一個非換行符的字符 如:'gr.p'匹配gr后接一個任意字符,然后是p。
* 匹配零個或多個先前字符 如:'*grep'匹配所有一個或多個空格后緊跟grep的行。 .*一起用代表任意字符。
[] 匹配一個指定范圍內的字符,如'[Gg]rep'匹配Grep和grep。
[^] 匹配一個不在指定范圍內的字符,如:'[^A-FH-Z]rep'匹配不包含A-R和T-Z的一個字母開頭,緊跟rep的行。
/(../) 標記匹配字符,如'/(love/)',love被標記為1。
/< 錨定單詞的開始,如:'/
/> 錨定單詞的結束,如'grep/>'匹配包含以grep結尾的單詞的行。
x/{m/} 重復字符x,m次,如:'0/{5/}'匹配包含5個o的行。
x/{m,/} 重復字符x,至少m次,如:'o/{5,/}'匹配至少有5個o的行。
x/{m,n/} 重復字符x,至少m次,不多于n次,如:'o/{5,10/}'匹配5--10個o的行。
/w 匹配文字和數字字符,也就是[A-Za-z0-9],如:'G/w*p'匹配以G后跟零個或多個文字或數字字符,然后是p。
/W /w的反置形式,匹配一個或多個非單詞字符,如點號句號等。
/b 單詞鎖定符,如: '/bgrepb/'只匹配grep。
3. 用于egrep和 grep -E的元字符擴展集+
匹配一個或多個先前的字符。如:'[a-z]+able',匹配一個或多個小寫字母后跟able的串,如loveable,enable,disable等。
? 匹配零個或多個先前的字符。如:'gr?p'匹配gr后跟一個或沒有字符,然后是p的行。
a|b|c 匹配a或b或c。如:grep|sed匹配grep或sed
() 分組符號,如:love(able|rs)ov+匹配loveable或lovers,匹配一個或多個ov。
x{m},x{m,},x{m,n} 作用同x/{m/},x/{m,/},x/{m,n/}
4. POSIX字符類
為了在不同國家的字符編碼中保持一至,POSIX(The Portable Operating System Interface)增加了特殊的字符類,如[:alnum:]是A-Za-z0-9的另一個寫法。要把它們放到[]號內才能成為正則表達式,如[A- Za-z0-9]或[[:alnum:]]。在linux下的grep除fgrep外,都支持POSIX的字符類。
[:alnum:] 文字數字字符
[:alpha:] 文字字符
[:digit:] 數字字符
[:graph:] 非空字符(非空格、控制字符)
[:lower:] 小寫字符
[:cntrl:] 控制字符
[:print:] 非空字符(包括空格)
[:punct:] 標點符號
[:space:] 所有空白字符(新行,空格,制表符)
[:upper:] 大寫字符
[:xdigit:] 十六進制數字(0-9,a-f,A-F)
5. Grep命令選項
-? 同時顯示匹配行上下的?行,如:grep -2 pattern filename同時顯示匹配行的上下2行。
-b,--byte-offset 打印匹配行前面打印該行所在的塊號碼。
-c,--count 只打印匹配的行數,不顯示匹配的內容。
-f File,--file=File 從文件中提取模板。空文件中包含0個模板,所以什么都不匹配。
-h,--no-filename 當搜索多個文件時,不顯示匹配文件名前綴。
-i,--ignore-case 忽略大小寫差別。
-q,--quiet 取消顯示,只返回退出狀態(tài)。0則表示找到了匹配的行。
-l,--files-with-matches 打印匹配模板的文件清單。
-L,--files-without-match 打印不匹配模板的文件清單。
-n,--line-number 在匹配的行前面打印行號。
-s,--silent 不顯示關于不存在或者無法讀取文件的錯誤信息。
-v,--revert-match 反檢索,只顯示不匹配的行。
-w,--word-regexp 如果被/<和/>引用,就把表達式做為一個單詞搜索。
-V,--version 顯示軟件版本信息。
6. 實例
要用好grep這個工具,其實就是要寫好正則表達式,所以這里不對grep的所有功能進行實例講解,只列幾個例子,講解一個正則表達式的寫法。
$ ls -l | grep '^a'
通過管道過濾ls -l輸出的內容,只顯示以a開頭的行。
$ grep 'test' d*
顯示所有以d開頭的文件中包含test的行。
$ grep 'test' aa bb cc
顯示在aa,bb,cc文件中匹配test的行。
$ grep '[a-z]/{5/}' aa
顯示所有包含每個字符串至少有5個連續(xù)小寫字符的字符串的行。
$ grep 'w/(es/)t.*/1' aa
如果west被匹配,則es就被存儲到內存中,并標記為1,然后搜索任意個字符(.*),這些字符后面緊跟著另外一個es(/1),找到就顯示該行。如果用egrep或grep -E,就不用"/"號進行轉義,直接寫成'w(es)t.*/1'就可以了。
# grep '^n' datafile 打印所有以n開頭的行.
# grep '4$' datafile 打印所有以4結束的行.
# grep '5/..' datafile 打印包含第一個字符是5,緊跟著一個點,再后面是任意一個字符串的行.除非在點的前面有一個反斜杠,否則它就表示一個任意字符.
# grep '/.5' datafile 打印所有包含字符串".5"的行.
# grep '^[wesn]' datafile 打印所有以w,e,s,n開頭的行.
# grep '[A-Z][A-Z] [A-Z]' datafile 打印所有包含前兩個字符是大寫字母,后面跟一個空格及一個大寫字母的字符串的行.
# grep 'ss* ' datafile 打印所有包含一個或者多個s且后面跟有一個空格的字符串的行.
# grep '[a-z]/{9/}' datafile 打印所有包含每個字符串至少有9個連續(xù)小寫字母的字符串行.
# grep '/<[a-z].*n/>' datafile 打印所有第一個字母是小寫字母,緊跟著是任意個字符,最后以n結束的字符串行. ? 三 FTP命令行使用精萃 作者:楊文軍 日期:2006-04-05 FTP命令是Internet用戶使用最頻繁的命令之一,不論是在DOS還是UNIX操作系統(tǒng)下使用 FTP,都會遇到大量的FTP內部命令。熟悉并靈活應用FTP的內部命令,可以大大方便使用者,并收到事半功倍之效。
FTP的命令行格式為: ftp -v -d -i -n -g [主機名] ,其中
-v 顯示遠程服務器的所有響應信息;
-d 使用調試方式;
-i 限制ftp的自動登錄,即不使用;
-n etrc文件;
-g 取消全局文件名。
ftp使用的內部命令如下(中括號表示可選項):
1. ![cmd[args]]:在本地機中執(zhí)行交互shell,exit回到ftp環(huán)境,如:!ls*.zip。
2. $ macro-ame[args]:執(zhí)行宏定義macro-name。
3. account[password]:提供登錄遠程系統(tǒng)成功后訪問系統(tǒng)資源所需的補充口令。
4.append local-file[remote-file]:將本地文件追加到遠程系統(tǒng)主機,若未指定遠程系統(tǒng)文件名,則使用本地文件名。
5. ascii:使用ascii類型傳輸方式。
6. bell:每個命令執(zhí)行完畢后計算機響鈴一次。
7. bin:使用二進制文件傳輸方式。
8. bye:退出ftp會話過程。
9. case:在使用mget時,將遠程主機文件名中的大寫轉為小寫字母。
10. cd remote-dir:進入遠程主機目錄。
11. cdup:進入遠程主機目錄的父目錄。
12. chmod mode file-name:將遠程主機文件file-name的存取方式設置為mode,如: chmod 777 a.out 。
13. close:中斷與遠程服務器的ftp會話(與open對應)。
14. cr:使用asscii方式傳輸文件時,將回車換行轉換為回行。
15. delete remote-file:刪除遠程主機文件。
16. debug[debug-value]:設置調試方式, 顯示發(fā)送至遠程主機的每條命令,如: deb up 3,若設為0,表示取消debug。
17.dir[remote-dir][local-file]:顯示遠程主機目錄,并將結果存入本地文件local-file。
18. disconnection:同close。
19. form format:將文件傳輸方式設置為format,缺省為file方式。
20. get remote-file[local-file]: 將遠程主機的文件remote-file傳至本地硬盤的local-file。
21. glob:設置mdelete,mget,mput的文件名擴展,缺省時不擴展文件名,同命令行的-g參數。
22. hash:每傳輸1024字節(jié),顯示一個hash符號(#)。
23. help[cmd]:顯示ftp內部命令cmd的幫助信息,如:help get。
24. idle[seconds]:將遠程服務器的休眠計時器設為[seconds]秒。
25. image:設置二進制傳輸方式(同binary)。
26. lcd[dir]:將本地工作目錄切換至dir。
27. ls[remote-dir][local-file]:顯示遠程目錄remote-dir, 并存入本地文件local-file。
28. macdef macro-name:定義一個宏,遇到macdef下的空行時,宏定義結束。
29. mdelete[remote-file]:刪除遠程主機文件。
30. mdir remote-files local-file:與dir類似,但可指定多個遠程文件,如: mdir *.o.*.zipoutfile 。
31. mget remote-files:傳輸多個遠程文件。
32. mkdir dir-name:在遠程主機中建一目錄。
33. mls remote-file local-file:同nlist,但可指定多個文件名。
34. mode[modename]:將文件傳輸方式設置為modename, 缺省為stream方式。
35. modtime file-name:顯示遠程主機文件的最后修改時間。
36. mput local-file:將多個文件傳輸至遠程主機。
37. newer file-name: 如果遠程機中file-name的修改時間比本地硬盤同名文件的時間更近,則重傳該文件。
38. nlist[remote-dir][local-file]:顯示遠程主機目錄的文件清單,并存入本地硬盤的local-file。
39. nmap[inpattern outpattern]:設置文件名映射機制, 使得文件傳輸時,文件中的某些字符相互轉換,如:nmap $1.$2.$3[$1,$2].[$2,$3],則傳輸文件a1.a2.a3時,文件名變?yōu)閍1,a2。該命令特別適用于遠程主機為非UNIX機的情況。
40. ntrans[inchars[outchars]]:設置文件名字符的翻譯機制,如ntrans1R,則文件名LLL將變?yōu)镽RR。
41. open host[port]:建立指定ftp服務器連接,可指定連接端口。
42. passive:進入被動傳輸方式。
43. prompt:設置多個文件傳輸時的交互提示。
44. proxy ftp-cmd:在次要控制連接中,執(zhí)行一條ftp命令,該命令允許連接兩個ftp服務器,以在兩個服務器間傳輸文件。第一條ftp命令必須為open,以首先建立兩個服務器間的連接。
45. put local-file[remote-file]:將本地文件local-file傳送至遠程主機。
46. pwd:顯示遠程主機的當前工作目錄。
47. quit:同bye,退出ftp會話。
48. quote arg1,arg2...:將參數逐字發(fā)至遠程ftp服務器,如:quote syst。
49. recv remote-file[local-file]:同get。
50. reget remote-file[local-file]:類似于get,但若local-file存在,則從上次傳輸中斷處續(xù)傳。
51. rhelp[cmd-name]:請求獲得遠程主機的幫助。
52. rstatus[file-name]:若未指定文件名,則顯示遠程主機的狀態(tài),否則顯示文件狀態(tài)。
53. rename[from][to]:更改遠程主機文件名。
54. reset:清除回答隊列。
55. restart marker:從指定的標志marker處,重新開始get或put,如:restart 130。
56. rmdir dir-name:刪除遠程主機目錄。
57. runique:設置文件名唯一性存儲。
58. send local-file[remote-file]:同put。
59. sendport:設置PORT命令的使用。
60. site arg1,arg2...:將參數作為SITE命令逐字發(fā)送至遠程ftp主機。
61. size file-name:顯示遠程主機文件大小,如:site idle 7200。
62. status:顯示當前ftp狀態(tài)。
63. struct[struct-name]:將文件傳輸結構設置為struct-name,缺省時使用stream結構。
64. sunique:將遠程主機文件名存儲設置為唯一(與runique對應)。
65. system:顯示遠程主機的操作系統(tǒng)類型。
66. tenex:將文件傳輸類型設置為TENEX機的所需的類型。
67. tick:設置傳輸時的字節(jié)計數器。
68. trace:設置包跟蹤。
69. type[type-name]:設置文件傳輸類型為type-name,缺省為ascii,如:type binary,設置二進制傳輸方式。
70. umask[newmask]:將遠程服務器的缺省umask設置為newmask,如:umask 3。
71. user user-name[password][account]:向遠程主機表明自己的身份,需要口令時,必須輸入口令,如:user anonymous my@email。
72. verbose:同命令行的-v參數,即設置詳盡報告方式,ftp服務器的所有響應都將顯示給用戶,缺省為on。
73. ?[cmd]:同help。
AID編者附注:如果服務器支持,可以使用quote "site pswd oldpassword newpassword"來修改密碼
四 Linux的常用網絡命令 作者:楊文軍 日期:2006-04-05 計算機網絡的主要優(yōu)點是能夠實現資源和信息的共享,并且用戶可以遠程訪問信息。Linux提供了一組強有力的網絡命令來為用戶服務,這些工具能夠幫助用戶登錄到遠程計算機上、傳輸文件和執(zhí)行遠程命令等。 本章介紹下列幾個常用的有關網絡操作的命令:
ftp 傳輸文件
telnet 登錄到遠程計算機上
r - 使用各種遠程命令
netstat 查看網絡的狀況
nslookup 查詢域名和IP地址的對應
finger 查詢某個使用者的信息
ping 查詢某個機器是否在工作
使用ftp命令進行遠程文件傳輸
ftp命令是標準的文件傳輸協(xié)議的用戶接口。ftp是在TCP/IP網絡上的計算機之間傳輸文件的簡單有效的方法。它允許用戶傳輸ASCII文件和二進制文件。 在ftp會話過程中,用戶可以通過使用ftp客戶程序連接到另一臺計算機上。從此,用戶可以在目錄中上下移動、列出目錄內容、把文件從遠程機拷貝到本地機上、把文件從本地機傳輸到遠程系統(tǒng)中。
需要注意的是,如果用戶沒有那個文件的存取權限,就不能從遠程系統(tǒng)中獲得文件或向遠程系統(tǒng)傳輸文件。 為了使用ftp來傳輸文件,用戶必須知道遠程計算機上的合法用戶名和口令。這個用戶名/口令的組合用來確認ftp 會話,并用來確定用戶對要傳輸的文件可以進行什么樣的訪問。另外,用戶顯然需要知道對其進行ftp 會話的計算機的名字或IP地址。
Ftp命令的功能是在本地機和遠程機之間傳送文件。該命令的一般格式如下:
$ ftp 主機名/IP
其中“主機名/IP”是所要連接的遠程機的主機名或IP地址。在命令行中,主機名屬于選項,如果指定主機名,ftp將試圖與遠程機的ftp服務程序進行連接;如果沒有指定主機名,ftp將給出提示符,等待用戶輸入命令: $ ftp ftp > 此時在ftp>提示符后面輸入open命令加主機名或IP地址,將試圖連接指定的主機。 不管使用哪一種方法,如果連接成功,需要在遠程機上登錄。用戶如果在遠程機上有帳號,就可以通過ftp使用這一帳號并需要提供口令。
在遠程機上的用戶帳號的讀寫權限決定該用戶在遠程機上能下載什么文件和將上載文件放到哪個目錄中。 如果沒有遠程機的專用登錄帳號,許多ftp站點設有可以使用的特殊帳號。這個帳號的登錄名為anonymous(也稱為匿名ftp),當使用這一帳號時,要求輸入email地址作為口令。 如果遠程系統(tǒng)提供匿名ftp服務,用戶使用這項服務可以登錄到特殊的,供公開使用的目錄。
一般專門提供兩個目錄:pub目錄和incoming目錄。pub目錄包含該站點供公眾使用的所有文件,incoming目錄存放上載到該站點的文件。 一旦用戶使用ftp在遠程站點上登錄成功,將得到“ftp>”提示符?,F在可以自由使用ftp提供的命令,可以用 help命令取得可供使用的命令清單,也可以在 help命令后面指定具體的命令名稱,獲得這條命令的說明。
最常用的命令有:
ls 列出遠程機的當前目錄
cd 在遠程機上改變工作目錄
lcd 在本地機上改變工作目錄
ascii 設置文件傳輸方式為ASCII模式
binary 設置文件傳輸方式為二進制模式
close終止當前的ftp會話
hash 每次傳輸完數據緩沖區(qū)中的數據后就顯示一個#號
get(mget) 從遠程機傳送指定文件到本地機
put(mput) 從本地機傳送指定文件到遠程機
open 連接遠程ftp站點
quit斷開與遠程機的連接并退出ftp
? 顯示本地幫助信息
! 轉到Shell中
下面簡單將ftp常用命令作一簡介。
啟動ftp會話 open命令用于打開一個與遠程主機的會話。該命令的一般格式是: open 主機名/IP 如果在ftp 會話期間要與一個以上的站點連接,通常只用不帶參數的ftp命令。如果在會話期間只想與一臺計算機連接,那么在命令行上指定遠程主機名或IP地址作為ftp命令的參數。 終止ftp會話 close、disconnect、quit和bye命令用于終止與遠程機的會話。close和disronnect命令關閉與遠程機的連接,但是使用戶留在本地計算機的ftp程序中。quit和bye命令都關閉用戶與遠程機的連接,然后退出用戶機上的ftp 程序。 改變目錄 “cd [目錄]”命令用于在ftp會話期間改變遠程機上的目錄,lcd命令改變本地目錄,使用戶能指定查找或放置本地文件的位置。 遠程目錄列表 ls命令列出遠程目錄的內容,就像使用一個交互shell中的ls命令一樣。ls命令的一般格式是: ls [目錄] [本地文件] 如果指定了目錄作為參數,那么ls就列出該目錄的內容。如果給出一個本地文件的名字,那么這個目錄列表被放入本地機上您指定的這個文件中。 從遠程系統(tǒng)獲取文件 get和mget命令用于從遠程機上獲取文件。get命令的一般格式為: get 文件名 您還可以給出本地文件名,這個文件名是這個要獲取的文件在您的本地機上創(chuàng)建時的文件名。如果您不給出一個本地文件名,那么就使用遠程文件原來的名字。 mget命令一次獲取多個遠程文件。mget命令的一般格式為: mget 文件名列表 使用用空格分隔的或帶通配符的文件名列表來指定要獲取的文件,對其中的每個文件都要求用戶確認是否傳送。 向遠程系統(tǒng)發(fā)送文件 put和mput命令用于向遠程機發(fā)送文件。Put命令的一般格式為: put 文件名 mput命令一次發(fā)送多個本地文件,mput命令的一般格式為: mput 文件名列表 使用用空格分隔的或帶通配符的文件名列表來指定要發(fā)送的文件。對其中的每個文件都要求用戶確認是否發(fā)送。 改變文件傳輸模式 默認情況下,ftp按ASCII模式傳輸文件,用戶也可以指定其他模式。ascii和brinary命令的功能是設置傳輸的模式。用ASCII模式傳輸文件對純文本是非常好的,但為避免對二進制文件的破壞,用戶可以以二進制模式傳輸文件。 檢查傳輸狀態(tài) 傳輸大型文件時,可能會發(fā)現讓ftp提供關于傳輸情況的反饋信息是非常有用的。hash命令使ftp在每次傳輸完數據緩沖區(qū)中的數據后,就在屏幕上打印一個#字符。本命令在發(fā)送和接收文件時都可以使用。 ftp中的本地命令 當您使用ftp時,字符“!”用于向本地機上的命令shell傳送一個命令。如果用戶處在ftp會話中,需要shell做某些事,就很有用。例如用戶要建立一個目錄來保存接收到的文件。如果輸入!mkdir new_dir,那么Linux就在用戶當前的本地目錄中創(chuàng)建一個名為new_dir 的目錄。
從遠程機grunthos下載二進制數據文件的典型對話過程如下:
$ ftp grunthos Connected to grunthos 220 grunthos ftp server Name (grunthos:pc): anonymous 33l Guest login ok, send your complete e-mail address as password. Password: 230 Guest 1ogin ok, access restrictions apply. Remote system type is UNIX. ftp > cd pub 250 CWD command successful. ftp > ls 200 PORT command successful. l50 opening ASCII mode data connection for /bin/1s. total ll4 rog1 rog2 226 Transfer comp1ete . ftp > binary 200 type set to I. ftp > hash Hash mark printing on (1024 bytes/hash mark). ftp > get rog1 200 PORT command successfu1. 150 opening BINARY mode data connection for rogl (l4684 bytes). # # # # # # # # # # # # # 226 Transfer complete. 14684 bytes received in 0.0473 secs (3e + 02 Kbytes/sec) ftp > quit 22l Goodbye.
使用telnet命令訪問遠程計算機
用戶使用telnet命令進行遠程登錄。該命令允許用戶使用telnet協(xié)議在遠程計算機之間進行通信,用戶可以通過網絡在遠程計算機上登錄,就像登錄到本地機上執(zhí)行命令一樣。 為了通過telnet登錄到遠程計算機上,必須知道遠程機上的合法用戶名和口令。雖然有些系統(tǒng)確實為遠程用戶提供登錄功能,但出于對安全的考慮,要限制來賓的操作權限,因此,這種情況下能使用的功能是很少的。當允許遠程用戶登錄時,系統(tǒng)通常把這些用戶放在一個受限制的shell中,以防系統(tǒng)被懷有惡意的或不小心的用戶破壞。 用戶還可以使用telnet從遠程站點登錄到自己的計算機上,檢查電子郵件、編輯文件和運行程序,就像在本地登錄一樣。
但是,用戶只能使用基于終端的環(huán)境而不是X Wndows環(huán)境,telnet只為普通終端提供終端仿真,而不支持 X Wndow等圖形環(huán)境。 telnet命令的一般形式為: telnet 主機名/IP 其中“主機名/IP”是要連接的遠程機的主機名或IP地址。如果這一命令執(zhí)行成功,將從遠程機上得到login:提示符。 使用telnet命令登錄的過程如下: $ telnet 主機名/IP 啟動telnet會話。 一旦telnet成功地連接到遠程系統(tǒng)上,就顯示登錄信息并提示用戶輸人用戶名和口令。如果用戶名和口令輸入正確,就能成功登錄并在遠程系統(tǒng)上工作。 在telnet提示符后面可以輸入很多命令,用來控制telnet會話過程,在telnet聯(lián)機幫助手冊中對這些命令有詳細的說明。
下面是一臺Linux計算機上的telnet會話舉例:
$ telnet server. somewhere. com Trying 127.0.0.1… Connected to serve. somewhere. com. Escape character is /'?]/'. “TurboLinux release 4. 0 (Colgate) kernel 2.0.18 on an I486 login: bubba password: Last login:Mon Nov l5 20:50:43 for localhost Linux 2. 0.6. (Posix). server: ~$ server: ~$ logout Connection closed by foreign host $
用戶結束了遠程會話后,一定要確保使用logout命令退出遠程系統(tǒng)。然后telnet報告遠程會話被關閉,并返回到用戶的本地機的Shell提示符下。 r-系列命令 除ftp和telnet以外,還可以使用r-系列命令訪問遠程計算機和在網絡上交換文件。 使用r-系列命令需要特別注意,因為如果用戶不小心,就會造成嚴重的安全漏洞。用戶發(fā)出一個r-系列命令后,遠程系統(tǒng)檢查名為/etc/hosts.equiv的文件,以查看用戶的主機是否列在這個文件中。如果它沒有找到用戶的主機,就檢查遠程機上同名用戶的主目錄中名為.rhosts的文件,看是否包括該用戶的主機。如果該用戶的主機包括在這兩個文件中的任何一個之中,該用戶執(zhí)行r-系列命令就不用提供口令。
雖然用戶每次訪問遠程機時不用鍵入口令可能是非常方便的,但是它也可能會帶來嚴重的安全問題。我們建議用戶在建立/etc/hosts.equiv和.rhosts文件之前,仔細考慮r-命令隱含的安全問題。
rlogin命令
rlogin 是“remote login”(遠程登錄)的縮寫。該命令與telnet命令很相似,允許用戶啟動遠程系統(tǒng)上的交互命令會話。rlogin 的一般格式是:
rlogin [ -8EKLdx ] [ -e char ] [-k realm ] [ - l username ] host
一般最常用的格式是: rlogin host 該命令中各選項的含義為:
-8 此選項始終允許8位輸入數據通道。該選項允許發(fā)送格式化的ANSI字符和其他的特殊代碼。如果不用這個選項,除非遠端的終止和啟動字符不是或,否則就去掉奇偶校驗位。
-E 停止把任何字符當作轉義字符。當和-8選項一起使用時,它提供一個完全的透明連接。
-K 關閉所有的Kerberos確認。只有與使用Kerberos 確認協(xié)議的主機連接時才使用這個選項。
-L 允許rlogin會話在litout模式中運行。要了解更多信息,請查閱tty聯(lián)機幫助。
-d 打開與遠程主機進行通信的TCP sockets的socket調試。要了解更多信息,請查閱setsockopt的聯(lián)機幫助。
-e 為rlogin會話設置轉義字符,默認的轉義字符是“~”,用戶可以指定一個文字字符或一個//nnn形式的八進制數。
-k 請求rlogin獲得在指定區(qū)域內的遠程主機的Kerberos許可,而不是獲得由krb_realmofhost(3)確定的遠程主機區(qū)域內的遠程主機的Kerberos 許可。
-x 為所有通過rlogin會話傳送的數據打開DES加密。這會影響響應時間和CPU利用率,但是可以提高安全性。
rsh命令
rsh是“remote shell”(遠程 shell)的縮寫。 該命令在指定的遠程主機上啟動一個shell并執(zhí)行用戶在rsh命令行中指定的命令。如果用戶沒有給出要執(zhí)行的命令,rsh就用rlogin命令使用戶登錄到遠程機上。
rsh命令的一般格式是:
rsh [-Kdnx] [-k realm] [-l username] host [command]
一般常用的格式是:
rsh host [command ]
command可以是從shell提示符下鍵人的任何Linux命令。
rsh命令中各選項的含義如下:
-K 關閉所有的Kerbero確認。該選項只在與使用Kerbero確認的主機連接時才使用。
-d 打開與遠程主機進行通信的TCP sockets的socket調試。要了解更多的信息,請查閱setsockopt的聯(lián)機幫助。
-k 請求rsh獲得在指定區(qū)域內的遠程主機的Kerberos許可,而不是獲得由krb_relmofhost(3)確定的遠程主機區(qū)域內的遠程主機的Kerberos許可。
-l 缺省情況下,遠程用戶名與本地用戶名相同。本選項允許指定遠程用戶名,如果指定了遠程用戶名,則使用Kerberos 確認,與在rlogin命令中一樣。
-n 重定向來自特殊設備/dev/null的輸入。
-x 為傳送的所有數據打開DES加密。這會影響響應時間和CPU利用率,但是可以提高安全性。 Linux把標準輸入放入rsh命令中,并把它拷貝到要遠程執(zhí)行的命令的標準輸入中。它把遠程命令的標準輸出拷貝到rsh的標準輸出中。它還把遠程標準錯誤拷貝到本地標準錯誤文件中。任何退出、中止和中斷信號都被送到遠程命令中。當遠程命令終止了,rsh也就終止了。
rcp命令
rcp代表“remote file copy”(遠程文件拷貝)。該命令用于在計算機之間拷貝文件。
rcp命令有兩種格式。第一種格式用于文件到文件的拷貝;第二種格式用于把文件或目錄拷貝到另一個目錄中。
rcp命令的一般格式是:
rcp [-px] [-k realm] file1 file2 rcp [-px] [-r] [-k realm] file
directory 每個文件或目錄參數既可以是遠程文件名也可以是本地文件名。遠程文件名具有如下形式:rname@rhost:path,其中rname是遠程用戶名,rhost是遠程計算機名,path是這個文件的路徑。
rcp命令的各選項含義如下:
-r 遞歸地把源目錄中的所有內容拷貝到目的目錄中。要使用這個選項,目的必須是一個目錄。
-p 試圖保留源文件的修改時間和模式,忽略umask。
-k 請求rcp獲得在指定區(qū)域內的遠程主機的Kerberos 許可,而不是獲得由krb_relmofhost(3)確定的遠程主機區(qū)域內的遠程主機的Kerberos許可。
-x 為傳送的所有數據打開DES加密。這會影響響應時間和CPU利用率,但是可以提高安全性。 如果在文件名中指定的路徑不是完整的路徑名,那么這個路徑被解釋為相對遠程機上同名用戶的主目錄。如果沒有給出遠程用戶名,就使用當前用戶名。如果遠程機上的路徑包含特殊shell字符,需要用反斜線(//)、雙引號(”)或單引號(’)括起來,使所有的shell元字符都能被遠程地解釋。 需要說明的是,rcp不提示輸入口令,它通過rsh命令來執(zhí)行拷貝。 - Turbolinux 提供稿件
五 使用truss、strace或ltrace診斷軟件的"疑難雜癥" ?
李凱斌, 項目經理
本文通過三個實際案例演示如何使用truss、strace和ltrace這三個常用的調試工具來快速診斷軟件的"疑難雜癥"。
簡介
進程無法啟動,軟件運行速度突然變慢,程序的"Segment Fault"等等都是讓?個Unix系統(tǒng)用戶頭痛的問題,本文通過三個實際案例演示如何使用truss、strace和ltrace這三個常用的調試工具來快速診斷軟件的"疑難雜癥"。
truss和strace用來 跟蹤一個進程的系統(tǒng)調用或信號產生的情況,而 ltrace用來 跟蹤進程調用庫函數的情況。truss 是早期為System V R4開發(fā)的調試程序,包括Aix、FreeBSD在內的大部分Unix系統(tǒng)都自帶了這個工具;而strace最初是為SunOS系統(tǒng)編寫的,ltrace 最早出現在GNU/Debian Linux中。這兩個工具現在也已被移植到了大部分Unix系統(tǒng)中,大多數Linux發(fā)行版都自帶了strace和ltrace,而FreeBSD也可通 過Ports安裝它們。
你不僅可以從命令行調試一個新開始的程序,也可以把truss、strace或ltrace綁定到一個已有的PID上來調試一個正在運行的程序。三個調試工具的基本使用方法大體相同,下面僅介紹三者共有,而且是最常用的三個命令行參數:
-f :除了跟蹤當前進程外,還跟蹤其子進程。
-o file :將輸出信息寫到文件file中,而不是顯示到標準錯誤輸出(stderr)。
-p pid :綁定到一個由pid對應的正在運行的進程。此參數常用來調試后臺進程。
使用上述三個參數基本上就可以完成大多數調試任務了,下面舉幾個命令行例子:
truss -o ls.truss ls -al: 跟蹤ls -al的運行,將輸出信息寫到文件/tmp/ls.truss中。
strace -f -o vim.strace vim: 跟蹤vim及其子進程的運行,將輸出信息寫到文件vim.strace。
ltrace -p 234: 跟蹤一個pid為234的已經在運行的進程。
三個調試工具的輸出結果格式也很相似,以strace為例:
brk(0) = 0x8062aa8
brk(0x8063000) = 0x8063000
mmap2(NULL, 4096, PROT_READ, MAP_PRIVATE, 3, 0x92f) = 0x40016000
?一行都是一條系統(tǒng)調用,等號左邊是系統(tǒng)調用的函數名及其參數,右邊是該調用的返回值。 truss、strace和ltrace的工作原理大同小異,都是使用ptrace系統(tǒng)調用跟蹤調試運行中的進程,詳細原理不在本文討論范Χ內,有興趣可以參考它們的源代碼。
下面舉兩個實例演示如何利用這三個調試工具診斷軟件的"疑難雜癥":
案例一:運行clint出現Segment Fault錯誤
操作系統(tǒng):FreeBSD-5.2.1-release
clint是一個C++靜態(tài)源代碼分析工具,通過Ports安裝好之后,運行:
# clint foo.cpp
Segmentation fault (core dumped)
在Unix系統(tǒng)中遇見"Segmentation Fault"就像在MS Windows中彈出"非法操作"對話框一樣令人討厭。OK,我們用truss給clint"把把脈":
# truss -f -o clint.truss clint
Segmentation fault (core dumped)
# tail clint.truss
739: read(0x6,0x806f000,0x1000) = 4096 (0x1000)
739: fstat(6,0xbfbfe4d0) = 0 (0x0)
739: fcntl(0x6,0x3,0x0) = 4 (0x4)
739: fcntl(0x6,0x4,0x0) = 0 (0x0)
739: close(6) = 0 (0x0)
739: stat("/root/.clint/plugins",0xbfbfe680) ERR#2 'No such file or directory'
SIGNAL 11
SIGNAL 11
Process stopped because of: 16
process exit, rval = 139
我們用truss跟蹤clint的系統(tǒng)調用執(zhí)行情況,并把結果輸出到文件clint.truss,然后用tail查看最后幾行。注意看clint執(zhí)行的最后一條系統(tǒng)調用(倒數第五行):
stat("/root/.clint/plugins",0xbfbfe680) ERR#2 'No such file or directory'
,問題就出在這里:clint找不到目?"/root/.clint/plugins",從而引發(fā)了段錯誤。怎樣解決?很簡單:
mkdir -p /root/.clint/plugins
,不過這次運行clint還是會"Segmentation Fault"9。繼續(xù)用truss跟蹤,發(fā)現clint還需要這個目?"/root/.clint/plugins/python",建好這個目?后clint終于能夠正常運行了。
案例二:vim啟動速度明顯變慢
操作系統(tǒng):FreeBSD-5.2.1-release
vim版本為6.2.154,從命令行運行vim后,要等待近半分鐘才能進入編輯界面,而且?有任何錯誤輸出。仔細檢查了.vimrc和所有的 vim腳本都?有錯誤配置,在網上也找不到類似問題的解決辦法,難不成要hacking source code??有必要,用truss就能找到問題所在:
# truss -f -D -o vim.truss vim
這里-D參數的作用是:在?行輸出前加上相對時間戳,即?執(zhí)行一條系統(tǒng)調用所耗費的時間。我們只要關注哪些系統(tǒng)調用耗費的時間比較長就可以了,用less仔細查看輸出文件vim.truss,很快就找到了疑點:
735: 0.000021511 socket(0x2,0x1,0x0) = 4 (0x4)
735: 0.000014248 setsockopt(0x4,0x6,0x1,0xbfbfe3c8,0x4) = 0 (0x0)
735: 0.000013688 setsockopt(0x4,0xffff,0x8,0xbfbfe2ec,0x4) = 0 (0x0)
735: 0.000203657 connect(0x4,{ AF_INET 10.57.18.27:6000 },16) ERR#61 'Connection refused'
735: 0.000017042 close(4) = 0 (0x0)
735: 1.009366553 nanosleep(0xbfbfe468,0xbfbfe460) = 0 (0x0)
735: 0.000019556 socket(0x2,0x1,0x0) = 4 (0x4)
735: 0.000013409 setsockopt(0x4,0x6,0x1,0xbfbfe3c8,0x4) = 0 (0x0)
735: 0.000013130 setsockopt(0x4,0xffff,0x8,0xbfbfe2ec,0x4) = 0 (0x0)
735: 0.000272102 connect(0x4,{ AF_INET 10.57.18.27:6000 },16) ERR#61 'Connection refused'
735: 0.000015924 close(4) = 0 (0x0)
735: 1.009338338 nanosleep(0xbfbfe468,0xbfbfe460) = 0 (0x0)
vim試圖連接10.57.18.27這臺主機的6000端口(第四行的connect()),連接失敗后,睡眠一秒鐘繼續(xù)重試(第6行的 nanosleep())。以上片斷循環(huán)出現了十幾次,?次都要耗費一秒多鐘的時間,這就是vim明顯變慢的原因??墒?,你肯定會納悶:"vim怎?會無 緣無故連接其它計算機的6000端口呢?"。問得好,那?請你回想一下6000是什?服務的端口??錯,就是X Server??磥韛im是要把輸出定向到一個遠程X Server,那?Shell中肯定定義了DISPLAY變量,查看.cshrc,果然有這?一行:
setenv DISPLAY ${REMOTEHOST}:0
,把它注釋掉,再重新登?,問題就解決了。
案例三:用調試工具掌握軟件的工作原理
操作系統(tǒng):Red Hat Linux 9.0
用調試工具實時跟蹤軟件的運行情況不僅是診斷軟件"疑難雜癥"的有效的手段,也可幫助我們理清軟件的"脈絡",即快速掌握軟件的運行流程和工作原 理,不失為一種學習源代碼的輔助方法。下面這個案例展現了如何使用strace通過跟蹤別的軟件來"觸發(fā)靈感",從而解決軟件開發(fā)中的難題的。
大家都知道,在進程內打開一個文件,都有Ψ一一個文件描述符(fd:file descriptor)與這個文件對應。而本人在開發(fā)一個軟件過程中遇到這樣一個問題:已知一個fd ,如何獲取這個fd所對應文件的完整·徑?不管是Linux、FreeBSD或是其它Unix系統(tǒng)都?有提供這樣的API,怎?辦呢?我們換個角度思考: Unix下有?有什?軟件可以獲取進程打開了哪些文件?如果你經驗足夠豐富,很容易想到lsof,使用它既可以知道進程打開了哪些文件,也可以了解一個文 件被哪個進程打開。
好,我們用一個小程序來試驗一下lsof,看它是如何獲取進程打開了哪些文件。
/* testlsof.c */
#include
#include
#include
#include
#include
int main(void)
{
open("/tmp/foo", O_CREAT|O_RDONLY); /* 打開文件/tmp/foo */
sleep(1200); /* 睡眠1200秒,以便進行后續(xù)操作 */
return 0;
}
將testlsof放入后臺運行,其pid為3125。命令lsof -p 3125查看進程3125打開了哪些文件,我們用strace跟蹤lsof的運行,輸出結果保存在lsof.strace中:
# gcc testlsof.c -o testlsof
# ./testlsof &
[1] 3125
# strace -o lsof.strace lsof -p 3125
我們以"/tmp/foo"為關鍵字搜索輸出文件lsof.strace,結果只有一條:
# grep '/tmp/foo' lsof.strace
readlink("/proc/3125/fd/3", "/tmp/foo", 4096) = 8
原來lsof巧妙的利用了/proc/nnnn/fd/目?(nnnn為pid):Linux內核會為?一個進程在/proc/建立一個以其pid 為名的目?用來保存進程的相關信息,而其子目?fd保存的是該進程打開的所有文件的fd。目標