指令行既可以成為你的至交好友,又可能成為你最大的敵人。它關鍵取決于你怎樣用它,以及用它來做什麼。如果你還是像大部分人一樣畏懼使用指令行界面,那麼這篇文章定會讓你受益匪淺。
<a target="_blank"></a>
是的,它是在黑色螢幕上的白色(或者綠色)的顯 示區域,是神秘的文字流和奇怪的指令執行的地方。我知道很多大師級的程式員從來不使用指令行界面;然而,我也知道一些初級使用者用指令行來做所有的事而不是 用圖形界面。他們控制應用程式去浏覽網頁和檔案系統,查收郵件,檢視圖檔和編輯文字。他們甚至看youtyube視訊和檢視pdf檔案都不使用圖形界面!
最好的工作流程是取決于個人的。有些人傾向于圖形界面,其他人則鐘愛于指令行。
剛剛接觸unix或者linux的人在面對諸如終端,控制台和shell時是比較困惑的。

從使用者的角度來看,它們之間似乎是沒有太大差別的,但事實上,使用者是使用控制台來連接配接終端來檢視運作在計算機上的腳本。
在過去的時候,這三者是獨立的硬體。控制台無非是一個顯示器和一個鍵盤;它沒有計算能力。它通過一個串行接口去連接配接終端,應用最廣泛的是rs-232接口。
終端就像大型主機的界面。它一般具有計算、網絡通信或進行其他特殊連接配接,如與大型主機連接配接的能力。終端也提供了對系統的管理者權限,這也是它為什麼總是被 關在小黑屋的原因。被雇用者使用連接配接到這些終端的控制台進行工作,但是卻無法獲得大型主機的管理者權限。控制台與終端最終合并為一個單獨的裝置,最好的例 子的就是現代linux發行版中仿真的虛拟機終端。
shell就是一個可以讀取使用者輸入,然後在螢幕輸出結果的程式。一個shell可以是基于字元的(像cli),或者是基于圖形的(像windows的 gui)。今天,shell已經不僅僅是使用者與系統的接口,他還肩負着管理程序,視窗,應用程式,指令,以及系統的其他方面。
shell解釋執行指令行中輸入的指令,使用者也可以将指令組合起來寫成一個腳本。現代的shell擁有自己的腳本語言,這提供了執行複雜任務的能力。
大多數現代的linux發行版,如同mac osx一樣,使用一個shell,bash(譯注:預設的,想用什麼自己換)。solaris和openindiana預設使用korn shell,一個bash的變種。請注意這篇指南主要講的是bash。
bash 代表 bourne again shell。它被作為 bourne shell 的新版本于1989年釋出,之後成為了 unix 系統的預設 shell。它由斯蒂芬·伯恩(stephen bourne)編寫,用以取代 thompson shell。老版的 bourne shell 至今仍工作在一些 unix 系統中。通常你可以用 /bin/sh 找到它。總之,盡管 bourne shell 在新的 linux 發行版中 已經為 bash 取代,/bin/sh 和 /bin/bash 都能被 bash 運作。
你永遠都會碰到bash的提示符。它是一個貫穿bash及其曆史的東西。如果篇幅允許,我們可以用所有篇幅講講如何按自己的希望配置bash的提示符。但是,我們隻會在這個指南中提到一些基本的東西。
csaba@csaba-pc ~/personal/programming/nettuts$
我的bash提示符就像上面那個樣子。 第一個詞csaba是我的使用者名,後接@和我的主機名稱,最後是目前的檔案夾。~這個字元代表了使用者檔案夾,對于我來說是/home/csaba。整行以$結尾,在$後面輸入的東西是我想shell執行的指令。
當然,這僅僅是一個簡單的例子。你可以放更多的東西進提示符中。來看看更多的例子吧。
ps1,ps2,ps3和ps4是bash的特殊變量,它們控制着不同類型的提示符(例如ps2是一般使用于指令行裡較長指令的換行提示資訊)。我們在這篇指南中隻用到ps1。你可以用下面的指令檢視你的ps1變量。
csaba@csaba-pc ~/personal/programming/nettuts $ echo $ps1 \[\033[01;32m\]\u@\h\[\033[01;34m\] \w \$\[\033[00m\]
輸入指令echo $ps1,然後你就看見了我的ps1變量。在bash中,我們将$到變量名稱前就可以得到這個變量的内容。這個echo指令僅僅會輸出它接到的參數。我們給echo的參數是變量的值,是以它會輸出這個變量的值。
輸出代表着一種格式。\[\033[01;32m\]表示綠色,\u表示目前使用者的使用者名。\h表示主機名,\[\033[01;34m\]表示藍色,\w是目前目錄,\[\033[00m\]是将文字後續輸入的文字置為高亮灰色。通過下面的螢幕截圖你能夠更好地了解結果。
以“\”開頭的特殊字元具有特别的意義。反之“\”辨別後面的字元是一個轉義字元(比如顔色代碼)。下面的内容是從bash官方手冊中引用的,你可以在bash指令中使用的特殊字元的完整清單:
\a- ascii響鈴字元(07)
\d– 以“weekday month date”格式顯示日期
\d{format}– format被傳遞給strftime(3)并把相應的結果插入到提示字元串中; 如果format為空則代表本地時間. 必須有在括号
\e– ascii轉義字元(033)
\h– 到第一個 `.’前代表主機名稱
\h– 主機名稱
\j– 目前被shell管理工作數
\l– shell終端設定名稱的基本名
\n– 新行
\r– 回車
\s– shell的名稱
\t– 12小時制目前時間,格式為 hh:mm:ss
\t– 24小時制目前時間,格式為 hh:mm:ss
\@– 12小時制目前時間,格式為am/pm
\a– 24小時制目前時間,格式為 hh:mm
\u– 目前使用者的名稱
\v– bash版本
\v– bash發行備注,版本号+更新檔
\w– 目前工作目錄,其中$home被縮寫成"~"(使用prompt_dirtrim的值)
\w– 目前工作目錄的basename,$home被縮寫成"~"
\!– 指令的使用次數
\#– 指令号
\$– 指令提示符,如果uid是0則顯示為#,否則為$
\nnn– 8進制資料nnn代表的字元
\\– 反斜杠
\[- 開始一個非列印字元序列,這個序列可以嵌入一個終端控制序列到提示中
\]– 非列印字元序列結束
在指令行環境中,每個人都要做的一件事就是操作檔案系統,建立,删除,複制和移動檔案系統對象,并且執行指令。這對你來說可能已經是家常便飯,然而,還是讓我們來看一眼:
csaba@csaba-pc ~ $ mkdir ~/tmp/nettuts csaba@csaba-pc ~ $ cd ~/tmp/nettuts/ csaba@csaba-pc ~/tmp/nettuts $ mkdir ./anotherdir csaba@csaba-pc ~/tmp/nettuts $ mkdir ./seconddir csaba@csaba-pc ~/tmp/nettuts $ touch ./seconddir/afile csaba@csaba-pc ~/tmp/nettuts $ touch ./seconddir/anotherfile csaba@csaba-pc ~/tmp/nettuts $ cd ./seconddir/ csaba@csaba-pc ~/tmp/nettuts/seconddir $ pushd ~/tmp/nettuts ~/tmp/nettuts ~/tmp/nettuts/seconddir csaba@csaba-pc ~/tmp/nettuts $ ls -al total 16 drwxr-xr-x 4 csaba csaba 4096 feb 19 21:09 . drwx------ 7 csaba csaba 4096 feb 19 21:09 .. drwxr-xr-x 2 csaba csaba 4096 feb 19 21:09 anotherdir drwxr-xr-x 2 csaba csaba 4096 feb 19 21:09 seconddir csaba@csaba-pc ~/tmp/nettuts $ popd ~/tmp/nettuts/seconddir csaba@csaba-pc ~/tmp/nettuts/seconddir $ ls -al total 8 drwxr-xr-x 2 csaba csaba 4096 feb 19 21:09 . drwxr-xr-x 4 csaba csaba 4096 feb 19 21:09 .. -rw-r--r-- 1 csaba csaba 0 feb 19 21:09 afile -rw-r--r-- 1 csaba csaba 0 feb 19 21:09 anotherfile csaba@csaba-pc ~/tmp/nettuts/seconddir $
逐句解釋:
在/home/csaba/tmp下建立一個名為nettuts的目錄
将剛剛建立的目錄切換為目前目錄
在目前目錄下建立一個名為“anotherdir”的目錄
在目前目錄下建立一個名為“seconddir”的目錄
使用touch指令在“seconddir”目錄下建立兩個空檔案
切換目前目錄到seconddir.
使用pushd指令切換目錄到~/tmp/nettuts來把目前目錄存儲到堆棧之中
列出目錄~/tmp/nettuts下的所有檔案
使用popd指令來傳回前一個目錄,這樣會從堆棧中擷取并且移除最頂層的目錄
再一次列出内容會看到我們上幾步所建立的兩個檔案
當然,對于指令行你們可以有個萬能檔案管理器,稱之為midnight commander。要開始用的時候隻需要執行它的指令就行。它也内置了文本編輯器(高亮代碼的那段)适合大部分語言,而且有智能縮進和其他的一些特性。 它不完全是一個被誇大的編輯器,事實上,它是一個相當簡單的工具,特别适合簡單和快速編輯。你可以随意的選擇任何檔案然後按f4,或者你可以在編輯模式下 直接打開一個檔案。
csaba@csaba-pc ~/tmp/nettuts/seconddir $ mcedit ./afile
每個指令必須和指令行環境互動。指令需要輸入和提供輸出。
标準輸入是指令讀取資訊的來源。鍵盤是預設标準輸入,标準輸入經常被稱為“stdin”。
标準輸出是指令的輸出會被發送到的地方。預設是目前控制台,标準輸出通常被稱為“stdout”。
标準錯誤是指令輸出錯誤的地方。預設目前控制台,常被稱為"stderr"。
到目前為止,我們可以定義簡單的狀态,來表示一個指令從鍵盤上讀取并輸出它的結果(包括好的和壞的)到螢幕上.
在unix(或類unix系統)中, 所有的東西都會被抽象成檔案,你的鍵盤是檔案,你的滑鼠是檔案,你的螢幕是檔案,程式是檔案, 文本是檔案,等等
檔案描述符是一個整形數字用于作業系統引用打開的檔案, 所有的unix系統至少包含三個檔案描述符.
描述符 no. 0 – 标準輸入
描述符 no. 1 – 标準輸出
描述符 no. 2 – 标準錯誤輸出
unix系統有一個非常強大的特性:因為所有資源都是檔案,你可以将所有資源引用和将其從一個位置重定向到另一個位置。重定向的操作符表示标準輸出(stdout)。是以,如果你需要一個指令從鍵盤中讀取資訊,你可以進行如下操作:
$ somecommand <
但當要你的指令從一個檔案中讀取内容你要怎麼做呢?你隻要重定向這個檔案到它的标準輸入(stdin),如下:
$ somecommand < /your/file.txt
如果你要你的指令執行結果輸出到一個檔案,你可以使用>操作符。例如我們已經知道如何将一個目錄中的檔案列出:
你可以把使用如下指令将結果發送到一個檔案:
csaba@csaba-pc ~/tmp/nettuts/seconddir $ ls -al > ./thirdfile
thirdfile的内容如下:
total 12 drwxr-xr-x 2 csaba csaba 4096 feb 24 00:06 . -rw-r--r-- 1 csaba csaba 12 feb 19 21:19 afile -rw-r--r-- 1 csaba csaba 0 feb 24 00:06 thirdfile
比方說,我們要導航到上級目錄,列出它所有的檔案,并且使用一個指令将這個清單添加至一個已經存在的檔案中。操作符>重定向輸出到一個檔案并且覆寫該檔案;是以我們不能使用它。不過,我們可以使用>>(兩個>)來添加新資料到一個已經存在的檔案。
csaba@csaba-pc ~/tmp/nettuts/seconddir $ cd .. drwxr-xr-x 2 csaba csaba 4096 feb 24 00:06 seconddir csaba@csaba-pc ~/tmp/nettuts $ ls -al >> ./seconddir/thirdfile
于是我們的檔案内容就是這樣了:
我們可以綜合我們的知識,以不同的方向重定向标準錯誤(stderr),标準輸入(stdin)和标準輸出(stdout)。實際上,以下的指令功能相同:
csaba@csaba-pc ~/tmp/nettuts $ ls -al > ./seconddir/thirdfile csaba@csaba-pc ~/tmp/nettuts $ ls -al 1> ./seconddir/thirdfile
在第二個指令中,在重定向之前我們指定标準輸出的來源。請注意1與>之間沒有空格。實際上,如果兩者之間有空格,則1會作為ls指令的一個參數,并且>會自動重定向标準輸出。以下兩個表達功能相同,但和上面的那個功能不同。
csaba@csaba-pc ~/tmp/nettuts $ ls -al 1 > ./seconddir/thirdfile csaba@csaba-pc ~/tmp/nettuts $ ls -al 1 1> ./seconddir/thirdfile
當然,這些結果會出錯:"ls:不能通路1:沒有那個檔案或目錄” ——除非你真的有一個名字為1的目錄。這會讓我們驚訝下一步我們得到的:重定向錯誤。
csaba@csaba-pc ~/tmp/nettuts $ ls -al inexistenfilder > ./seconddir/thirdfile ls: cannot access inexistenfilder: no such file or directory csaba@csaba-pc ~/tmp/nettuts $ ls -al inexistenfilder 2> ./seconddir/thirdfile
如你所見,第一個指令在控制台輸出标準輸出并重定向标準輸出到一個檔案。第一個指令的結果是一個空檔案和螢幕上的一條資訊。然而,第二條指令重定向錯誤到我們的檔案。其結果是如果在标準輸出上有任何輸出,則它們會顯示在螢幕上,并且錯誤資訊會輸入到這個檔案。
當你需要在指令行尋找一些檔案時,你基本上隻有兩個選擇。第一個就是選擇用本地指令。這些指令常常是伴随着安裝各種linux版本而已經安裝好的,當然不 是每一個版本都安裝了。更新檔案資料庫指令索引你的檔案和定位,然後使用那個資料庫去發現你的檔案。實際上他不是做一個實時的搜尋,它隻是簡單的在資料庫 做索引。這就是為什麼這個應用程式常常定期的做每日更新檔案資料庫。
我們來用這個指令示範一個實時搜尋,它比本地指令搜尋的更精确,但是很顯然更慢一些。現在讓我們用這個指令來示範一段:
csaba@csaba-pc ~/tmp/nettuts $ ls -al ./seconddir/ -rw-r--r-- 1 csaba csaba 61 feb 24 00:23 thirdfile csaba@csaba-pc ~/tmp/nettuts $ find . -name thirdfile ./seconddir/thirdfile
我列印這兩個ls指令是為了讓你很友善的看明白目錄結構,第三個是find指令。它有着複雜的參數系統,在此我就不一一列舉了,但是以上的例子展示了find指令最常見的使用。第一個參數.是一個我們想去搜尋的目錄。
小貼士:參考目前目錄……參考上目錄
find指令的第二個參數是-name,緊接着是檔案的名字。在-name參數中我們可以用?和*來擴大我們的搜尋範圍:
csaba@csaba-pc ~/tmp/nettuts $ find . -name ?file ./seconddir/afile csaba@csaba-pc ~/tmp/nettuts $ find . -name *file ./seconddir/anotherfile
?代表一個單個字母,而*指的是任意的字母數量。
接下來,我們将建立一個目錄同時使它被我們的使用者所不能讀。我們還沒有講解到權限,但是不用着急,很快我們将涉及那部分。現在試試下面的例子:
csaba@csaba-pc ~/tmp/nettuts $ mkdir thirddir csaba@csaba-pc ~/tmp/nettuts $ chmod 000 thirddir find: `./thirddir': permission denied
在這個例子中,我希望你對這目錄沒有權限以便我可以展示一下find輸出的内容。它試着進入到所有的目錄中然後搜尋所有比對的檔案。當它不能進入一個目 錄,它會輸出一條資訊。當你看到一兩條這樣的資訊提示是很正常的哈,但是作為一個普通使用者去試着搜尋root目錄下面的檔案時。你将會擷取數百條錯誤資訊 提示而且可能隻有一兩條搜尋結果。你不想錯過搜尋結果;于是乎你想要除去錯誤的資訊提示。
csaba@csaba-pc ~/tmp/nettuts $ find . -name *file 2> /dev/null
我們重定向标準錯誤輸出到/dev/null裡面。這樣做再好不過了。無論你向/dev/null扔進去什麼東西,它都可以很簡單的使他消失。通常的做法 是當你不想看見這些錯誤提示資訊,你可以把資訊發到那裡。假如你更喜歡把結果存入一個檔案中的話,你可以把錯誤提示資訊傳送到/dev/null,然後可 以用多道重定向:
csaba@csaba-pc ~/tmp/nettuts $ find . -name *file 2> /dev/null 1>./seconddir/thirdfile csaba@csaba-pc ~/tmp/nettuts $
正如你看見的,這個指令在螢幕上面什麼也沒有輸出,因為錯誤資訊和标準輸出被傳送到了不同的檔案中。但是如果我們想在同一個檔案中看到兩種資訊的輸出,怎麼辦呢?沒問題,你可以把标準錯誤輸出傳送到标準輸出然後把标準輸出傳送到檔案中:
find . -name *file 1>./seconddir/thirdfile 2>&1
重定向被解釋執行是從右到左的。首先開始執行的是 2>&1,這裡的意思是重定向标準錯誤輸出到标準輸出。然後是1>./seconddir/thirdfile,這裡的意思是重定向标準輸出(此時已經有錯誤資訊在檔案裡面了)到指定的檔案。
本文中所談及的所有權限問題都僅限于 *nix 作業系統。我對最新的 windows 版本并不熟悉,但微軟在其檔案系統中使用了一種不同的權限概念。
同一台電腦中可以又數個不同的使用者。事實上,很多應用注冊自己的特殊使用者,并在一個受限的環境裡運作程式。每個使用者以名稱和/或 id(uid) 區分。
你可以在 /etc/passwd 檔案中找到現有使用者的清單。
組的清單存放在 /etc/group 檔案中。一個組擁有一個名字和一個 id (gid),并擁有另個或數個使用者。每個使用者通常還擁有一個與之對應的組,名稱相同。
檔案有其擁有者,預設情況,建立那個檔案的使用者就是它的擁有者。檔案夾僅僅是一些特殊的檔案,它們跟普通檔案遵從一樣的規則。
total 20 drwxr-xr-x 5 csaba csaba 4096 feb 24 00:44 . d--------- 2 csaba csaba 4096 feb 24 00:44 thirddir
在ls -al指令中,每一個檔案的擁有者會像“使用者 組”(在這個例子中是“csaba csaba”)輸出。我們可以用下面的方法改變anotherdir這個檔案夾的擁有者:
csaba@csaba-pc ~/tmp/nettuts $ chown csaba:users ./anotherdir/ drwxr-xr-x 2 csaba users 4096 feb 19 21:09 anotherdir
chown指令用途是改變擁有者(change owner)。它有一個簡單的用法:chown 使用者:組 檔案路徑。一個使用者隻能将“組”這個位置改成一個他所在的組。一個普通使用者不能更改他無權讀取的檔案的擁有者。當然,擁有管理者權限的使用者,如 “root”,可以把任意檔案的擁有者改成任意使用者群組。
這裡有三種關于檔案的權限:
r – 讀取
w – 寫入
x – 執行
請注意: 如果一個檔案夾内的檔案可以被列出,這個檔案夾本身擁有可執行的權限(x)。
看看前面的例子,每一個檔案系統的對象的權限在輸出的開頭(那些rwx字元)。每個标志位可以是”被設定“(那些有字母的位置),或者是“未設定”(用一個”-“辨別,代表沒有這個權限)。
這三種權限被包含于三個組, 即每個組都有這三種權限:
使用者 – 對擁有者的權限
組 – 對這個檔案所在組的成員的權限
其他人 – 對其他想要讀取這個檔案或檔案夾的使用者的權限
這個叫做thirddir的檔案夾沒有任何标志位,是以它的擁有者也不能讀取它:
chown: changing ownership of ‘./anotherdir/’: operation not permitted csaba@csaba-pc ~/tmp/nettuts $ ls -al ./thirddir/* ls: cannot access ./thirddir/*: permission denied
但是擁有者擁有改變它的權限的權力:
csaba@csaba-pc ~/tmp/nettuts $ chmod +rwx ./thirddir/ csaba@csaba-pc ~/tmp/nettuts $ ls -al ./thirddir drwxr-xr-x 2 csaba csaba 4096 feb 24 00:44 . drwxr-xr-x 5 csaba csaba 4096 feb 24 00:44 .. drwxr-xr-x 2 csaba csaba 4096 feb 24 00:44 thirddir
chmod指令可以更改一個檔案系統對象的權限,,它的用法是:chmod +/-權限 檔案路徑。使用+意味着你将給這個檔案一個權限,-意味着去掉一個權限。你可以使用任意權限的組合。上個例子,我們給thirddir加上讀取,寫入,和可執行的權限。
請注意: 用這個方式添加的讀寫和可執行權限,會作用于擁有者,組,和其他人。但是寫入權限隻會作用于目前的使用者。
csaba@csaba-pc ~/tmp/nettuts $ chmod +r-w ./thirddir/ dr-xr-xr-x 2 csaba csaba 4096 feb 24 00:44 thirddir
第二個例子中,我們選擇性的加上讀取的權限,去掉了寫入的權限,沒有改動可執行權限。
但是有時,你需要使用二進制的表示。chmod指令允許你使用10進制表示的二進制資料來更改權限。
rwx: 每一個bit都設定成1: 111. 十進制的7.
rw-: 由110代表. 十進制 6.
r-x: 由101代表. 十進制 5.
r--: 100. 十進制 4.
-wx: 011. 十進制 3.
-w-: 010. 十進制 2.
--x: 001. 十進制 1.
---: 000. 十進制 0.
chmod指令可以接受一個由0-7數字組成的字元串。每個數字由:使用者,組,其他人,的順序表示了特定的權限。
csaba@csaba-pc ~/tmp/nettuts $ chmod 765 ./thirddir/ drwxrw-r-x 2 csaba csaba 4096 feb 24 00:44 thirddir
這個指令設定了讀取,寫入,可執行給擁有者,讀取,寫入,不可執行給組,讀取,可執行,還有不可寫入給其他人。
下頁是一些非常有用的指令。
這個指令使用你能讀出檔案的内容。隻要簡單地提供一個檔案名作為參數,之後它會輸出這個檔案的内容到标準輸出(stdout)。
csaba@csaba-pc ~/tmp/nettuts $ cat ./seconddir/thirdfile
grep查找一個模式并輸出相比對的行。你可以通過第三個參數指定要查找的檔案:
csaba@csaba-pc ~/tmp/nettuts $ grep "anotherfile" ./seconddir/thirdfile
加入--color選項,可以在結果行高亮比對的内容。
管道使用 | 這個字元表示; 它接受一個指令的輸出并将其傳給|後的指令. 這聽起來好像挺簡單的.但确是複雜的, 那一個符号| 實作起來卻用了幾萬行代碼, 你可以這樣用:
csaba@csaba-pc ~/tmp/nettuts $ cat ./seconddir/thirdfile | grep "another"
這實際上運作cat指令, 而不是輸出結果發送到标準輸出, 管道将标準輸出作為标準輸入傳給grep指令.grep指令讀取輸入的資料, 并搜尋字條串"another", 結果和我們先前的例子一樣。
sed 指令可以讓你在輸出中執行一些正規表達式操作。 sed可以用在标準輸出或者管道指令中,它會輸出結果到标準輸出。
csaba@csaba-pc ~/tmp/nettuts $ cat ./seconddir/thirdfile | grep "another" | sed -e "s/anotherfile/myfile/" ./seconddir/myfile
這個例子添加了sed指令。有了sed的幫助,我們可以在标準輸出中将“anotherfile” 替換為“myfile”,是不是很酷?
假設你需要經常執行下面的連接配接ssh的指令:
csaba@csaba-pc ~/tmp/nettuts $ ssh [email protected] -p 8743
你可以通過建立一個自定義的指令saysshcon來縮短這個指令。你可以使用alias來自定義指令。alias文法類似這樣的形式:alias shorthand='original_command'。
csaba@csaba-pc ~/tmp/nettuts $ alias sshcon='ssh [email protected] -p 8743'
但是alias是臨時的,當你登出之後就會失效。一個可能的解決辦法是編輯你的.bashrc檔案。
.bashrc檔案一般位于你的使用者目錄。這個檔案可以讓你指定任何你想在新開一個控制台或者登入一個shell時想要執行的指令。讓我們把上面提到的sshcon加到裡面。
csaba@csaba-pc ~/tmp/nettuts $ mcedit ~/.bashrc
把你的代碼加到檔案末尾,按f2儲存檔案,然後按esc兩次關閉檔案。按ctrl+d退出shell,然後打開另一個shell,試試新添加的alias。
一些作業系統, 像solaris, 可能沒有~/.bashrc檔案。遇到這種情況,你可以編輯~/.bash_profile來實作這個操作。事實上,任何系統上都有~/.bash_profile。
隐藏檔案: 以一個點 (.) 開頭的檔案表明這個檔案是隐藏檔案。
讓我們來玩些許網絡指令。
ping指令是一種用來檢測一個伺服器線上并可通路的一種簡單方法。
csaba@csaba-pc ~/tmp/nettuts $ ping 8.8.8.8 ping 8.8.8.8 (8.8.8.8) 56(84) bytes of data. 64 bytes from 8.8.8.8: icmp_seq=1 ttl=47 time=44.0 ms 64 bytes from 8.8.8.8: icmp_seq=2 ttl=47 time=65.6 ms ^c --- 8.8.8.8 ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 1000ms rtt min/avg/max/mdev = 44.081/54.871/65.661/10.790 ms csaba@csaba-pc ~/tmp/nettuts $ ping inexistent.server ping: unknown host inexistent.server
它的語言簡單:ping ip_address_or_name。如果伺服器可通路,你會看到詳細回複清單。如果不可通路,會出現一個描述出錯資訊的問題。
traceroute指令可以得出從你電腦到目标裝置的路由。
csaba@csaba-pc ~/tmp/nettuts $ traceroute 8.8.8.8 traceroute to 8.8.8.8 (8.8.8.8), 30 hops max, 60 byte packets 1 192.168.111.1 (192.168.111.1) 0.239 ms 0.322 ms 0.317 ms 2 * * * 3 95.77.39.65 (95.77.39.65) 45.754 ms 45.887 ms 46.024 ms 4 ro-cj01a-rd4-xe-1-2-1-v1643.upcnet.ro (84.116.216.1) 83.121 ms ro-cj01a-rd4-xe-1-2-0-v1642.upcnet.ro (84.116.225.253) 83.289 ms ro-cj01a-rd4-xe-1-3-0-v1713.upcnet.ro (84.116.217.26) 83.119 ms 5 84.116.217.93 (84.116.217.93) 83.153 ms 84.116.217.85 (84.116.217.85) 77.407 ms 77.350 ms 6 84-116-131-53.aorta.net (84.116.131.53) 77.327 ms 53.442 ms 53.357 ms 7 84.116.132.174 (84.116.132.174) 53.211 ms 48.923 ms 53.186 ms 8 72.14.219.9 (72.14.219.9) 85.040 ms 72.14.214.29 (72.14.214.29) 67.289 ms 72.216 ms 9 209.85.241.110 (209.85.241.110) 48.129 ms 47.389 ms 209.85.240.64 (209.85.240.64) 45.096 ms 10 72.14.239.62 (72.14.239.62) 47.254 ms 72.14.236.68 (72.14.236.68) 51.770 ms 72.14.239.62 (72.14.239.62) 43.242 ms 11 209.85.254.118 (209.85.254.118) 46.137 ms 209.85.254.116 (209.85.254.116) 52.165 ms 209.85.254.114 (209.85.254.114) 102.070 ms 12 * * * 13 google-public-dns-a.google.com (8.8.8.8) 47.471 ms 47.986 ms 43.645 ms
*nix和windows系統都有路由指令。盡管它們在文法上不同,但是基本的功能都是一樣的。這個指令允許我們檢視系統目前路由表,并在必要時添加或删除靜态路由。
csaba@csaba-pc ~/tmp/nettuts $ route kernel ip routing table destination gateway genmask flags metric ref use iface default 192.168.111.1 0.0.0.0 ug 0 0 0 eno1 loopback localhost 255.0.0.0 ug 0 0 0 lo 192.168.111.0 * 255.255.255.0 u 1 0 0 eno1
第一列是網絡連接配接或通訊的目的位址。“default”指的是沒有找到比對的項或發送到本地的路由。loopback是本地虛拟裝置,它的ip位址是 127.0.0.1。這個ip位址在所有作業系統中都存在并總是指向本地機器(沒有其它位址像127.0.0.1一樣的功能)
第二列是連接配接用以到達目的所使用的網關。第一行顯示的是我的預設網關192.168.111.1。第二行是環回到達本地;第三行到達*,不需要網關用來通路我們自身的網絡。
第三個有趣的是最後一列:”iface“。它指定用以同特定目的通信的接口。在我們的例子中,環回通信通過環回接口lo。其它的所有連接配接通過接口eno1。
小貼士:如果你找不到route指令,可以試一下netstat -nr。它會産生相似的輸出。
如果你想要瞅一眼網絡配置,隻需在指令行中鍵入 ifconfig。
csaba@csaba-pc ~/tmp/nettuts $ ifconfig eno1: flags=4163 mtu 1500 inet 192.168.111.10 netmask 255.255.255.0 broadcast 192.168.111.255 inet6 fe80::4e72:b9ff:fef6:c9ff prefixlen 64 scopeid 0x20 ether 4c:72:b9:f6:c9:ff txqueuelen 1000 (ethernet) rx packets 2935016 bytes 696255521 (664.0 mib) rx errors 0 dropped 0 overruns 0 frame 0 tx packets 5586410 bytes 6331639146 (5.8 gib) tx errors 0 dropped 0 overruns 0 carrier 1 collisions 0 device interrupt 17 lo: flags=73 mtu 16436 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10 loop txqueuelen 0 (local loopback) rx packets 7396 bytes 599533 (585.4 kib) tx packets 7396 bytes 599533 (585.4 kib) tx errors 0 dropped 0 overruns 0 carrier 0 collisions 0
這裡有很多資訊。首先,我們擁有兩部分,每個網絡擴充卡一個。系統中,我的有線網卡名為 eno1。你可以看到如 e1000g0,eth0,en0 或是其它的名字。無線網絡裝置則通常(但并非絕對)以“w“開頭。
在名字的同一行中,則是接口的目前狀态。這裡,接口狀态為 up、broadcast、running等。 第二行則是 ipv4 ip 位址、子網路遮罩和網關位址。第三行與第二行相似,但對象是 ipv6。第四行以 “ether” 開始,是網卡的 mac 位址,後面的數行則顯示的是資料傳輸的統計資訊。
另一個非常有用的指令是netstat。它可以列出系統所有的網絡連接配接,以及相應的ip,接口,和系統所監聽的端口。以上是我的系統中,netstat指令所輸出的一部分。我去除了不相關的資訊以使得其簡潔些。
csaba@csaba-pc ~/tmp/nettuts $ netstat -an active internet connections (servers and established) proto recv-q send-q local address foreign address state tcp 0 0 0.0.0.0:22 0.0.0.0:* listen tcp 0 0 127.0.0.1:631 0.0.0.0:* listen tcp 0 0 0.0.0.0:59017 0.0.0.0:* listen tcp 0 40 192.168.111.10:59017 109.99.97.81:53681 established tcp 0 0 192.168.111.10:51137 109.99.97.81:55175 time_wait tcp 0 0 192.168.111.10:34715 173.194.70.109:993 established tcp 0 0 192.168.111.10:34722 173.194.70.109:993 established tcp 0 1 192.168.111.10:42876 86.162.58.4:7055 last_ack tcp6 0 0 :::111 :::* listen tcp6 0 0 :::4434 :::* listen tcp6 0 0 :::59017 :::* listen
每一行表示一個處于特定狀态的連接配接,在這個例子中,你可以看到這些連接配接處于監聽狀态(看第一行,端口22,我的ssh服務端),已連接配接狀态,等待狀态等等。
于是,你擁有了一些最常用的cli指令!當然,這些指令的能力遠超我在本教程中的介紹。希望我的文章能夠為你揭開 cli 神秘面紗的一角。感謝閱讀!
<b> 原文釋出時間為:2013-03-15</b>
<b>本文來自雲栖社群合作夥伴“linux中國”</b>