命令行:你的至交好友
命令行既可以成為你的至交好友,又可能成為你最大的敵人。它關(guān)鍵取決于你怎樣用它,以及用它來做什么。如果你還是像大部分人一樣畏懼使用命令行界面,那么這篇文章定會(huì)讓你受益匪淺。
命令行界面
是的,它是在黑色屏幕上的白色(或者綠色)的顯示區(qū)域,是神秘的文字流和奇怪的命令執(zhí)行的地方。我知道很多大師級(jí)的程序員從來不使用命令行界面;然而,我也知道一些初級(jí)用戶用命令行來做所有的事而不是用圖形界面。他們控制應(yīng)用程序去瀏覽網(wǎng)頁和文件系統(tǒng),查收郵件,查看圖片和編輯文字。他們甚至看youtyube視頻和查看PDF文件都不使用圖形界面!
最好的工作流程是取決于個(gè)人的。有些人傾向于圖形界面,其他人則鐘愛于命令行。
術(shù)語
剛剛接觸Unix或者Linux的人在面對(duì)諸如終端,控制臺(tái)和Shell時(shí)是比較困惑的。
從用戶的角度來看,它們之間似乎是沒有太大區(qū)別的,但事實(shí)上,用戶是使用控制臺(tái)來連接終端來查看運(yùn)行在計(jì)算機(jī)上的腳本。
在過去的時(shí)候,這三者是獨(dú)立的硬件。控制臺(tái)無非是一個(gè)顯示器和一個(gè)鍵盤;它沒有計(jì)算能力。它通過一個(gè)串行接口去連接終端,應(yīng)用最廣泛的是RS-232接口。
終端就像大型主機(jī)的界面。它一般具有計(jì)算、網(wǎng)絡(luò)通信或進(jìn)行其他特殊連接,如與大型主機(jī)連接的能力。終端也提供了對(duì)系統(tǒng)的管理者權(quán)限,這也是它為什么總是被關(guān)在小黑屋的原因。被雇用者使用連接到這些終端的控制臺(tái)進(jìn)行工作,但是卻無法獲得大型主機(jī)的管理者權(quán)限??刂婆_(tái)與終端最終合并為一個(gè)單獨(dú)的設(shè)備,最好的例子的就是現(xiàn)代linux發(fā)行版中仿真的虛擬機(jī)終端。
Shell就是一個(gè)可以讀取用戶輸入,然后在屏幕輸出結(jié)果的程序。一個(gè)Shell可以是基于字符的(像CLI),或者是基于圖形的(像Windows的GUI)。今天,Shell已經(jīng)不僅僅是用戶與系統(tǒng)的接口,他還肩負(fù)著管理進(jìn)程,窗口,應(yīng)用程序,命令,以及系統(tǒng)的其他方面。
Shell解釋執(zhí)行命令行中輸入的命令,用戶也可以將命令組合起來寫成一個(gè)腳本?,F(xiàn)代的Shell擁有自己的腳本語言,這提供了執(zhí)行復(fù)雜任務(wù)的能力。
大多數(shù)現(xiàn)代的Linux發(fā)行版,如同Mac OSX一樣,使用一個(gè)Shell,BASH(譯注:默認(rèn)的,想用什么自己換)。Solaris和OpenIndiana默認(rèn)使用Korn Shell,一個(gè)BASH的變種。請(qǐng)注意這篇指南主要講的是BASH。#p#
讓我們說說BASH
BASH 代表 Bourne Again Shell。它被作為 Bourne Shell 的新版本于1989年發(fā)布,之后成為了 Unix 系統(tǒng)的默認(rèn) Shell。它由斯蒂芬·伯恩(Stephen Bourne)編寫,用以取代 Thompson Shell。老版的 Bourne Shell 至今仍工作在一些 Unix 系統(tǒng)中。通常你可以用 /bin/sh 找到它??傊M管 Bourne Shell 在新的 Linux 發(fā)行版中 已經(jīng)為 BASH 取代,/bin/sh 和 /bin/bash 都能被 BASH 運(yùn)行。
BASH的提示符
你永遠(yuǎn)都會(huì)碰到BASH的提示符。它是一個(gè)貫穿BASH及其歷史的東西。如果篇幅允許,我們可以用所有篇幅講講如何按自己的希望配置BASH的提示符。但是,我們只會(huì)在這個(gè)指南中提到一些基本的東西。
csaba@csaba-pc ~/Personal/Programming/NetTuts$
我的BASH提示符就像上面那個(gè)樣子。 第一個(gè)詞csaba是我的用戶名,后接@和我的主機(jī)名稱,最后是當(dāng)前的文件夾。~這個(gè)字符代表了用戶文件夾,對(duì)于我來說是/home/csaba。整行以$結(jié)尾,在$后面輸入的東西是我想Shell執(zhí)行的命令。
當(dāng)然,這僅僅是一個(gè)簡(jiǎn)單的例子。你可以放更多的東西進(jìn)提示符中。來看看更多的例子吧。
PS1,PS2,PS3和PS4是BASH的特殊變量,它們控制著不同類型的提示符(例如PS2是一般使用于命令行里較長(zhǎng)命令的換行提示信息)。我們?cè)谶@篇指南中只用到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中,我們將$到變量名稱前就可以得到這個(gè)變量的內(nèi)容。這個(gè)echo命令僅僅會(huì)輸出它接到的參數(shù)。我們給echo的參數(shù)是變量的值,所以它會(huì)輸出這個(gè)變量的值。
輸出代表著一種格式。\[\033[01;32m\]表示綠色,\u表示當(dāng)前用戶的用戶名。\h表示主機(jī)名,\[\033[01;34m\]表示藍(lán)色,\w是當(dāng)前目錄,\[\033[00m\]是將文字后續(xù)輸入的文字置為高亮灰色。通過下面的屏幕截圖你能夠更好地理解結(jié)果。
以“\”開頭的特殊字符具有特別的意義。反之“\”標(biāo)識(shí)后面的字符是一個(gè)轉(zhuǎn)義字符(比如顏色代碼)。下面的內(nèi)容是從BASH官方手冊(cè)中引用的,你可以在BASH命令中使用的特殊字符的完整列表:
- \a- ASCII響鈴字符(07)
- \d– 以“Weekday Month Date”格式顯示日期
- \D{format}– format被傳遞給strftime(3)并把相應(yīng)的結(jié)果插入到提示字符串中; 如果format為空則代表本地時(shí)間. 必須有在括號(hào)
- \e– ASCII轉(zhuǎn)義字符(033)
- \h– 到第一個(gè) `.’前代表主機(jī)名稱
- \H– 主機(jī)名稱
- \j– 當(dāng)前被Shell管理工作數(shù)
- \l– Shell終端設(shè)置名稱的基本名
- \n– 新行
- \r– 回車
- \s– Shell的名稱
- \T– 12小時(shí)制當(dāng)前時(shí)間,格式為 HH:MM:SS
- \t– 24小時(shí)制當(dāng)前時(shí)間,格式為 HH:MM:SS
- \@– 12小時(shí)制當(dāng)前時(shí)間,格式為am/pm
- \A– 24小時(shí)制當(dāng)前時(shí)間,格式為 HH:MM
- \u– 當(dāng)前用戶的名稱
- \v– BASH版本
- \V– BASH發(fā)行備注,版本號(hào)+補(bǔ)丁
- \w– 當(dāng)前工作目錄,其中$HOME被縮寫成"~"(使用PROMPT_DIRTRIM的值)
- \W– 當(dāng)前工作目錄的basename,$HOME被縮寫成"~"
- \!– 命令的使用次數(shù)
- \#– 命令號(hào)
- \$– 命令提示符,如果UID是0則顯示為#,否則為$
- \nnn– 8進(jìn)制數(shù)據(jù)nnn代表的字符
- \\– 反斜杠
- \[- 開始一個(gè)非打印字符序列,這個(gè)序列可以嵌入一個(gè)終端控制序列到提示中
- \]– 非打印字符序列結(jié)束
#p#
操作目錄和文件
在命令行環(huán)境中,每個(gè)人都要做的一件事就是操作文件系統(tǒng),創(chuàng)建,刪除,復(fù)制和移動(dòng)文件系統(tǒng)對(duì)象,并且執(zhí)行命令。這對(duì)你來說可能已經(jīng)是家常便飯,然而,還是讓我們來看一眼:
- 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下創(chuàng)建一個(gè)名為NetTuts的目錄
- 將剛剛創(chuàng)建的目錄切換為當(dāng)前目錄
- 在當(dāng)前目錄下創(chuàng)建一個(gè)名為“AnotherDir”的目錄
- 在當(dāng)前目錄下創(chuàng)建一個(gè)名為“SecondDir”的目錄
- 使用touch命令在“SecondDir”目錄下創(chuàng)建兩個(gè)空文件
- 切換當(dāng)前目錄到SecondDir.
- 使用pushd命令切換目錄到~/tmp/NetTuts來把當(dāng)前目錄存儲(chǔ)到堆棧之中
- 列出目錄~/tmp/NetTuts下的所有文件
- 使用popd命令來返回前一個(gè)目錄,這樣會(huì)從堆棧中獲取并且移除最頂層的目錄
- 再一次列出內(nèi)容會(huì)看到我們上幾步所創(chuàng)建的兩個(gè)文件
當(dāng)然,對(duì)于命令行你們可以有個(gè)萬能文件管理器,稱之為Midnight Commander。要開始用的時(shí)候只需要執(zhí)行它的命令就行。它也內(nèi)置了文本編輯器(高亮代碼的那段)適合大部分語言,而且有智能縮進(jìn)和其他的一些特性。它不完全是一個(gè)被夸大的編輯器,事實(shí)上,它是一個(gè)相當(dāng)簡(jiǎn)單的工具,特別適合簡(jiǎn)單和快速編輯。你可以隨意的選擇任何文件然后按F4,或者你可以在編輯模式下直接打開一個(gè)文件。
csaba@csaba-pc ~/tmp/NetTuts/SecondDir $ mcedit ./aFile
輸入/輸出
每個(gè)命令必須和命令行環(huán)境交互。命令需要輸入和提供輸出。
- 標(biāo)準(zhǔn)輸入是命令讀取信息的來源。鍵盤是默認(rèn)標(biāo)準(zhǔn)輸入,標(biāo)準(zhǔn)輸入經(jīng)常被稱為“stdin”。
- 標(biāo)準(zhǔn)輸出是命令的輸出會(huì)被發(fā)送到的地方。默認(rèn)是當(dāng)前控制臺(tái),標(biāo)準(zhǔn)輸出通常被稱為“stdout”。
- 標(biāo)準(zhǔn)錯(cuò)誤是命令輸出錯(cuò)誤的地方。默認(rèn)當(dāng)前控制臺(tái),常被稱為"stderr"。
到目前為止,我們可以定義簡(jiǎn)單的狀態(tài),來表示一個(gè)命令從鍵盤上讀取并輸出它的結(jié)果(包括好的和壞的)到屏幕上。
在Unix(或類unix系統(tǒng))中, 所有的東西都會(huì)被抽象成文件,你的鍵盤是文件,你的鼠標(biāo)是文件,你的屏幕是文件,程序是文件, 文本是文件,等等。 |
文件描述符是一個(gè)整形數(shù)字用于操作系統(tǒng)引用打開的文件, 所有的unix系統(tǒng)至少包含三個(gè)文件描述符。
- 描述符 no. 0 – 標(biāo)準(zhǔn)輸入
- 描述符 no. 1 – 標(biāo)準(zhǔn)輸出
- 描述符 no. 2 – 標(biāo)準(zhǔn)錯(cuò)誤輸出
重定向
Unix系統(tǒng)有一個(gè)非常強(qiáng)大的特性:因?yàn)樗匈Y源都是文件,你可以將所有資源引用和將其從一個(gè)位置重定向到另一個(gè)位置。重定向的操作符<表示標(biāo)準(zhǔn)輸入(stdin),>表示標(biāo)準(zhǔn)輸出(stdout)。所以,如果你需要一個(gè)命令從鍵盤中讀取信息,你可以進(jìn)行如下操作:
$ someCommand <
但當(dāng)要你的命令從一個(gè)文件中讀取內(nèi)容你要怎么做呢?你只要重定向這個(gè)文件到它的標(biāo)準(zhǔn)輸入(stdin),如下:
$ someCommand < /your/file.txt
如果你要你的命令執(zhí)行結(jié)果輸出到一個(gè)文件,你可以使用>操作符。例如我們已經(jīng)知道如何將一個(gè)目錄中的文件列出:
- 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 $
你可以把使用如下命令將結(jié)果發(fā)送到一個(gè)文件:
csaba@csaba-pc ~/tmp/NetTuts/SecondDir $ ls -al > ./ThirdFile
ThirdFile的內(nèi)容如下:
- total 12
- drwxr-xr-x 2 csaba csaba 4096 Feb 24 00:06 .
- drwxr-xr-x 4 csaba csaba 4096 Feb 19 21:09 ..
- -rw-r--r-- 1 csaba csaba 12 Feb 19 21:19 aFile
- -rw-r--r-- 1 csaba csaba 0 Feb 19 21:09 AnotherFile
- -rw-r--r-- 1 csaba csaba 0 Feb 24 00:06 ThirdFile
比方說,我們要導(dǎo)航到上級(jí)目錄,列出它所有的文件,并且使用一個(gè)命令將這個(gè)列表添加至一個(gè)已經(jīng)存在的文件中。操作符>重定向輸出到一個(gè)文件并且覆蓋該文件;所以我們不能使用它。不過,我們可以使用>>(兩個(gè)>)來添加新數(shù)據(jù)到一個(gè)已經(jīng)存在的文件。
- csaba@csaba-pc ~/tmp/NetTuts/SecondDir $ cd ..
- 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 24 00:06 SecondDir
- csaba@csaba-pc ~/tmp/NetTuts $ ls -al >> ./SecondDir/ThirdFile
于是我們的文件內(nèi)容就是這樣了:
- total 12
- drwxr-xr-x 2 csaba csaba 4096 Feb 24 00:06 .
- drwxr-xr-x 4 csaba csaba 4096 Feb 19 21:09 ..
- -rw-r--r-- 1 csaba csaba 12 Feb 19 21:19 aFile
- -rw-r--r-- 1 csaba csaba 0 Feb 19 21:09 AnotherFile
- -rw-r--r-- 1 csaba csaba 0 Feb 24 00:06 ThirdFile
- 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 24 00:06 SecondDir
#p#
輸入/輸出重定向
我們可以綜合我們的知識(shí),以不同的方向重定向標(biāo)準(zhǔn)錯(cuò)誤(stderr),標(biāo)準(zhǔn)輸入(stdin)和標(biāo)準(zhǔn)輸出(stdout)。實(shí)際上,以下的命令功能相同:
csaba@csaba-pc ~/tmp/NetTuts $ ls -al > ./SecondDir/ThirdFile csaba@csaba-pc ~/tmp/NetTuts $ ls -al 1> ./SecondDir/ThirdFile
在第二個(gè)命令中,在重定向之前我們指定標(biāo)準(zhǔn)輸出的來源。請(qǐng)注意1與>之間沒有空格。實(shí)際上,如果兩者之間有空格,則1會(huì)作為ls命令的一個(gè)參數(shù),并且>會(huì)自動(dòng)重定向標(biāo)準(zhǔn)輸出。以下兩個(gè)表達(dá)功能相同,但和上面的那個(gè)功能不同。
csaba@csaba-pc ~/tmp/NetTuts $ ls -al 1 > ./SecondDir/ThirdFile csaba@csaba-pc ~/tmp/NetTuts $ ls -al 1 1> ./SecondDir/ThirdFile
當(dāng)然,這些結(jié)果會(huì)出錯(cuò):"ls:不能訪問1:沒有那個(gè)文件或目錄” ——除非你真的有一個(gè)名字為1的目錄。這會(huì)讓我們驚訝下一步我們得到的:重定向錯(cuò)誤。
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
如你所見,第一個(gè)命令在控制臺(tái)輸出標(biāo)準(zhǔn)輸出并重定向標(biāo)準(zhǔn)輸出到一個(gè)文件。第一個(gè)命令的結(jié)果是一個(gè)空文件和屏幕上的一條信息。然而,第二條命令重定向錯(cuò)誤到我們的文件。其結(jié)果是如果在標(biāo)準(zhǔn)輸出上有任何輸出,則它們會(huì)顯示在屏幕上,并且錯(cuò)誤信息會(huì)輸入到這個(gè)文件。#p#
一個(gè)實(shí)際的I/0重導(dǎo)例子
當(dāng)你需要在命令行尋找一些文件時(shí),你基本上只有兩個(gè)選擇。第一個(gè)就是選擇用本地命令。這些命令常常是伴隨著安裝各種Linux版本而已經(jīng)安裝好的,當(dāng)然不是每一個(gè)版本都安裝了。更新文件數(shù)據(jù)庫(kù)命令索引你的文件和定位,然后使用那個(gè)數(shù)據(jù)庫(kù)去發(fā)現(xiàn)你的文件。實(shí)際上他不是做一個(gè)實(shí)時(shí)的搜索,它只是簡(jiǎn)單的在數(shù)據(jù)庫(kù)做索引。這就是為什么這個(gè)應(yīng)用程序常常定期的做每日更新文件數(shù)據(jù)庫(kù)。
我們來用這個(gè)命令演示一個(gè)實(shí)時(shí)搜索,它比本地命令搜索的更精確,但是很顯然更慢一些?,F(xiàn)在讓我們用這個(gè)命令來演示一段:
- 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 24 00:06 SecondDir
- csaba@csaba-pc ~/tmp/NetTuts $ ls -al ./SecondDir/
- total 16
- drwxr-xr-x 2 csaba csaba 4096 Feb 24 00:06 .
- drwxr-xr-x 4 csaba csaba 4096 Feb 19 21:09 ..
- -rw-r--r-- 1 csaba csaba 12 Feb 19 21:19 aFile
- -rw-r--r-- 1 csaba csaba 0 Feb 19 21:09 AnotherFile
- -rw-r--r-- 1 csaba csaba 61 Feb 24 00:23 ThirdFile
- csaba@csaba-pc ~/tmp/NetTuts $ find . -name ThirdFile
- ./SecondDir/ThirdFile
我打印這兩個(gè)ls命令是為了讓你很方便的看明白目錄結(jié)構(gòu),第三個(gè)是find命令。它有著復(fù)雜的參數(shù)系統(tǒng),在此我就不一一列舉了,但是以上的例子展示了find命令最常見的使用。第一個(gè)參數(shù).是一個(gè)我們想去搜索的目錄。
find命令的第二個(gè)參數(shù)是-name,緊接著是文件的名字。在-name參數(shù)中我們可以用?和*來擴(kuò)大我們的搜索范圍:
- csaba@csaba-pc ~/tmp/NetTuts $ find . -name ?File
- ./SecondDir/aFile
- csaba@csaba-pc ~/tmp/NetTuts $ find . -name *File
- ./SecondDir/aFile
- ./SecondDir/AnotherFile
- ./SecondDir/ThirdFile
???代表一個(gè)單個(gè)字母,而*指的是任意的字母數(shù)量。
接下來,我們將創(chuàng)建一個(gè)目錄同時(shí)使它被我們的用戶所不能讀。我們還沒有講解到權(quán)限,但是不用著急,很快我們將涉及那部分?,F(xiàn)在試試下面的例子:
- csaba@csaba-pc ~/tmp/NetTuts $ mkdir ThirdDir
- csaba@csaba-pc ~/tmp/NetTuts $ chmod 000 ThirdDir
- csaba@csaba-pc ~/tmp/NetTuts $ find . -name *File
- ./SecondDir/aFile
- ./SecondDir/AnotherFile
- ./SecondDir/ThirdFile
- find: `./ThirdDir': Permission denied
在這個(gè)例子中,我希望你對(duì)這目錄沒有權(quán)限以便我可以展示一下find輸出的內(nèi)容。它試著進(jìn)入到所有的目錄中然后搜索所有匹配的文件。當(dāng)它不能進(jìn)入一個(gè)目錄,它會(huì)輸出一條信息。當(dāng)你看到一兩條這樣的信息提示是很正常的哈,但是作為一個(gè)普通用戶去試著搜索root目錄下面的文件時(shí)。你將會(huì)獲取數(shù)百條錯(cuò)誤信息提示而且可能只有一兩條搜索結(jié)果。你不想錯(cuò)過搜索結(jié)果;于是乎你想要除去錯(cuò)誤的信息提示。
csaba@csaba-pc ~/tmp/NetTuts $ find . -name *File 2> /dev/null ./SecondDir/aFile ./SecondDir/AnotherFile ./SecondDir/ThirdFile
我們重定向標(biāo)準(zhǔn)錯(cuò)誤輸出到/dev/null里面。這樣做再好不過了。無論你向/dev/null扔進(jìn)去什么東西,它都可以很簡(jiǎn)單的使他消失。通常的做法是當(dāng)你不想看見這些錯(cuò)誤提示信息,你可以把信息發(fā)到那里。假如你更喜歡把結(jié)果存入一個(gè)文件中的話,你可以把錯(cuò)誤提示信息傳送到/dev/null,然后可以用多道重定向:
csaba@csaba-pc ~/tmp/NetTuts $ find . -name *File 2> /dev/null 1>./SecondDir/ThirdFile csaba@csaba-pc ~/tmp/NetTuts $
正如你看見的,這個(gè)命令在屏幕上面什么也沒有輸出,因?yàn)殄e(cuò)誤信息和標(biāo)準(zhǔn)輸出被傳送到了不同的文件中。但是如果我們想在同一個(gè)文件中看到兩種信息的輸出,怎么辦呢?沒問題,你可以把標(biāo)準(zhǔn)錯(cuò)誤輸出傳送到標(biāo)準(zhǔn)輸出然后把標(biāo)準(zhǔn)輸出傳送到文件中:
find . -name *File 1>./SecondDir/ThirdFile 2>&1
重定向被解釋執(zhí)行是從右到左的。首先開始執(zhí)行的是 2>&1,這里的意思是重定向標(biāo)準(zhǔn)錯(cuò)誤輸出到標(biāo)準(zhǔn)輸出。然后是1>./SecondDir/ThirdFile,這里的意思是重定向標(biāo)準(zhǔn)輸出(此時(shí)已經(jīng)有錯(cuò)誤信息在文件里面了)到指定的文件。#p#
再來談一下用戶權(quán)限
本文中所談及的所有權(quán)限問題都僅限于 *nix 操作系統(tǒng)。我對(duì)最新的 Windows 版本并不熟悉,但微軟在其文件系統(tǒng)中使用了一種不同的權(quán)限概念。
用戶和組
同一臺(tái)電腦中可以又?jǐn)?shù)個(gè)不同的用戶。事實(shí)上,很多應(yīng)用注冊(cè)自己的特殊用戶,并在一個(gè)受限的環(huán)境里運(yùn)行程序。每個(gè)用戶以名稱和/或 ID(UID) 區(qū)分。
你可以在 /etc/passwd 文件中找到現(xiàn)有用戶的列表。 |
組的列表存放在 /etc/group 文件中。一個(gè)組擁有一個(gè)名字和一個(gè) ID (GID),并擁有另個(gè)或數(shù)個(gè)用戶。每個(gè)用戶通常還擁有一個(gè)與之對(duì)應(yīng)的組,名稱相同。
擁有者
文件有其擁有者,默認(rèn)情況,創(chuàng)建那個(gè)文件的用戶就是它的擁有者。文件夾僅僅是一些特殊的文件,它們跟普通文件遵從一樣的規(guī)則。
- csaba@csaba-pc ~/tmp/NetTuts $ ls -al
- total 20
- drwxr-xr-x 5 csaba csaba 4096 Feb 24 00:44 .
- 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 24 00:06 SecondDir
- d--------- 2 csaba csaba 4096 Feb 24 00:44 ThirdDir<span></span>
在ls -al命令中,每一個(gè)文件的擁有者會(huì)像“用戶 組”(在這個(gè)例子中是“csaba csaba”)輸出。我們可以用下面的方法改變AnotherDir這個(gè)文件夾的擁有者:
- csaba@csaba-pc ~/tmp/NetTuts $ chown csaba:users ./AnotherDir/
- csaba@csaba-pc ~/tmp/NetTuts $ ls -al
- total 20
- drwxr-xr-x 5 csaba csaba 4096 Feb 24 00:44 .
- drwx------ 7 csaba csaba 4096 Feb 19 21:09 ..
- drwxr-xr-x 2 csaba users 4096 Feb 19 21:09 AnotherDir
- drwxr-xr-x 2 csaba csaba 4096 Feb 24 00:06 SecondDir
- d--------- 2 csaba csaba 4096 Feb 24 00:44 ThirdDir
chown命令用途是改變擁有者(CHange OWNer)。它有一個(gè)簡(jiǎn)單的用法:chown 用戶:組 文件路徑。一個(gè)用戶只能將“組”這個(gè)位置改成一個(gè)他所在的組。一個(gè)普通用戶不能更改他無權(quán)讀取的文件的擁有者。當(dāng)然,擁有管理員權(quán)限的用戶,如“root”,可以把任意文件的擁有者改成任意用戶和組。
這里有三種關(guān)于文件的權(quán)限:
- r – 讀取
- w – 寫入
- x – 執(zhí)行
請(qǐng)注意: 如果一個(gè)文件夾內(nèi)的文件可以被列出,這個(gè)文件夾本身擁有可執(zhí)行的權(quán)限(x)。
看看前面的例子,每一個(gè)文件系統(tǒng)的對(duì)象的權(quán)限在輸出的開頭(那些rwx字符)。每個(gè)標(biāo)志位可以是”被設(shè)置“(那些有字母的位置),或者是“未設(shè)置”(用一個(gè)”-“標(biāo)識(shí),代表沒有這個(gè)權(quán)限)。
這三種權(quán)限被包含于三個(gè)組, 即每個(gè)組都有這三種權(quán)限:
- 用戶 – 對(duì)擁有者的權(quán)限
- 組 – 對(duì)這個(gè)文件所在組的成員的權(quán)限
- 其他人 – 對(duì)其他想要讀取這個(gè)文件或文件夾的用戶的權(quán)限
這個(gè)叫做ThirdDir的文件夾沒有任何標(biāo)志位,所以它的擁有者也不能讀取它:
chown: changing ownership of ‘./AnotherDir/’: Operation not permitted csaba@csaba-pc ~/tmp/NetTuts $ ls -al ./ThirdDir/* ls: cannot access ./ThirdDir/*: Permission denied
但是擁有者擁有改變它的權(quán)限的權(quán)力:
csaba@csaba-pc ~/tmp/NetTuts $ chmod +rwx ./ThirdDir/ csaba@csaba-pc ~/tmp/NetTuts $ ls -al ./ThirdDir total 8 drwxr-xr-x 2 csaba csaba 4096 Feb 24 00:44 . drwxr-xr-x 5 csaba csaba 4096 Feb 24 00:44 .. csaba@csaba-pc ~/tmp/NetTuts $ ls -al total 20 drwxr-xr-x 5 csaba csaba 4096 Feb 24 00:44 . drwx------ 7 csaba csaba 4096 Feb 19 21:09 .. drwxr-xr-x 2 csaba users 4096 Feb 19 21:09 AnotherDir drwxr-xr-x 2 csaba csaba 4096 Feb 24 00:06 SecondDir drwxr-xr-x 2 csaba csaba 4096 Feb 24 00:44 ThirdDir
chmod命令可以更改一個(gè)文件系統(tǒng)對(duì)象的權(quán)限,,它的用法是:chmod +/-權(quán)限 文件路徑。使用+意味著你將給這個(gè)文件一個(gè)權(quán)限,-意味著去掉一個(gè)權(quán)限。你可以使用任意權(quán)限的組合。上個(gè)例子,我們給ThirdDir加上讀取,寫入,和可執(zhí)行的權(quán)限。
請(qǐng)注意: 用這個(gè)方式添加的讀寫和可執(zhí)行權(quán)限,會(huì)作用于擁有者,組,和其他人。但是寫入權(quán)限只會(huì)作用于當(dāng)前的用戶。
csaba@csaba-pc ~/tmp/NetTuts $ chmod +r-w ./ThirdDir/ csaba@csaba-pc ~/tmp/NetTuts $ ls -al total 20 drwxr-xr-x 5 csaba csaba 4096 Feb 24 00:44 . drwx------ 7 csaba csaba 4096 Feb 19 21:09 .. drwxr-xr-x 2 csaba users 4096 Feb 19 21:09 AnotherDir drwxr-xr-x 2 csaba csaba 4096 Feb 24 00:06 SecondDir dr-xr-xr-x 2 csaba csaba 4096 Feb 24 00:44 ThirdDir
第二個(gè)例子中,我們選擇性的加上讀取的權(quán)限,去掉了寫入的權(quán)限,沒有改動(dòng)可執(zhí)行權(quán)限。
但是有時(shí),你需要使用二進(jìn)制的表示。chmod命令允許你使用10進(jìn)制表示的二進(jìn)制數(shù)據(jù)來更改權(quán)限。
rwx: 每一個(gè)bit都設(shè)置成1: 111. 十進(jìn)制的7. rw-: 由110代表. 十進(jìn)制 6. r-x: 由101代表. 十進(jìn)制 5. r--: 100. 十進(jìn)制 4. -wx: 011. 十進(jìn)制 3. -w-: 010. 十進(jìn)制 2. --x: 001. 十進(jìn)制 1. ---: 000. 十進(jìn)制 0.
chmod命令可以接受一個(gè)由0-7數(shù)字組成的字符串。每個(gè)數(shù)字由:用戶,組,其他人,的順序表示了特定的權(quán)限。
csaba@csaba-pc ~/tmp/NetTuts $ chmod 765 ./ThirdDir/ csaba@csaba-pc ~/tmp/NetTuts $ ls -al total 20 drwxr-xr-x 5 csaba csaba 4096 Feb 24 00:44 . drwx------ 7 csaba csaba 4096 Feb 19 21:09 .. drwxr-xr-x 2 csaba users 4096 Feb 19 21:09 AnotherDir drwxr-xr-x 2 csaba csaba 4096 Feb 24 00:06 SecondDir drwxrw-r-x 2 csaba csaba 4096 Feb 24 00:44 ThirdDir
這個(gè)命令設(shè)置了讀取,寫入,可執(zhí)行給擁有者,讀取,寫入,不可執(zhí)行給組,讀取,可執(zhí)行,還有不可寫入給其他人。#p#
Cat,Sed,Pipe
下頁是一些非常有用的命令。
Cat
這個(gè)命令使用你能讀出文件的內(nèi)容。只要簡(jiǎn)單地提供一個(gè)文件名作為參數(shù),之后它會(huì)輸出這個(gè)文件的內(nèi)容到標(biāo)準(zhǔn)輸出(stdout)。
csaba@csaba-pc ~/tmp/NetTuts $ cat ./SecondDir/ThirdFile ./SecondDir/aFile ./SecondDir/AnotherFile ./SecondDir/ThirdFile find: `./ThirdDir': Permission denied
Grep
Grep查找一個(gè)模式并輸出相匹配的行。你可以通過第三個(gè)參數(shù)指定要查找的文件:
csaba@csaba-pc ~/tmp/NetTuts $ grep "AnotherFile" ./SecondDir/ThirdFile ./SecondDir/AnotherFile
加入--color選項(xiàng),可以在結(jié)果行高亮匹配的內(nèi)容。
Pipe 管道
管道使用 | 這個(gè)字符表示; 它接受一個(gè)命令的輸出并將其傳給|后的命令. 這聽起來好像挺簡(jiǎn)單的.但確是復(fù)雜的, 那一個(gè)符號(hào)| 實(shí)現(xiàn)起來卻用了幾萬行代碼, 你可以這樣用:
csaba@csaba-pc ~/tmp/NetTuts $ cat ./SecondDir/ThirdFile | grep "Another" ./SecondDir/AnotherFile
這實(shí)際上運(yùn)行cat命令, 而不是輸出結(jié)果發(fā)送到標(biāo)準(zhǔn)輸出, 管道將標(biāo)準(zhǔn)輸出作為標(biāo)準(zhǔn)輸入傳給grep命令.grep命令讀取輸入的數(shù)據(jù), 并搜索字條串"Another", 結(jié)果和我們先前的例子一樣
The History of UNIX(unix的歷史): 這是一個(gè)很有年代的視頻,來自AT&T, 這是一個(gè)非常不錯(cuò)的視頻.如果你只對(duì)PIPES感覺趣, 可以快進(jìn)到4:56
Sed
sed 命令可以讓你在輸出中執(zhí)行一些正則表達(dá)式操作。 sed可以用在標(biāo)準(zhǔn)輸出或者管道命令中,它會(huì)輸出結(jié)果到標(biāo)準(zhǔn)輸出。
csaba@csaba-pc ~/tmp/NetTuts $ cat ./SecondDir/ThirdFile | grep "Another" | sed -e "s/AnotherFile/MyFile/" ./SecondDir/MyFile
這個(gè)例子添加了sed命令。有了sed的幫助,我們可以在標(biāo)準(zhǔn)輸出中將“AnotherFile” 替換為“MyFile”,是不是很酷?
sed命令有很多選項(xiàng),使用-e 參數(shù)指定要執(zhí)行的正則表達(dá)式。如果你對(duì)正則表達(dá)式不熟悉的話,查看下面的手冊(cè): Introducing “Regular Expressions: Up and Running” or Regular Expressions Cheat Sheets.#p#
定義你自己的命令行
假設(shè)你需要經(jīng)常執(zhí)行下面的連接ssh的命令:
csaba@csaba-pc ~/tmp/NetTuts $ ssh my_username@complicated.server.address.com -p 8743
你可以通過創(chuàng)建一個(gè)自定義的命令saysshcon來縮短這個(gè)命令。你可以使用alias來自定義命令。Alias語法類似這樣的形式:alias shorthand='original_command'。
csaba@csaba-pc ~/tmp/NetTuts $ alias sshcon='ssh my_username@complicated.server.address.com -p 8743'
但是alias是臨時(shí)的,當(dāng)你退出登錄之后就會(huì)失效。一個(gè)可能的解決辦法是編輯你的.bashrc文件。
.bashrc和.bash.profile文件
.bashrc文件一般位于你的用戶目錄。這個(gè)文件可以讓你指定任何你想在新開一個(gè)控制臺(tái)或者登錄一個(gè)Shell時(shí)想要執(zhí)行的命令。讓我們把上面提到的sshcon加到里面。
csaba@csaba-pc ~/tmp/NetTuts $ mcedit ~/.bashrc
把你的代碼加到文件末尾,按F2保存文件,然后按ESC兩次關(guān)閉文件。按CTRL+D退出Shell,然后打開另一個(gè)Shell,試試新添加的alias。
一些操作系統(tǒng), 像Solaris, 可能沒有~/.bashrc文件。遇到這種情況,你可以編輯~/.bash_profile來實(shí)現(xiàn)這個(gè)操作。事實(shí)上,任何系統(tǒng)上都有~/.bash_profile。
隱藏文件: 以一個(gè)點(diǎn) (.) 開頭的文件表明這個(gè)文件是隱藏文件。
些許網(wǎng)絡(luò)命令
讓我們來玩些許網(wǎng)絡(luò)命令。
Ping
ping命令是一種用來檢測(cè)一個(gè)服務(wù)器在線并可訪問的一種簡(jiǎn)單方法。
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
它的語言簡(jiǎn)單:ping IP_address_or_name。如果服務(wù)器可訪問,你會(huì)看到詳細(xì)回復(fù)列表。如果不可訪問,會(huì)出現(xiàn)一個(gè)描述出錯(cuò)信息的問題。
Traceroute
traceroute命令可以得出從你電腦到目標(biāo)設(shè)備的路由。
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
#p#
路由表
*nix和Windows系統(tǒng)都有路由命令。盡管它們?cè)谡Z法上不同,但是基本的功能都是一樣的。這個(gè)命令允許我們查看系統(tǒng)當(dāng)前路由表,并在必要時(shí)添加或刪除靜態(tài)路由。
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
第一列是網(wǎng)絡(luò)連接或通訊的目的地址。“default”指的是沒有找到匹配的項(xiàng)或發(fā)送到本地的路由。Loopback是本地虛擬設(shè)備,它的IP地址是127.0.0.1。這個(gè)IP地址在所有操作系統(tǒng)中都存在并總是指向本地機(jī)器(沒有其它地址像127.0.0.1一樣的功能)
第二列是連接用以到達(dá)目的所使用的網(wǎng)關(guān)。第一行顯示的是我的默認(rèn)網(wǎng)關(guān)192.168.111.1。第二行是環(huán)回到達(dá)本地;第三行到達(dá)*,不需要網(wǎng)關(guān)用來訪問我們自身的網(wǎng)絡(luò)。
第三個(gè)有趣的是最后一列:”Iface“。它指定用以同特定目的通信的接口。在我們的例子中,環(huán)回通信通過環(huán)回接口lo。其它的所有連接通過接口eno1。
小貼士:如果你找不到route命令,可以試一下netstat -nr。它會(huì)產(chǎn)生相似的輸出。
網(wǎng)絡(luò)配置
如果你想要瞅一眼網(wǎng)絡(luò)配置,只需在命令行中鍵入 ifconfig。
csaba@csaba-pc ~/tmp/NetTuts $ ifconfig eno1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> 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<link> 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<UP,LOOPBACK,RUNNING> mtu 16436 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10<host> loop txqueuelen 0 (Local Loopback) RX packets 7396 bytes 599533 (585.4 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 7396 bytes 599533 (585.4 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
這里又很多信息。首先,我們擁有兩部分,每個(gè)網(wǎng)絡(luò)適配器一個(gè)。系統(tǒng)中,我的有線網(wǎng)卡名為 eno1。你可以看到如 e1000g0,eth0,en0 或是其它的名字。無線網(wǎng)絡(luò)設(shè)備則通常(但并非絕對(duì))以“w“開頭。
在名字的同一行中,則是接口的當(dāng)前狀態(tài)。這里,接口狀態(tài)為 UP、broadcast、running等。 第二行則是 IPv4 IP 地址、子網(wǎng)掩碼和網(wǎng)關(guān)地址。第三行與第二行相似,但對(duì)象是 IPv6。第四行以 “ether” 開始,是網(wǎng)卡的 MAC 地址,后面的數(shù)行則顯示的是數(shù)據(jù)傳輸?shù)慕y(tǒng)計(jì)信息。#p#
當(dāng)前網(wǎng)絡(luò)連接
另一個(gè)非常有用的命令是netstat。它可以列出系統(tǒng)所有的網(wǎng)絡(luò)連接,以及相應(yīng)的IP,接口,和系統(tǒng)所監(jiān)聽的端口。以上是我的系統(tǒng)中,netstat命令所輸出的一部分。我去除了不相關(guān)的信息以使得其簡(jiǎn)潔些。
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
每一行表示一個(gè)處于特定狀態(tài)的連接,在這個(gè)例子中,你可以看到這些連接處于監(jiān)聽狀態(tài)(看第一行,端口22,我的ssh服務(wù)端),已連接狀態(tài),等待狀態(tài)等等。
最后的交代
于是,你擁有了一些最常用的CLI命令!當(dāng)然,這些命令的能力遠(yuǎn)超我在本教程中的介紹。希望我的文章能夠?yàn)槟憬议_ CLI 神秘面紗的一角。感謝閱讀!