《Linux命令速查手冊》筆記

南郭竽發表於2018-05-20

寫在前面:我看過很多技術相關的書籍,但是很少有全部看完的。大部分都是看了一小半,甚至是一大半。但是印象中,沒有哪一本是全部讀完的,哪怕的通讀。

不過這本《Linux命令速查手冊》,我倒是很快讀完了。當然,這本書主要是一些命令的介紹,並沒有深邃的內容。但是,讀完了,還是很開心的。~

這篇筆記就是對這本書的全部筆記了。有點簡陋,也沒有做任何格式的排版。就醬吧,主要是記錄一下這些命令。大部分還是熟悉或者瞭解的,較少部分是之前沒有使用過的。


命令記錄:

ls:-l -a -S -X -F -r -R

cd: change dirctory

pwd: print workspace dirctory

touch:-t -a

mkdir: -p -v

cp: -a -r -v -R -i

mv:-i -v

rm:-r/-R -f -v -i

rmdir: only remove empty dirctory

shred: 重寫檔案25次。[私密檔案刪除前執行,可以防止洩密]

shred password.txt && rm password.txt

su: swich user

su:-l ==> --login , su -

whoami

man:-k -u -f -t

info

whereis:-m -b

whereis命令的功能非常有用:它可以告訴你命令的可執行程式、 它的原始檔(如果存在的話)及其man page的路徑。

whatis 讀取命令的描述

-w -r

apropos 基於功能查詢命令

-w -r

which 找出將要執行的命令的版本

-a

連續執行多個命令:;

只有前面的命令執行成功,才執行下一個命令:&&

只有前面的命令執行失敗,才執行下一個命令:||

將一個命令的輸出插入到另一個命令:$()

date “+%Y-%m-%d”

mkdir $(date "+%Y-%m-%d-%H:%M:%S")

將一個命令的輸出用作另一個命令的輸入:|

將命令的輸出重定向到檔案:>

防止重定向時覆蓋檔案:set -o noclobber , replace > by >|

恢復到預設[可以覆蓋檔案的狀態]:set +o noclobber

將命令的輸出追加到檔案:>>

將檔案作為命令的輸入:<

在標準輸出裝置上檢視檔案:cat

將檔案拼接至標準輸出裝置:cat

拼接檔案,並給檔案加上行號:cat -n

tac

分屏檢視文字檔案:less,more,most,pg,head,tail

tail -f

列出所有可用的印表機:lpstat -p

找到預設的印表機:lpstat -d

檢視印表機是如何連線的:lpstat -s

將檔案列印到預設的印表機:lpr

修改檔案或目錄屬於的使用者組:chgrp -R , -c , -v

sudo chgrp sudo njManifest/default.xml

修改檔案和目錄的擁有者:chown -R , -c , -v

同時修改檔案和目錄的擁有者和使用者組:chown owner:group;

示例:chown pycat:root -R -c codes/ ==> 將 codes/目錄的所有者改成pycat,所在組改成root

使用chown僅僅用來修改組: chown :pycat libby.jpg

Linux認為有三組使用者會使用檔案或目錄,即實際擁有者(也稱
為檔案的使用者)、使用者組及系統中的其他人。每組使用者分別用不同的
字母表示.

使用者 字母表示
使用者(擁有者)(User) u
組(Group) g
其他(Other) o

用字母表示法修改檔案和目錄的許可權:chmod [ugo][+-=][rwx]

$ ls –l
-rw-r--r-- 1 scott family ... libby.jpg
$ chmod g+w libby.jpg
$ ls -l
-rw-rw-r-- 1 scott family ... libby.jpg

$ ls –l
-rw-r--r-- 1 scott family ... libby.jpg
$ chmod go+w libby.jpg
$ ls -l
-rw-rw-rw- 1 scott family ... libby.jpg

$ ls –l
-rw-r--r-- 1 scott family ... libby.jpg
$ chmod a=rw libby.jpg
$ ls -l
-rw-rw-rw- 1 scott family ... libby.jpg

$ ls –l
-rw-rw-rw- 1 scott family ... libby.jpg
$ chmod go-w libby.jpg
$ ls -l
-rw-r--r-- 1 scott family ... libby.jpg
$ chmod o-r libby.jpg
$ ls -l
-rw-r----- 1 scott family ... libby.jpg

$ ls –l
-rw-rw-rw- 1 scott family ... libby.jpg
$ chmod g=r libby.jpg
$ ls -l
-rw-r--rw- 1 scott family ... libby.jpg
$ chmod o= libby.jpg
$ ls -l
-rw-r----- 1 scott family ... libby.jpg

注意最後的chmod命令, o等於什麼也沒有,相當於刪除了系統中
所有其他使用者的所有許可權。

用數字許可權修改檔案和目錄的許可權:chmod [0-7][0-7][0-7]

數字許可權(也稱為八進位制許可權)是基於二進位制數字系統而建立的。我們將不解釋為什麼許可權要用特定的數字來表示,而重點介紹最終的結果:讀(read, r)的值為4,寫(write, w)的值為2,而執行(execute,x)的值是1。記住, Linux許可權識別三個使用者組,即擁有者、組以及其他人,每個使用者組都能進行讀、寫和執行操作。

Owner(擁有者) Group(組) World(其他人)
許可權 r; w; x r; w; x
數字表示 4; 2; 1 4; 2; 1
Chmod命令 ls -l表示 含 義
chmod 400 -r-------- 擁有者能夠讀,其他任何人不能進行任何操作
chmod 644 -rw-r--r-- 所有人都能夠讀,但只有擁有者才能編輯
chmod 660 -rw-rw---- 擁有者和組使用者能夠讀和寫,其他人不能進行任何操作
chmod 664 -rw-rw-r-- 所有人都能讀,但只有擁有者和組使用者能夠編輯
chmod 700 -rwx------ 擁有者能夠讀、寫和執行,其他使用者不能進行任何操作
chmod 744 -rwxr--r-- 所有人都能讀,但只有擁有者才能編輯和執行
chmod 755 -rwxr-xr-x 所有人都能讀和執行,但只有擁有者才能編輯
chmod 777 -rwxrwxrwx 所有人都能讀、寫和執行(這樣的設定通常不是個好想法)

遞迴地修改許可權:chmod -R

設定和清除 suid:chmod u[+-]s

設定和清除 sgid:chmod g[+-]s

數字表示法:對於suid,那個數字是4;對於sgid,這個數字是2。

$ ls -lF
drwxr-xr-x 11 scott admins ... bin/
$ chmod 2755 bin
$ ls -lF
drwxr-Sr-x 11 scott admins ... bin/

刪除sgid的方法和刪除suid的方法是一樣的,在開頭輸入0,就去掉了sgid許可權。

$ ls -lF
drwxr-Sr-x 11 scott admins ... bin/
$ chmod 0755 bin
$ ls -lF
drwxr-xr-x 11 scott admins ... bin/

設定和清除 sticky bit: chmod [+-]t

zip 歸檔和壓縮檔案:zip

zip dest.zip src.tif

zip 獲得最好的壓縮效果: -[0-9]

用密碼保護壓縮的 Zip 文件: -P或者 -e

解壓檔案:unzip ,-v

$ unzip moby.zip
Archive: moby.zip
inflating: job.txt
inflating: moby-dick.txt
inflating: paradise_lost.txt

列出將要解壓的檔案(並不解壓): -l

unzip -l abc.zip

測試將要解壓的檔案: -t

unzip -t moby.zip
gunzip -c paradise_lost.txt.gz > paradise_lost.txt

如果你不喜歡使用gunzip命令,也可以使用gzip –d(或
--decompress--uncompress)。

gzip , bzip2 用法完全一致

用 tar 歸檔檔案:-cf (--create,--file)

tar -cf moby.tar *.txt

targzip 歸檔和壓縮檔案: -zcvf(--gzip,--create,--verbose,--file)

tar -zcvf src.bak.tar.gz src/ # 將 src/ 壓縮到 src.bak.tar.gz 中

測試將要解開和解壓的 tarball-ztvf

tar -ztvf src.bak.tar.gz

要確保-f是最後一個選項,因為在它後面需要指定.tar.gz檔案路徑。

解開和解壓 tarball-zxvf(--gzip,--extract,--verbose,--file)

對於bzip2的 ,就是 -jxvf , -jtvf , -jtcf

搜尋檔名資料庫: locate

因為執行slocate對使用者來說是透明的(也就是說,使用者看不到
他執行的是slocate),而且locate使用的字母更少一些,輸入得更快,
所以本書(《Linux命令速查手冊》)也繼續使用locate,雖然實際執行的命令是slocate

搜尋檔名資料庫,不區分大小寫: locate -i

更新 locate 使用的資料庫:updatedb(需要root或者 sudo)

如果想知道updatedb的執行花費了多長時間,可以在
updatedb前面加上time命令,如下所示:

time updatedb

在文字檔案中搜尋匹配的模式: grep

locate命令可以搜尋檔案和目錄的名稱,但是不能搜尋檔案的內容。要搜尋檔案內容,應該使用grep命令。 grep的處理過程基本上就是,為它提供一個搜尋想要匹配的模式,指定要搜尋的一個或一組檔案(甚至是整個硬碟空間),然後grep就會輸出能夠與搜尋模式匹配的各行內容的列表。

$ grep pain three_no_more_forever.txt
all alone and in pain

這個例子是用grep來檢查一個檔案中是否包含pain這個詞(檔案的內容是Peter Von Zer Muehlen寫的一首名為“Three No More Forever”的詩)。當然,這個檔案中有pain這個詞,所以grep就在終端介面上列印出包含搜尋內容的那一行。但如果想一次在多首Peter所寫的詩中進行搜尋,又該怎麼辦呢?使用萬用字元可以解決這一問題。

$ grep pain *
fiery inferno in space.txt:watch the paint peel,
three_no_more_forever.txt:all alone and in pain
the speed of morning.txt:of a Chinese painting.
8 hour a day.txt:nice paint job too
ghost pain.txt:Subject: ghost pain

在文字檔案中搜尋特定模式的基礎知識

在剛開始使用grep時, 新使用者會對這個命令有好幾種版本感到很困惑。

grep的不同版本

支援的模式 grep命令選項 單獨的命令
基本的正規表示式 grep -G(或 –basic-regexp) grep
擴充套件的正規表示式 grep -E(或 –extended-regexp) egrep
固定字串的列表,匹配其中任何一項 grep -F(或 –fixed-strings) fgrep
Perl正規表示式 grep -P(或 –perl-regexp) 不可用

萬用字元不等於正規表示式。雖然萬用字元和正規表示式都使用星號(*) 字元,但它們的含義完全不同。萬用字元中使用特定的字元(如?*)表示替換(substitution),而正規表示式中同樣的字元表示要對前面的內容進行匹配的次數。例如,在萬用字元中,可以把c?t中的?替換成另一個字元,而且只能替換一次,所以這個萬用字元可以匹配catcotcut,但不能與ct匹配。在正規表示式中, c[a-z]?t中的?表示從字母AZ都可以匹配,但只可以匹配0次或1次,所以這個正規表示式可以匹配catcotcut,也可以匹配ct

正規表示式中的單引號和雙引號的用法也有很大區別。單 引號(‘和’)是在告訴shell正在搜尋一個字串,而雙引號(“和”) 則是讓shell知道想要使用shell變數。

 $ grep 'hey!' *
txt/pvzm/8 hours a day.txt:hey you! let’s run!

如果要搜尋精確的匹配結果,就使用單引號;如果要把shell變數 結合到搜尋內容中(很少有這樣的需要),就使用雙引號;但如果搜 索關鍵字只包含數字和字母,完全不使用任何引號也沒有問題。如果 想要安全些,放心地使用單引號吧,即使只有一個詞,也可以加上單 引號,這沒什麼損害

遞迴式地搜尋檔案中的文字: -R

星號(*)萬用字元可以一次搜尋同一目錄中的多個檔案,但要搜 索多個子目錄,就需要使用-R(或--recursive)選項。

搜尋檔案中的文字,忽略大小寫: -i(或--ignore-case)

在檔案中只搜尋整個詞: -w

在預設情況下,grep命令搜尋字串pain所有可能出現的位置, 顯示包含pain的整行內容,包括paintpainting。如果搜尋的檔案中包 含painlessSpain、或painstaking,包含這些詞的行也會顯示出來。但 如果只需要精確匹配pain的行,又該怎麼辦呢?這時就要使用-w(或--word-regexp)選項

顯示搜尋結果在檔案中的行號: -n

在其他命令的輸出中搜尋特定內容: ls -al | grep P53

檢視檔案中搜尋內容的上下文資訊: -A , -B , -C

grep可以輸出包含 搜尋內容的實際行,但也可以讓grep輸出匹配內容之前和之後的若干行。

-B--before-context=#

-A--after-context=#

-C--context=#

顯示沒有包含搜尋內容的行: -v

列出包含搜尋內容的檔名: -l--files-with-matches

grep命令能夠列出包含你要搜尋的內容的行,但有時可能並不需 要知道這些行的具體內容,而只要知道包含這些匹配行的檔名稱就可以了。

ls -1 | grep 196[6-7] | grep -v Live

根據檔名搜尋檔案:find -name

find . -name error.log
find $(pwd) -name error.log 

如果搜尋使用的是相對路徑,那麼搜尋結果使用的也是相對路 徑;如果搜尋使用的是絕對路徑,那麼結果使用的也會是絕對路徑。

根據擁有者搜尋檔案:find -user

find $(pwd) -user cat -name src

查詢擁有者不是scott的檔案,可能更容
易,只要在想取反的選項前面加一個歎號(!)就可以了。

find $(pwd) ! -user cat -name src

根據使用者組搜尋檔案: find -group

根據檔案大小搜尋檔案: file -size

有時,可能需要根據檔案的大小查詢檔案,find命令可以進行這 樣的搜尋。使用-size選項指定檔案大小,在其後的數字後面加一個字元,表示使用的單位。如果不提供單位字元,則使用預設值。不過,你應該明白這可能不能搜尋出你想找的內容。如果沒有在數字後面附 加字元,預設使用的大小單位就是512位元組塊(檔案的位元組數先除以512,再取整到最接近的一個整數)。真是太複雜的數學計算。更容易 的表示方法是在數字後面使用字尾,用較為通用的單位表示檔案大小。

字尾 含義
b 512位元組塊(預設值)
c 位元組(Byte)
k 千位元組(Kilobyte,KB)
M 兆位元組(Megabyte,MB)
G 吉位元組(Gigabyte,GB)

find . -size 10M

使用find命令時需要注意一點:如果只說 10M,那麼find命令就只搜尋檔案大小恰好是10 MB的檔案(當然是 取整後的10 MB)。如果要搜尋的檔案大小大於10 MB,需要在指定的 大小前面加一個加號(+);如果要搜尋的檔案大小小於10 MB,則需 要在大小前面加一個減號(-)。

find . -size +10k

根據檔案型別搜尋檔案: find -type

檔案型別字元 含 義
f 普通檔案
d 目錄
l 符號(軟)連結
b 塊檔案
c 字元檔案
p FIFO(First In First Out)檔案
s 套接字

當表示式均為 true 時顯示結果(AND):find -a

find . -name error.log -a -type f

wc(word count):統計文字字數
wc -l: 統計文字行數
wc -w: 統計單詞數
wc -c: 統計字元數

當表示式中只有一個為 true 時就顯示結果(OR):find -o

find . \( -size +10M -o -size 10M \) ! -name
"*25*"
: 查詢檔案大小大於等於10M,並且名字中不包含 “25” 的檔案.

當表示式為 not true 時顯示結果(NOT): find -n

使用歎號(!)來對錶達式進行取反.

find . ! -type f | grep -v ".git"

對搜尋到的每個檔案執行命令: find -exec

現在進入find命令真正展露其威力的領域:能夠對搜尋到的檔案再執行命令。在列出用於限制搜尋的選項(例如-name-type-user) 後,再附加一個-exec選項,後面跟上要為找到的每個檔案執行的命令。用{}符號來代表找到的每個檔案,並用\對分號(;)進行轉義以作為命令的結束,這樣shell就不會把它理解為命令棧的標誌。

find . -name " *MP3" -exec rename 's/MP3/mp3/g' {} \;

rename命令後面是關於檔名如何變化的指令,其格式為: s/old/new/g[s代表substitute(替換),g代表global(目標)]。

將搜尋結果列印到檔案:find -fprint

檢視命令列歷史: history

顯示所有命令的別名: alias

檢視特定命令的別名: alias [alias name]

alias gr

建立新的臨時別名: alias [alias]= '[command]'

alias lsd='ls -d */'

如果想讓別名能夠在不同的shell會話中使用,就需要把它們新增 到shell用來儲存別名的檔案中。大多數情況下,這個檔案不 是 .bashrc,就是.bash_aliases

在該檔案中新增一行:alias lsd='ls -d */'

需要重新載入.bash_aliases(或.bashrc,如果使用的是這個檔案),新增加的別名才會生效。有兩種辦法:第一 種辦法是退出shell,再登入進來,但這種辦法並不好用,不推薦使用; 第二種是通過執行命令來重新載入檔案,如下所示

. .bash_aliases

刪除別名: unalias (需要永久生效,就要去對應的檔案中刪除之前新增的別名。)

檢視當前正在執行的所有程式: ps aux

要檢視系統中使用者正在執行的所有程式,可以在ps命令後面使用 以下選項: a(表示所有使用者)、u(以面向使用者的格式顯示,或顯示 擁有每個程式的使用者)、x(沒有控制tty1或終端螢幕的程式,“顯示每 個程式”的另一種方法)

ps命令能提供很多資訊,包括程式的擁有者、唯一的程式ID編號(PID,用於標識程式)、程式正在使用的CPU百分比(%CPU)和記憶體
百分比(%MEM)、程式的當前狀態(STAT)及程式的名稱。

STAT列用不同的字母表示程式的狀態

STAT 字母 含義
R 執行(running)
S 休眠(sleeping)
T 停止(stopped)
Z 殭屍1(zombie)

Z是個壞訊息,因為它意味著程式基本上一直處於掛起狀態,不能 停止(幸運的是,這並不意味著沒有解決問題的辦法)。如果某個程 序有問題,ps標明其狀態為Z,這時或許只有重啟計算機才能完全關 閉這個程式。

檢視程式樹: ps axjf

Linux世界中,程式並不是憑空出現的。通常,啟動一個程式 的同時,也會啟動其他程式。例如,Linux系統中的所有程式最初都 來自init,它是所有程式的源頭,其PID總為1ps命令能夠提供該進 程樹的一種基於文字的表現方式,這樣就能視覺化地看看該程式又創 建了哪些其他程式。要檢視程式樹,除了使用上一節用過的aux 選項,還要加上個f(其名稱源於ASCII art forest)選項。

ps axjf / ps axufubuntu正常,在macOs不能識別

檢視特定使用者擁有的程式: ps U [username]

ps U pycat

終止正在執行的程式: kill

當使用kill命令時,可以用一個 數字或單詞來指定關閉程式的緊急程度。

訊號編號 訊號單詞 含義
-1(數字1) -HUP(hang up,掛起) 控制程式已經死了,關閉程式(如果用於系統 服務,會導致重新載入配置檔案並重啟)
-15 -TERM 正常中止程式,清除將要失控的程式和檔案
-9 -KILL 停止任何正在進行的處理,馬上關閉

通常,應該先試試-15(其實,如果kill命令沒有使用任何選項, 它就是預設值)。

-1(或-HUP)選項,主要用於Samba或無線連線之類的服務。

對於 STAT顯示的是Z的程式:即使-9選項對“殭屍”程式也 沒有效果,這樣的程式早已經死掉了,因此kill命令對它也 無能為力。重啟是唯一能夠解決這種問題的辦法

檢視正在執行的程式的動態更新列表: top

top命令輸出的前5行顯示了大量的系統資訊,之後則逐行列出每 個正在執行的程式。注意,top命令會自動根據%CPU列的數值對輸出 進行排序,所以當程式佔用的處理器資源變得更多或更少時,它們在 top命令列表中的位置也會發生相應變化。

如果想在top命令中關閉程式,只需按k鍵。這時在列表上方(在 以Swap:開始的那一行的後面),會看到以下內容:
PID to kill: 輸入想關閉程式的PID(假設為8026),按Enter鍵,命令會詢問要使用什麼訊號編號: Kill PID 8026 with signal [15]:
top命令預設使用的訊號是15。如果樂意用這個預設值,就按Enter 鍵;如果不樂意,就直接輸入想使用的訊號編號,然後按Enter鍵。一 兩秒鐘以後,要關閉的程式就會從top顯示中消失了。
q鍵;退出top命令。

列出開啟的檔案: lsof(list open files)

Linux系統中的所有東西都是檔案,包括目錄、 網路連線和裝置。這意味著,即使在你看來只開啟了一個檔案,而實際上系統在這個時候開啟了幾千個檔案。

列出某個使用者開啟的檔案:lsof -u

lsof -u pycat

列出正在使用特定檔案的使用者: lsof [file]

lsof /etc/passwd

列出特定程式的程式: lsof -c [program]

lsof -c sshd

lsof命令的選項數量多得讓人吃驚,這裡看到的只是它很小的 一個子集。lsof的原始碼包含一個名為00QUICKSTART的檔案 (前面兩個是0),它是一個教程,介紹了關於這個命令的一些更
為強大的特性。

顯示系統 RAM 的資訊: free

在預設情況下,free命令以千位元組為單位顯示結果,與使用-k選 項一樣。不過,可以改變這一設定。-b選項以位元組為單位顯示記憶體使 用大小,而-m選項(可能是最常用的選項)則以兆位元組為單位。

free -m
             total       used       free     shared    buffers     cached
Mem:         64320      48260      16060          0      15928        133
-/+ buffers/cache:      32197      32123
Swap:        16289       1037      15252

free命令的輸出可以看出,這臺計算機有64320 MB可用的物理 RAM。第一行顯示有48260 MB RAM正在使用中,只剩下16060 MB空閒的RAM。交換區(或虛擬記憶體)差不多有16289 MB,已經使用了1027M。 表面看起來就是這樣的。

不過,事情並沒有那麼簡單。重要的是中間標記為-/+ buffers/ cache的那一行。硬碟驅動器使用緩衝(buffer)和快取(cache)來加速訪問,如果一個程式需要記憶體,系統就能夠快速地為該程式分配記憶體。對於Linux計算機中正在執行的應用程式而言,現在可以使用的空閒記憶體有32123 MB,快取空間為32197 MB(如果需要的話,可以使 用)。除了交換空間,它們也是可以使用的空間。如果Linux的記憶體管 理做得沒有那麼高效的話,那麼它也就什麼也不是了。

顯示檔案系統的磁碟使用情況: df , -h--human-readable

free命令處理的是系統的RAM,而df命令(可以認為是disk free 的縮寫)處理的則是系統中硬碟空間的大小。執行df,就會列出系統 中可以使用的磁碟空間,每個空間已經使用了多少,及它們各自掛載 到檔案系統的什麼位置。

報告目錄使用的檔案空間: du

df命令可以提供整個硬碟的情況,但如果只想知道一個目錄和它 的內容使用了多少空間,又該怎麼辦呢?du命令(disk usage的縮寫) 能夠解決這個問題。

只報告目錄使用的總空間: du -s

為基於 RPMLinux 系統安裝軟體:

rpm -ihv [package]
rpm -Uhv [package]

rpm命令用於安裝以.rpm為字尾的軟體安裝程式,這看起來完全符合邏輯。要安裝RPM軟體包,需要先下載。用業界標準的開源網路端 口掃描器nmap來作為例子。從www.insecure.org/nmap/download.html 可以下載nmapRPM軟體包,下載到系統以後,只需執行rpm命令, 並提供3個選項:-i(安裝軟體包)、-h(安裝過程中顯示hash標記) 和-v(顯示命令的執行過程)。要執行rpm命令,還必須具有root許可權, 其基本格式如下所示:

rpm -ihv nmap-4.01-1.i386.rpm

不過,實際上這還不是你應該執行的命令。一個更好的選擇是 -Uhv,其中-U代表“update(升級)”。為什麼-U-i更好呢?因為選項-i只進行安裝,而選項-U則進行升級和安裝。如果軟體包在系統中 已經存在,現在正試圖在計算機上安裝一個更新的版本,-U選項將執行升級。如果系統中還沒有安裝過這個軟體包,-U選項會注意到這個 情況,並安裝軟體包。所以,只使用-U選項就可以,不管是進行升級 還是安裝。

如果你想一次安裝多個RPM,只要把它們依次列在命令後面,並 用空格分隔開:

rpm -Uhv nmap-4.01-1.i386.rpm nmap-frontend-4.01-1.i386.rpm

如果有許多RPM要安裝的話,也可以使用萬用字元。例如,如果在 名為software的子目錄中有20個.rpm檔案,只需要執行以下命令:

rpm -Uhv software/*.rpm

除了在安裝核心時,應該使用-i選項,在絕大多數情況下,-U選項都是更好的選擇。如果用-U選項對核心進行升級,新 的核心將不能工作。另一方面,如果用-i選項安裝了一個新 的核心,舊的核心作為備份也仍然在計算機上存在,以防新 核心發生崩潰

刪除基於 RPMLinux 系統中的軟體包:

rpm -e [package]

-e(代表erase)

為基於 RPMLinux 系統安裝軟體包及其依賴程式:

yum install [package]

刪除基於 RPMLinux 系統中的軟體包及其 依賴程式:

yum remove [package]

升級基於 RPMLinux 系統中的軟體包及其依賴程式:

yum update

為基於 RPMLinux 系統查詢可供下載的軟體包:

yum search [string]
yum list available    

yum list available | grep gimp

Debian 安裝軟體包: dpkg -i [package]

刪除 Debian 中的軟體包: dpkg -r [package]

當使用dpkg -i安裝軟體時,需要指定檔名,否則dpkg沒有辦法知道你想安裝什麼。而當使用dpkg -r刪除軟體時,需要指定的是 包名,因為安裝檔案早就不存在了,apt是通過包名來識別軟體的。

Debian 安裝軟體包及其依賴程式: apt-get install [package]

如果想一次安裝多個軟體包,只需將它們依次都列在命令列上。 例如,如果你想安裝sshfsshfs-utils,可以用以下命令:

apt-get install sshfs shfs-utils

只要找到了sshfsshfs-utils的任何依賴包,apt就會詢問是否
需要安裝它們。嗯,apt就這麼簡單。

刪除 Debian 中的軟體包及其依賴: apt-get remove [package]

apt-get remove sshfs

不過,解除安裝軟體包時並不會刪除這個包的所有東西,被刪除軟體 的配置檔案還會殘留在計算機中.如果你確實想要刪除所有東西,則 應該加上–purge選項,如下所示:

apt-get --purge remove sshfs

升級 Debian 中的軟體包及其依賴: apt-get upgrade

apt-get update
apt-get upgrade

先執行apt-get update命令,以便 讓你的計算機和apt倉庫保持同步。接著apt-get upgrade檢查本機已 經安裝過的軟體包與apt倉庫可用的軟體包是否有任何區別。如果存在區別,apt就會顯示它將要下載和安裝的軟體包列表。

apt-get update && apt-get upgrade

為基於 DebianLinux 系統查詢可供下載的軟體包: apt-cache search [packagename]

apt-cache search dvdcss

清除 Debian 中不再需要的安裝包: apt-get clean

在使用apt下載和安裝好軟體包以後,.deb檔案將仍然保留在 /var/cache/apt/archives/目錄中。時間一長,這些不必要的安裝檔案可能就會佔據大量的磁碟空間。刪除這些不需要的.deb檔案,可以 使用apt-get clean命令。

檢視網路介面狀態: ifconfig

要快速檢視系統的網路裝置,以及它們是否正在執行,可以使用 ifconfig(代表interface configuration,介面配置)命令和它的-a(代 表all)選項。

$ ifconfig -a
ath0 Link encap:Ethernet HWaddr 00:14:6C:06:6B:FD
inet addr:192.168.0.101 Bcast:192.168.0.255 Mask:255.255.255.0 inet6 addr: fe80::214:6cff:fe06:6bfd/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1257 errors:7557 dropped:0 overruns:0 frame:7557
 TX packets:549 errors:2 dropped:0 overruns:0 carrier:0
 collisions:0 txqueuelen:200
 RX bytes:195869 (191.2 KiB) TX bytes:95727 (93.4 KiB)
 Interrupt:11 Memory:f8da0000-f8db0000
eth0 Link encap:Ethernet  HWaddr 00:02:8A:36:48:8A
 BROADCAST MULTICAST  MTU:1500  Metric:1
 RX packets:0 errors:0 dropped:0 overruns:0 frame:0
 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
 collisions:0 txqueuelen:1000
 RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)
lo   Link encap:Local Loopback
 inet addr:127.0.0.1  Mask:255.0.0.0
 inet6 addr: ::1/128 Scope:Host
 UP LOOPBACK RUNNING MTU:16436 Metric:1
 RX packets:11092 errors:0 dropped:0 overruns:0 frame:0
 TX packets:11092 errors:0 dropped:0 overruns:0 carrier:0
 collisions:0 txqueuelen:0
 RX bytes:982629 (959.5 KiB)  TX bytes:982629 (959.5 KiB)

這裡列出了3個網路介面:ath0(一個無線網路卡)、eth0(一個乙太網卡)和lo[環回(loopback)介面,詳情稍後介紹]。對於每一個網路介面,顯示的資訊有可連線型別、MAC(Media Access Control) 或硬體地址、IP地址、廣播地址和子網掩碼,還有接收和傳送的資料 包的資訊,以及其他資訊。如果斷開某個連線,相應的許多資訊就會 消失。其實,用這種方法可以看到,ath0lo的網路連線是開啟的, 而eth0則斷開了:eth0沒有IP地址,也沒有其他重要資訊。當然,一種更簡單的判斷方法是:ath0lo介面資訊的第4行是以UP開始的, 而eth0則沒有這個資訊。

先來介紹第三個網路介面。lo是環回地址,用於訪問機器本身。這個環回地址總是由IP地址 127.0.0.1來代表。基本上,系統需要它才能正常工作。如果能夠看到這個介面, 你可能不會為它操什麼心。但如果看不到這個介面,你才會去了解這 個介面,因為你的系統有麻煩了。

eth0是一個乙太網卡,就是插入網線的那個網路卡。因為當前沒有 把網線插到這個網路卡上,所以該網路卡不是活動的,也沒有任何地址: IP、廣播地址以及子網掩碼。一臺計算機上可能同時具有有線和無線 網路介面,不過通常沒有這個必要。

最後是ath0,這是一個無線PCMCIA卡。如果某個無線網路卡是主要的網路介面,可能就會看到一個名字與eth0類似的無線網路卡介面。 如果該無線網路卡是次要的,可能看到的就類似於eth1。在插入無線網 卡後,K/Ubuntu系統會自動識別該網路卡,並配置系統,以啟用這個新網路卡,將其識別符號設定為ath0。因為無線網路介面其實就是帶有一些 額外的無線嚮導的乙太網介面,所以通過ifconfig得到的有關ath0的資訊看起來與eth0的類似(如果啟用這個網路卡)。

驗證計算機是否正在執行和能否接收請求:

ping 
ping -c 

ping命令能夠向指定的IP地址傳送一種特殊的資料包(ICMP ECHO_REQUEST訊息)。如果那個地址上的計算機正在監聽ICMP 訊息,它將用ICMP ECHO_REPLY資料包做出響應(確實,防火牆可 以阻止ICMP訊息,使ping無效,但大多數時候這並不是問題)。如 果ping響應成功,則意味著兩臺計算機之間的網路是連通的。

ping www.google.com

如果想給ping加一些限制,僅傳送一定數量的資料 包,則可以使用-c選項,後面跟上一個數字。

跟蹤資料包在兩臺主機之間經過的路由: traceroute

執行 DNS 查詢: host

DNS(Domain Name System,域名系統)的建立使得人們可以更容易地訪問因特網上的各種資源。畢竟,計算機可以完美地處理數字, 它所做的每一件事實際上都可以表示為數字,而人類則更擅長記憶和 處理文字資訊。一個網站的IP地址可能是72.14.203.99,但大多數人都很難記住這麼長串數字。而要訪問www.google.com,記憶這個名字就 容易得多了。DNS基本上就是一個巨大的資料庫,記錄了72.14.203.99www.google.com之間的對應關係,以及其他數百萬的IP地址和域名的資料。

host www.baidu.com
host www.google.com

也可以做相反的操作,找出與某個IP地址關聯的域名:

host 65.214.39.152

配置網路介面: ifconfig

要將eth0上的乙太網卡的IP地址修改為192.168.0.125,可以執行以下命令(幾乎所有與ifconfig相關的命令,都需要以root使用者來執行):

ifconfig eth0 192.168.0.125

為了執行某種型別的網路資料包嗅探工具(如強大的Ethereal), 需要首先將網路卡設定為混雜(promiscuous)模式。在預設情況下, eth0只監聽傳送給它的特定資料包,但為了嗅探網路上傳遞的所有資料包,就需要讓網路卡監聽所有資料包,這就是混雜模式,如 下所示:

ifconfig eth0 promisc # 開啟混雜模式

ifconfig eth0 -promisc # 關閉混雜模式(預設關閉)

檢視無線網路介面的狀態: iwconfig

ifconfig命令可以顯示網路介面的狀態,包括無線網路卡。然而, 它不能顯示關於無線網路介面的全部資料,因為ifconfig根本不知道 這些資訊。要儘可能多地得到與無線網路卡相關的資料,應該用 iwconfig代替ifconfig

配置無線網路介面: iwconfig

相當長的一段時間以來,有線網路的拓撲結構(例如,星型、總 線型、環型,僅舉幾個例子)已經為人們所熟知和理解。而無線網路 則引人了一些新的拓撲結構,包括以下幾種常見的拓撲結構:

  • Managed(一個接入點建立一個網路,其他無線裝置可以連線 到這個網路,這是一種最常見的無線網路拓撲結構)。
    • Ad-Hoc(兩個或更多的無線裝置組成一個網路,彼此協同工 作)。
    • Master(無線裝置相當於一個接入點)。
    • Repeater(無線裝置將資料包轉發到其他無線裝置)。

無線網路的拓撲結構還有其他型別,但以上列出的是主要的幾種。可以使用iwconfig設定無線網路卡,讓它根據新的拓撲結構,以不同的模式來執行。

iwconfig ath0 mode ad-hoc

指定介面以後,再簡單地使用mode選項,後面跟著想要使用的
拓撲模式的名稱。

記住,這個例子中使用的網路卡的介面名稱是ath0;但你的網 卡介面名稱可能是etH1wlan0或其他完全不同的東西。要 查詢網路介面的名稱,可以只使用iwconfig命令,如前一節所述

ESSID(Extended Service Set Identifier,擴充套件服務區識別符號)是 你已經加入的或想加入的無線網路的名稱。在大多數時候,假設無線 網路的其他需求都能滿足(例如加密,如果有必要的話),那麼任意 的ESSID名稱都可以很好地工作。不過,有些網路可能需要你指定確 切的ESSID

iwconfig ath0 essid lincoln

這樣就意味著你正在加入一個ESSID為lincoln的無線網路。只使 用essid選項,後面跟著ESSID的名稱,就可以了。

越來越多的網路正在使用加密來保護使用者之間的通訊,以免被 嗅探器捕獲所有的網路流量後,從中檢視是否存在有用的資訊。無線網路中最簡單的網路加密形式是WEP(Wired Equivalent Privacy,有線等效加密)。雖然這種加密機制被認為非常缺乏安全性,但它的特點是簡單。WEP很容易被知識淵博的攻擊者破解,現在已經被更加健壯的WPA(Wi-Fi Protected Access)協議取代。遺憾的是,在Linux中的無線網路卡上使用WPA可能非常複雜。此外,雖然WEP有缺陷,但仍然很通用,有 點安全保護總比沒有的好,只是不要奢望用它能提供十全十美的安全保護。

使用DHCP獲得新的網路地址dhclient

大部分家庭網路和許多商業網路都使用DHCP(Dynamic Host Control Protocol,動態主機控制協議)為新加入的機器分配IP地址 和其他關鍵資訊。如果沒有DHCP,在有新加入的機器時,就必須 為其手工設定所有的網路資訊;有了DHCP,只要把新機器連入網 絡,再請求DHCP伺服器給它提供一個IP地址和其他必需的配置資訊,接著就可以自動把DHCP伺服器的響應整合到新裝置的網路配置中。

以下討論假設已經用DHCP(而不是手工設定)配置好了網路 裝置。各種版本的Linux系統會在不同的配置檔案中查詢 DHCP資訊。基於DebianLinux系統會在/etc/network/interfaces中查詢iface [interface] inet dhcp。而基於Red HatLinux 系 統 則 在 /etc/sysconfig/network-scripts/ ifcfg-[interface]中查詢BOOTPROTO=dhcp。在這些例子中, 應該將[interface]替換為實際的網路介面名稱。要得到更多 的資訊,可以在Google上搜尋“dhcp your-distro”(your- distro是你正在使用的Linux版本名稱)。

有時,你的計算機不能在啟動時連線到DHCP伺服器,這樣就 需要手工發起DHCP請求。或者你的網路有問題,因而需要一個新 的IP地址。無論什麼原因,dhcilent命令都會嘗試查詢任何可用的 DHCP伺服器,向它們請求必要的資料(必須以root使用者來執行 dhclient)。

# dhclient eth0
Listening on LPF/eth0/00:0b:cd:3b:20:e2
Sending on   LPF/eth0/00:0b:cd:3b:20:e2
Sending on   Socket/fallback
DHCPDISCOVER on eth0 to 255.255.255.255 port 67 interval 8
DHCPOFFER from 192.168.0.1
DHCPREQUEST on eth0 to 255.255.255.255 port 67 DHCPACK from 192.168.0.1
bound to 192.168.0.104 -- renewal in 37250 seconds. # ifconfig eth0
eth0 Link encap:Ethernet HWaddr 00:0B:CD:3B:20:E2
inet addr:192.168.0.104 Bcast:192.168.0.255 Mask:255.255.255.0
inet6 addr: fe80::20b:cdff:fe3b:20e2/64 Scope:Link

要釋放(或放棄)DHCP伺服器分配的IP地址,可以使用-r(代 表release)選項:

# dhclient -r eth0
sit0: unknown hardware address type 776
sit0: unknown hardware address type 776
Listening on LPF/eth0/00:0b:cd:3b:20:e2
Sending on   LPF/eth0/00:0b:cd:3b:20:e2
Sending on   Socket/fallback

啟動網路連線: ifup

其實你一直都在使用ifup命令,只是沒有意識到它而已。啟動計 算機,結果發現已經成功連線到因特網,這時就應該感謝ifup。如果把乙太網線插入Linux計算機背後的網路卡介面,幾秒鐘後你就又可以接收電子郵件,這正是因為ifup在幕後做了大量工作。本質上,當ifup 檢測到網路事件(例如,機器重啟、或插入網線)時,它就會開始執行,接著再執行網路配置檔案中的指令。

不過,當偶爾遇到網路問題時,就得手工執行ifup命令了。這相 當容易:以root使用者登入,在ifcup命令後面輸入你想啟動的網路介面 的名字,如下所示:

# ifconfig
lo Link encap:Local Loopback
   inet addr:127.0.0.1  Mask:255.0.0.0
...
# ifup eth0
# ifconfig
eth0 Link encap:Ethernet HWaddr 00:0B:CD:3B:20:E2
inet addr:192.168.0.14 Bcast:192.168.0.255 Mask:255.255.255.0
 inet6 addr: fe80::20b:cdff:fe3b:20e2/64 Scope:Link
 UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
...
lo   Link encap:Local Loopback
inet addr:127.0.0.1  Mask:255.0.0.0

注意,如果ifup執行成功,它不會報告任何資訊。其實,和大多數Unix應用程式一樣,如果執行成功,ifup就保持沉默;只有遇到失敗或錯誤時,它才會報告相關的資訊。為了檢查ifup是否成功完成,可以使用ifconfig命令,如前面例子演示的那樣。

關閉網路連線: ifdown

# ifup eth0
ifup: interface eth0 already configured 
# ifdown eth0
# ifup eth0

顯示 IP 路由表: route

當使用SSH(Secure Shell)連線區域網內的其他計算機時(將在 第15章中介紹),計算機是怎麼知道如何把資料包限制在LAN內,而 不是把它們傳送到路由器,再傳送到因特網上呢?當通過瀏覽器訪問 www.ubuntu.com時,Linux系統是如何知道把請求傳送到路由,而不是相鄰的另一臺計算機呢?

答案是:Linux核心通過路由表來保持跟蹤這些資訊。要檢視當前的路由表,只需要在shell中輸入route。(檢視路由表不需要root權 限,而對其進行修改則需要root許可權,這是下一節將要介紹的內容。) 如下所示:

route

IP地址由4個八位元組(octet)構成,其格式可以表示為xxx.xxx. xxx.xxx,如192.168.0.124。當從你的機器傳送一個資料包時,就會把這個資料包的目標IP地址和路由表中的Destination (目標)列進行比較。Genmask(子網掩碼)列用於標識應該檢查IP地址4個八位元組中 的哪一部分,並和Destination 列一同決定資料包的目標網路地址。

例如,假設在shell中輸入ping 192.168.0.124。子網掩碼 (Genmask)255.255.255.0表明只有最後一個八位元組(由0表示的那 個八位組)是重要的。換句話說,當遇到192.168.0.124這樣的IP地址 時,只有.124這部分對於將資料包路由到正確的主機地址才是重要 的。向IP地址從192.168.0.1到192.168.0.255(這個網段IP地址的最大 範圍)傳送的任何資料包都可以匹配Genmask 和 Destination,於是它 們會呆在區域網中,不會轉發給路由器。這也就是為什麼在 192.168.0.0旁邊的Gateway列有一個星號(*)的原因:不需要通過閘道器(Gateway),因為是區域網本地流量。

另一方面,其他資料包都預設傳送到路由器(在這個例子中是 Gateway列的192.168.0.1)。該行的掩碼(Genmask列)是0.0.0.0,這 表明任何不匹配從192.168.0.1 到192.168.0.255的目標IP地址都將通過 192.168.0.1進行傳送(因為192.168.0.1是閘道器地址,這是一種特殊情 況)。72.14.203.99、82.211.81.166以及216.23.180.5都匹配0.0.0.0,所以它們必須通過閘道器訪問外網。route命令提供的路由表的另一個有趣的地方是它的Flags(標誌) 列,該列提供關於路由本身的一些資訊。標誌有幾種,但最常見的是 U(表明路由已啟動並可用)和G(表明路由使用閘道器)。從前面的表中 可以看到,兩個路由都已經啟動,但只有第二個是閘道器。

修改 IP 路由表: route

route命令不僅能夠用於顯示路由表,還可以對它進行修改。不 過,修改時要小心,否則可能破壞網路,使你的計算機上不了網。
假設你的計算機一直與閘道器連線不暢,任何資料包都不能有效地 離開區域網訪問因特網(我的系統曾經真的發生過這種情況)。執行 route命令,確認閘道器真的是找不著了,然後使用route命令把閘道器添 加到路由表中(雖然普通使用者可以檢視路由表,但對它進行修改則需 要具有root許可權)。

# route add -net default gw 192.168.0.1 dev eth0

現在分析一下這個命令。add表示正在新增一個新的路由(要刪 除路由,則用del)。-net選項告訴核心,正在新增的目標是一個網路, 在這個例子中是default目標。gw表示想使用位於192.168.0.1的閘道器對匹配目標(這裡是default,因此使用子網掩碼0.0.0.0)的資料包進行 路由。最後,dev eth0指定要使用的裝置,在這個例子中使用的是eth0上的乙太網卡。

假設除了乙太網卡eth0,你還有塊無線網路卡ath0,想通過該無線 網路卡訪問區域網10.1.xxx.xxxx(該LAN的網路基地址)中的資源,但 根本不想讓這個無線網路卡訪問因特網。可以使用以下命令增加一條匹 配這些條件的路由規則:

route add -net 10.1.0.0 netmask 255.255.0.0 dev ath0

以上命令先用dev ath0指定無線網路卡,再將子網掩碼設定為 255.255.0.0,以便可以正確地進行路由。

如果以後又想刪除這個路由,則使用以下命令:

route del -net 10.1.0.0 netmask 255.255.0.0 dev eth0

解決網路問題

在網路方面,Linux系統通常可以正常工作,但偶爾也會出現問 題。以下給出了一些解決網路問題的基本技巧。
如果網路介面看起來已經啟動和執行,但是不能訪問因特網,這 時可以先試著ping一下localhost裝置(127.0.0.1)。如果ping不通, 就停下來,不要再試了,因為你的系統已經嚴重損壞了。如果能ping 通,就繼續ping一下計算機的外部IP地址。如果ping不通這個外部IP, 就檢查一下計算機是否已經啟動了網路。如果能ping通這個外部IP, 就再ping一下網路中的其他計算機(假設有其他計算機)。如果沒有 成功,就是網路介面出了問題(假設路由器是正常的)檢查一下網線 是否插好了。使用ifconfig(如果是無線網路卡,則使用iwconfig)檢 查一下網路介面的狀態,如果必要的話,可以用ifup命令開啟網路接 口。之後再試著ping一次。

如果能ping通本地的其他計算機,接下來就ping一下路由器。如 果能ping通網路上的其他計算機,但是不能ping通路由器,這時就應 該用route命令檢查路由表(參見14.11節)。如果路由表有找不到的項 目,則補充完整丟失的內容(詳情可以參考“改變路由表”)。

如果有一個可以參考的基準,那麼診斷和修復問題將會容易 得多。找臺網路正常的計算機,執行route命令,儲存結果, 這樣,如果以後路由表出了問題,需要恢復什麼時,也可以 有個參考。

如果能夠ping通路由器,試著ping一個你知道在因特網上啟動並 正在執行的主機(如www.google.com 或www.apple.com )。如果ping 不通路由器,則嘗試再ping一下同一計算機的IP地址。為了在這樣的 場合下使用,最好事先把一些常用IP地址記在便條上或是計算機的文字檔案中以備後用。

如果能ping通IP地址,但ping不通它的域名,那就是有DNS問題了。如果正在使用DHCP,可以執行dhclient命令(參見14.8節)更 新DHCP伺服器提供的DNS資訊。如果你沒有使用DHCP,那麼為了 找到需要的DNS資訊,可以查詢路由器,也可以向管理員或ISP服務 商諮詢,然後以root使用者的身份,手工在/etc/resolv.conf中新增新 的DNS資訊,如下所示:

nameserver 24.217.0.5
nameserver 24.217.0.55

每行以nameserver作為開始(必須的),後面是想用作DNS的IP 地址。如果路由器支援DNS,而且也知道它的IP地址(假設是 192.168.0.1),那麼第一行可以試著寫成:

nameserver 192.168.0.1

試著執行ifdown,再執行ifup,看看網路是否正常。如果仍然有 問題,重新開始,這時通常要從硬體著手。所有硬體安裝正確嗎?所 有硬體插好了嗎?在確保這些都正常以後,開始檢查軟體。最壞的情 況是硬體沒有Linux版本的驅動程式。雖然這種情況不多見,而且以 後會越來越少見,但仍然可能碰巧遇到。

但是,無線網路卡可能與Linux非常不相容,因為保守的硬體製造 商並不想幫助Linux開發人員讓他們的硬體在Linux系統中工作。為了 避免遇到這些令人頭疼的問題,在購買無線網路卡之前,最好先檢視它 的網站,確保這種網路卡在Linux系統中能很好地工作。這方面的一些 優秀網站包括:Madwifi的硬體支援網站(http://madwifi.org/wiki/ Compatibility);Linux無線區域網支援網站(http://linux-wless.passys. nl/),這個網站雖然有些過時,但還是依然有用;還有一個網站
(http://del.icio.us/rsgranne/wireless),經常在這裡更新有關Linux和無線 網路連線的書籤。對於特定的硬體,推薦使用Netgear WG511T無線 PCMCIA卡。在執行最新版本的K/Ubuntu的計算機上,只需把這種網 卡插入到計算機中,它就馬上能工作了。

噢,解決問題的最後一搏:如果能成功ping通IP地址和域名,那
就看到這兒吧。能上網了!

安全登入到另一臺計算機: ssh

如果需要將計算機連線到 其他計算機,無論另一臺計算機是在地球的另一邊,還是就在隔壁房 間,都可以使用ssh。

ssh tom@192.168.0.25

不用密碼安全登入到另一臺計算機: ssh

假設現在想從pound(使用者名稱為ezra)登入到eliot(使用者名稱為 tom),而且不需要輸入任何密碼。首先,用以下命令在pound上建立 一個ssh身份驗證金鑰(authentication key):

ssh-keygen -t dsa

按Enter鍵,接受金鑰要儲存到的預設位置,密語(passphrase)為空,此時將提示按兩次Enter鍵。這樣就在~/.ssh/id_dsa檔案中建立了一個私鑰,在~/.ssh/id_dsa.pub檔案中建立了一個公鑰。

現在需要將公鑰(不是私鑰)從pound傳送到eliot上。ssh開發 人員走得比我們要遠,他們已經建立了一個程式,讓這一操作變得易 如反掌。為了將公鑰自動從pound複製到eliot,只需要在pound上輸 入以下命令:

ssh-copy-id -i ~/.ssh/id_dsa.pub tom@192.168.0.25

現在試著用ssh 'tom@192.168.0.25'登入eliot,再檢查一下.ssh/ authorized_keys,確保這次它沒有在這個檔案中額外新增你不想要的金鑰。

在計算機之間安全地傳輸檔案: sftp

如果能夠通過ssh訪問某臺計算機,那麼也一定能夠通過SFTP訪問到它。要使用sftp命令,從pound(IP地址為192.168.0.15,使用者名稱為ezra)連線到eliot(IP地址為192.168.0.25,使用者名稱為tom),只需使用以下命令:

sftp tom@192.168.0.25
$ sftp tom@192.168.0.25
Connecting to 192.168.0.25...
sftp>

通過sftp登入以後,執行的命令就相當標準了。表15-1列出了一 些常見的命令,完整的命令介紹,可以檢視man sftp

有用的SFTP命令

| 命令|含義|
|:–|:–|
cd| 切換目錄
exit|關閉與遠端SSH伺服器的連線
get|將指定的檔案複製到本機
help| 獲取與命令相關的幫助
lcd|將目錄切換到本機
lls|列出本機上的檔案
ls| 列出遠端SSH伺服器上當前工作目錄中的檔案
put| 將指定的檔案複製到遠端SSH伺服器
rm| 將指定的檔案從遠端SSH伺服器刪除

在主機之間安全複製檔案: scp

如果你時間緊,但想安全地把一個檔案從一臺計算機複製到另一 臺,scp(表示“secure copy”)就是需要使用的命令。以下是scp命令 的基本使用模式:

scp user@host1:file1 user@host2:file2

假設你想使用scp命令把backup.shpound(IP地址為192.168. 0.15,使用者名稱為ezra)複製到eliot(IP地址為192.168.0.25,使用者名稱為 tom)的/home/tom/bin目錄,如下所示:

scp ~/bin/backup.sh tom@192.168.0.25/home/tom/bin

假設你想換個複製的方向。你仍然在pound上,想把Libby 的幾個圖片從eliot複製到pound上,而且還要複製到與當前工作目錄 不同的另一個目錄,如下所示:

scp tom@192.168.0.25:/home/tom/pictures/dog/libby* ~/pix/libby

當需要在計算機之間安全地複製檔案時,scp命令真的很有用。 不過,如果要複製的檔案很多,你很快就會發現使scp還是麻煩。在這種情況下,你可能還是想用SFTP,或者掛載一個Samba共享。

安全傳輸和備份檔案: resync -v

rsync是最酷、最有用的命令之一,很多人每天都要依賴它(就像 我一樣)。它是幹什麼的呢?它的用途多得數不清(這裡再說一遍“關 於這個命令可以寫本書!”),但本書主要介紹一個非常強大、必需的功能:有效而安全地備份檔案,同時付出最少的網路流量

假設需要在每天半夜從名為coleridge的計算機上(使用者名稱為 sam)將2 GB的檔案備份至一臺名為wordsworth的計算機上(使用者名稱 為will)。如果沒有rsync,每天夜裡你就會看到這2 GB檔案的傳輸, 即使是在連線速度很快的網路中,這也是不小的資料傳輸量。不過, 有了rsync,這一傳輸一小會兒就可以完成。為什麼呢?因為在rsync 備份這2 GB的檔案時,它只傳輸所有2 GB資料的檔案中發生過變化的那些檔案。如果在過去的24小時內只有幾百KB位元組的資料發生了 變化,那麼這就是rsync命令所有要傳輸的內容。如果發生變化的數 據有100 MBrsync命令也只複製這100 MB的資料。不管在什麼情況 下,複製的資料量會大大少於2 GB

這個命令是這樣來用的,從coleridge計算機上執行,將 documents目錄的所有內容傳輸到wordsworth計算機的一個備份驅動 器上。先看看這個命令和它的執行結果,接著仔細研究一些選項的含 意[為了可讀性,第一個命令使用了長選項格式,而不是單個字元; 第二個命令的選項則使用了單個字元(如果有可用的短選項),以便 比較],如下所示:

# 長選項
rsync --verbose --progress --stats –recursive --times --perms --links --compress --rsh=ssh --delete /home/sam/documents/ will@wordsworth:/media/backup/documents

# 等效的短選項
rsync -v --progress --stats -r -t -p -l -z -e ssh --delete /home/sam/documents/ will@wordsworth:/media/backup/documents

# (等效的更短命令)選項合併
rsync -vrtplze ssh --progress --stats –delete /home/sam/documents/ will@wordsworth:/media/backup/documents

輸出類似如下:

building file list ...
107805 files to consider
deleting clientele/Linux_Magazine/do_it_yourself/13/ gantt_chart.txt~
deleting Security/diebold_voting/black_box_voting/bbv_chapter-9.pdf
deleting E-commerce/Books/20050811 eBay LIL ABNER DAILIES 6 1940.txt
Security/electronic_voting/diebold/black_box_voting/bbv_chapter-9.pdf

legal_issues/free_speech/Timeline A history of free speech.txt E-commerce/2005/Books/20050811 eBay LIL ABNER DAILIES 6 1940.txt
connectivity/connectivity_info.txt
[Results greatly truncated for length]
Number of files: 107805
Number of files transferred: 120
Total file size: 6702042249 bytes
Total transferred file size: 15337159 bytes

File list size: 2344115
Total bytes sent: 2345101
Total bytes received: 986
sent 2345101 bytes  received 986 bytes  7507.48 bytes/sec
total size is 6702042249  speedup is 2856.69

現在看看向計算機發出的命令.命令的首部和尾部比較容易理解:命令以rsync作為開始,後面跟著選項,接著是複製檔案的源目錄(coleridge計算機上的/home/sam/documents/),隨後是複製檔案的目標目錄(wordsworth計算機上的/media/backup/documents)。在介紹各個選項之前,先重點看看源目錄和目標目錄的指定方式,這裡需要理解清楚,否則會造成實際的損害

想複製的是coleridge上documents目錄中的內容,但不包括目錄本身,所以源目錄應該使用documents/,而不是documents。在/home/sam/documents/中,documents後面的斜線(“/”字元)是在告訴rsync 命令:想把那個目錄的“內容”複製到wordsworth上的documents 目錄中;如果只用documents,rsync命令複製的就是目錄及其內容, 結果是將源目錄複製到了wordsworth計算機上的/media/backup/ documents/documents這個目錄中

斜線只在源目錄中重要,在目標目錄中是否使用斜線則無關緊要。

有個選項在前面的例子中沒有使用,但是當想先估計一下rsync 命令將如何構建備份過程時,使用這個選項是個好主意:-n(或 --dry-run)。如果命令中包含了這個選項,在rsync執行時,它並不會真正地刪除或複製任何東西。如果你的選擇可能會導致刪除重要的檔案,這個選項就是救命的稻草了。在提交rsync命令以前,尤其 是當包括了--delete選項時,最好是自己幫自己的忙,執行一個演練操作

現在輪到介紹前面例子中的選項了。

  • -v(或--verbose)選項, 連同--progress,它們命令rsync隨時報告它正在進行的操作的細節。
  • rsync結果的末尾顯示的那些後設資料(傳輸檔案的數量和大小 及其他有趣的資料),它們之所以出現,是因為在命令中包含了 --stats選項。
  • -r(或--recursive)選項在其他命令中已經出現多次了,此處它的作用和在其他地方是一樣的。加上這個選項後,命令就不會只處理 當前目錄,它會遍歷所有的子目錄,處理路徑上找到的所有東西。因為想複製整個documents目錄及它的所有內容,所以需要使用-r選項。
  • -t(或--times)選項讓rsync在傳輸檔案時保留檔案的修改時間。如果沒有包含這個選項,rsync就不能判斷它以前傳輸過什麼,下一次執行命令時,所有檔案會再複製一次。這大概不是你想要的行為, 因為它完全背離了rsync的初衷,所以一定要記得包含-t選項。
  • 第7章中討論的許可權,這裡又再次出現。-p(或--perms)是告訴 rsync要更新目標檔案的許可權設定,讓它們與原始檔匹配。這可以讓 備份檔案與原始檔儘可能保持一致。
  • -l(或--links)選項就會在目標目錄中重建軟連結。不必複製實際的檔案(這明顯不是建立軟連結的人的原本意圖),只需要複製指向實際檔案的連結,這樣再一次又 保持了源目錄的原始狀態。
  • 即使具有快速的網路連線,使用-z(或--compress)選項也是個 好想法,因為這時rsync將使用gzip來壓縮傳輸的檔案。在網速慢的 連線中,必須使用這個選項;在快速的連線中,使用這個選項同樣也 能節省更多的時間。
  • 為了安全,應該使用-e=ssh/(貌似也可以-e=rsh)(或--rsh=ssh)選項,告訴rsync用ssh 對它傳輸的資料進行加密。
  • 最後一個要介紹的選項是--delete。如果你正在建立檔案的映象,顯然一定想讓映象與原始檔儘可能保持精確。這意味著在原始檔中已經被刪除的檔案,也同樣要在目標檔案中刪除。但這也意味著,你可能意外地刪除些原本想保留的東西。如果準備使用--delete選項(估計你會用的),記得一定先用-n(或--dry-run)選項演練一下(在rsync選項介紹的一開始討論的那個選項)。

特別注意:-e貌似不能單獨使用,需要寫成-e=ssh。後面必須指定加密方式!

rsync更多引數介紹[供參考,有些解釋不一定對!]

-v, --verbose 詳細模式輸出
-q, --quiet 精簡輸出模式
-c, --checksum 開啟校驗開關,強制對檔案傳輸進行校驗
-a, --archive 歸檔模式,表示以遞迴方式傳輸檔案,並保持所有檔案屬性,等於-rlptgoD
-r, --recursive 對子目錄以遞迴模式處理
-R, --relative 使用相對路徑資訊
-b, --backup 建立備份,也就是對於目的已經存在有同樣的檔名時,將老的檔案重新命名為~filename。可以使用--suffix選項來指定不同的備份檔案字首。
--backup-dir 將備份檔案(如~filename)存放在在目錄下。
-suffix=SUFFIX 定義備份檔案字首
-u, --update 僅僅進行更新,也就是跳過所有已經存在於DST,並且檔案時間晚於要備份的檔案。(不覆蓋更新的檔案)
-l, --links 保留軟鏈結
-L, --copy-links 想對待常規檔案一樣處理軟鏈結
--copy-unsafe-links 僅僅拷貝指向SRC路徑目錄樹以外的鏈結
--safe-links 忽略指向SRC路徑目錄樹以外的鏈結
-H, --hard-links 保留硬鏈結
-p, --perms 保持檔案許可權
-o, --owner 保持檔案屬主資訊
-g, --group 保持檔案屬組資訊
-D, --devices 保持裝置檔案資訊
-t, --times 保持檔案時間資訊
-S, --sparse 對稀疏檔案進行特殊處理以節省DST的空間
-n, --dry-run現實哪些檔案將被傳輸 # 我備註,這個意思就不太對了
-W, --whole-file 拷貝檔案,不進行增量檢測
-x, --one-file-system 不要跨越檔案系統邊界
-B, --block-size=SIZE 檢驗演算法使用的塊尺寸,預設是700位元組
-e, --rsh=COMMAND 指定使用rsh、ssh方式進行資料同步
--rsync-path=PATH 指定遠端伺服器上的rsync命令所在路徑資訊
-C, --cvs-exclude 使用和CVS一樣的方法自動忽略檔案,用來排除那些不希望傳輸的檔案
--existing 僅僅更新那些已經存在於DST的檔案,而不備份那些新建立的檔案
--delete 刪除那些DST中SRC沒有的檔案
--delete-excluded 同樣刪除接收端那些被該選項指定排除的檔案
--delete-after 傳輸結束以後再刪除
--ignore-errors 及時出現IO錯誤也進行刪除
--max-delete=NUM 最多刪除NUM個檔案
--partial 保留那些因故沒有完全傳輸的檔案,以是加快隨後的再次傳輸
--force 強制刪除目錄,即使不為空
--numeric-ids 不將數字的使用者和組ID匹配為使用者名稱和組名
--timeout=TIME IP超時時間,單位為秒
-I, --ignore-times 不跳過那些有同樣的時間和長度的檔案
--size-only 當決定是否要備份檔案時,僅僅察看檔案大小而不考慮檔案時間
--modify-window=NUM 決定檔案是否時間相同時使用的時間戳視窗,預設為0
-T --temp-dir=DIR 在DIR中建立臨時檔案
--compare-dest=DIR 同樣比較DIR中的檔案來決定是否需要備份
-P 等同於 --partial
--progress 顯示備份過程
-z, --compress 對備份的檔案在傳輸時進行壓縮處理
--exclude=PATTERN 指定排除不需要傳輸的檔案模式
--include=PATTERN 指定不排除而需要傳輸的檔案模式
--exclude-from=FILE 排除FILE中指定模式的檔案
--include-from=FILE 不排除FILE指定模式匹配的檔案
--version 列印版本資訊
--address 繫結到特定的地址
--config=FILE 指定其他的配置檔案,不使用預設的rsyncd.conf檔案
--port=PORT 指定其他的rsync服務埠
--blocking-io 對遠端shell使用阻塞IO
-stats 給出某些檔案的傳輸狀態
--progress 在傳輸時現實傳輸過程
--log-format=formAT 指定日誌檔案格式
--password-file=FILE 從FILE中得到密碼
--bwlimit=KBPS 限制I/O頻寬,KBytes per second
-h, --help 顯示幫助資訊
# 將 /home/bf28/mtk_7.1_6739_bsp/ 中的內容傳輸到 /home/pycat/codes/gm6739bsp 中
rsync -n -z -v --stats --progress -r -t -p -l --delete /home/bf28/mtk_7.1_6739_bsp/ pycat@192.168.59.6:/home/pycat/codes/gm6739bsp

# 加密壓縮傳輸:-e=ssh
rsync -n -z -v --stats --progress -r -t -p -l -e=ssh --delete /home/bf28/mtk_7.1_6739_bsp/ pycat@192.168.59.6:/home/chengguibao/codes/gm6739bsp

如果想真正保證資料的安全,應該在週期性的cron作業中設定rsync命令自動執行。例如,建立一個名為backup.sh的檔案 (~/bin是儲存這個檔案的好地方),在其中輸入前面已經用過
的命令,如下所示:

rsync -n -z -v --stats --progress -r -t -p -l -e=ssh --delete /home/bf28/mtk_7.1_6739_bsp/ pycat@192.168.59.6:/home/chengguibao/codes/gm6739bsp

用chmod讓這個檔案成為可執行的:

$ chmod 744 /home/scott/bin/backup.sh

接著將以下幾行命令新增到一個名為cronfile的檔案中(也可以將這個檔案放在~/bin目錄中):

# backup documents every morning at 3:05 am (這是一句註釋。)
05 03 * * * /home/scott/bin/backup.sh

第一行是段註釋,解釋了這一定時任務的目的,第二行告訴cron在 每天夜裡的3:05 a.m自動執行/home/scott/bin/backup.sh

現在把這個定時任務加到cron,如下所示:

$ crontab /home/scott/bin/cronfile

現在再也不必為備份檔案擔心了。它是全自動執行的,只要確保計算 機通宵開著就行!

非互動式地下載檔案: wget

網路就像是一個堆滿了圖片、電影和音樂檔案的豐富寶藏,可供 人隨時下載。問題是對於一個有200多首MP3的檔案集,如果讓你逐 一手工下載每個檔案,你很快就會煩了,心情變得糟糕,不斷唉聲嘆 氣。wget這個命令就是用於無干擾地下載多個檔案和Web網站。只要 一個操作來設定好命令,它就會高高興興地下載指定的東西,可能會 持續好幾個小時,一直到全部下載完。

當然,最難處理的還是如何建立這個命令。wget也是一個功能超 級強大的程式,詳細介紹完它的方方面面真得又夠寫一整本書了,所 以這裡沒有展示它的所有功能,只重點介紹用它可以做的兩件事:下載整個一組檔案(本節介紹的內容),以及下載整個網站(下一節將 要介紹的內容)。

如何下載這些位於不同目錄中的具有不同檔名稱的所有MP3檔案。答案就是wget

# 下載百度圖片[祁同偉](可以下載,但是效果不太對。有反爬蟲機制)
wget -r -l2 -np -w 5 -A.jpeg -R.html,.gif http://image.baidu.com/search/index?tn=baiduimage&ps=1&ct=201326592&lm=-1&cl=2&nc=1&ie=utf-8&word=%E7%A5%81%E5%90%8C%E4%BC%9F
  • wget的-r(或–recursive)選項會沿著連結,深入到各個子目錄中搜尋檔案。
  • -l2(或–level=[#])選項不但重要,而且也很微妙。它用於告 訴wget在取回檔案時最多應該遞迴多深。小寫的字母l在這裡代表 “level(層)”,數字表示wget應該向下搜尋的最大深度。
  • 避免下載過多檔案的一種辦法是使用-np(或–no-parent)選項, 它可以阻止wget遞迴到父目錄。
  • -w(或–wait=[#])選項可以在每兩個檔案的下載 之間引入一個短暫的時間間隔。這有助於當連續不斷地從伺服器下載 檔案時,避免對伺服器產生過重的負擔。在預設情況下,wget下載間 隔數字的單位是秒;如果需要,也可以在數字後面新增一個m,以指 定分鐘,或是用h指定小時,甚至用d來指定天數。
  • -A(或–accept)用於告 訴wget:你只想下載某種型別的檔案,而其他檔案則不需要下載。A 代表accept(接受),後面跟著需要下載的各種檔案的字尾名[用逗號
    (,)分隔]。
  • 相反,-R(或–reject)選項則是告訴wget不想下載的檔案: HTML和GIF檔案。

非互動式地下載整個網站:wget

如果你想備份整個網站,或是下載別人的網站,也得用wget。在 上一節用wget抓取回了單個的檔案,此外,還可以用它獲取整個網站 的內容。

假設正在瀏覽www.neato.com這個網站,現在位於www.neato. com/articles/index.htm這個連結上。你想複製/articles目錄下的所有 東西,而且並不想要這個網站上的其他東西。以下命令就可以完成這 個任務:

wget -E -r -k -p -w 5 –np http://www.neato.com/articles/index.htm

也可以把各個選項組合起來使用,如下所示:

wget -Erkp -w 5 –np http://www.neato.com/articles/index.htm
  • 使用-E(或–html-extension)選項,wget就會對每個頁面進行 轉換,讓它們均以.html結尾。
  • 下載網站可能會引發一些其他問題,不過,幸好可以使用正確的 wget選項來避免它們。當在計算機上開啟用wget下載的頁面時,頁面 上的連結可能會不起作用,這樣就不能在頁面之間進行導航。通過指 定-k(或–convert-links)選項,就告訴wget重寫頁面上的連結, 以便讓它們能夠在計算機上起作用。這個選項修復的不僅是指向頁面 的連結,還會修復指向圖片、CSS(Cascading Style Sheet,層疊樣式 表)等檔案的連結。用一下這個選項,你一定會對它感到滿意。
  • 說到CSS和圖片,有必要說一下為什麼需要使用-p(或—page -requisites)選項。為了能夠讓Web頁面正常顯示,Web開發人員可 能需要指定與頁面的HTML一同使用的圖片、CSS和JavaScript檔案。 -p選項會要求wget下載為了正常顯示網頁而需要的任何檔案。有了這 個選項,在把頁面下載到本機後,開啟頁面就能看到原來在Web中看 到的所有東西。如果沒有這個選項,可能最終得到的只是一個不可查 看的檔案。

順序下載多個檔案和因特網資源:curl

curl在指定要下載的連結時能夠支援URL的序列或集 合,而wget則不能這樣;同時,wget支援遞迴下載,而curl則沒有這個功能。

下載多個檔案:

$ curl -O http://www.wbez.org/ta/[1-10].rm 
$ curl -O http://www.wbez.org/ta/{one,two,three}.rm
  • -O(或--remote-name)選項是必需的。如果不使用它,curl會將下載的資訊輸出到STDOUT,結果終端顯示視窗內很快就塞滿了一堆 沒有用的語言符號。-O選項的作用就是讓curl把它下載的東西輸出到一個檔案,並用正在下載的檔名來作為本地檔案的名稱。

Samba是世界上最重要的開源專案之一,因為它讓Linux(以 及其他基於Unix的機器,如Mac OS X)能夠使用SMB(Server Message Block)——所有Microsoft Windows機器上使用的聯網協議。
有了SambaUnix機器就能夠連線和裝載Windows機器上共享的資源,能夠將檔案列印到與Windows機器相連的共享印表機。Unix機器也可以安裝基於Samba的印表機和檔案共享,而Windows機器則能夠連線 和使用它們。事實上,Samba非常有用,以至於不必需要相應的 Windows 機器。在Linux機器組成的網路中,可以選擇用Samba實現檔案和印表機共享,因為它工作得相當出色。

查詢工作組的主瀏覽器:

nmblookup -M [Master Browser] 
nmblookup -S [NetBIOS name] 
nmblookup -A [IP address]

要查詢網路中的Master Browser,可以執行帶有-M(或–master- browser)選項的nmblookup命令,最後再跟一個“-”,這個字元基本 上表示“給我找一個Master Browser”。

nmblookup -M -- -
nmblookup -SA 192.168.1.151

NetBIOS 名稱和 IP 地址的查詢和對映: nmblookup -T

nmblookup -T "*"

nmblookup是找到正在通過Samba共享檔案和印表機的任何計算 機的快速方法。在該命令後面新增-T選項,後面再跟上” * “(對,這 裡必須使用雙引號來告訴shell:不能將星號*作為代表當前工作目錄 中所有檔案的萬用字元)。

列出機器上的 Samba 共享: smbaclient

smbclient -L ELIOT -U scott
smbclient -L localhost

用類似 FTP 的客戶端訪問 Samba 資源: smbclient //server/share -U username

smbclient //eliot/documents -U scott

掛載 Samba 檔案系統:

smbmount
smbumount
LAST

很多Linux使用者都願意假裝微軟不存在,但實際上又不得不承認 還生活在Windows的世界中。Samba 讓這些不同系統共存變得相當簡 單,它讓Linux使用者可以訪問Windows機器上的資源,也讓其他操作系 統的使用者可以訪問Linux機器上的資源。微軟可能不很喜歡Samba,但 Samba確實是一種成熟、穩定、功能強大的技術,而且由於Samba是 開源的,因此它非常有助於將全世界的計算機更緊密地連線在一起。 無論是在家庭,還是在商業領域,Samba都有助於減少對Windows服 務器的需求,用某位女前輩的話來說,Samba真是個好東西!


寫在最後,以上內容,除了一個連結引用,其他的全部內容全部來自《Linux命令速查手冊》,我只是記錄了這裡面的內容。蟹蟹。~

相關文章