64
著作權所有 © 旗標出版股份有限公司 21 使用者環境

第 21 章

Embed Size (px)

DESCRIPTION

第 21 章. 使用者環境. 本章大綱. 21-1 Shell 簡介 21-2 Shell 的各種功能 21-3 Shell 下的特殊字元 21-4 Shell 的環境變數與設定 21-5 .project、.plan 和.forward 設定檔. 前言. Shell 的功能在於搭起使用者與作業系統間的溝通橋樑 , 提供基本的操作介面 , 讓使用者得以下達各種指令 , 操作系統 , 產生彼此間的互動關係 , 因此我們可將 shell 看成是一種使用者環境。. 21 - 1 Shell 簡介. - PowerPoint PPT Presentation

Citation preview

Page 1: 第  21  章

著作權所有 © 旗標出版股份有限公司

第 21 章使用者環境

Page 2: 第  21  章

2

本章大綱 21-1 Shell 簡介 21-2 Shell 的各種功能 21-3 Shell 下的特殊字元 21-4 Shell 的環境變數與設定 21-5 .project .plan、 .forward和 設定檔

Page 3: 第  21  章

3

前言 Shell 的功能在於搭起使用者與作業系統間

的溝通橋樑 , 提供基本的操作介面 , 讓使用者得以下達各種指令 , 操作系統 , 產生彼此間的互動關係 , 因此我們可將 shell 看成是一種使用者環境。

Page 4: 第  21  章

4

21 - 1 Shell 簡介 Shell 的原意是外殼 , 用來形成物體外部的

架構 , 使整體具有輪廓而不致鬆垮變形。對作業系統而言 , shell 負責使用者和作業系統兩者之間的溝通 , 把使用者下達的指令解譯給系統去執行 , 並將系統傳回的訊息再次解譯 , 讓使用者瞭解其含意。所以 shell 除了可視為使用者環境之外 , 也稱為指令解譯器。

Page 5: 第  21  章

5

21 - 1 Shell 簡介

Page 6: 第  21  章

6

種類繁多的 Shell

每一種作業系統都有其特定的 shell, 例如: MS DOS 的標準 shell 是 command.com 。 Windows 的 shell 是 explorer.exe 。 Unix 之類的作業系統 , 其使用的 shell 各

有不同。常見的 shell 有 Small Bourne Shell (ash) 、 Bourne Again Shell (bash/bash2) 、 Bourne Shell (bsh) 、 BSD C Shell (csh) 、 Korn Shell (ksh) 、 Enhanced C Shell (tcsh) 和 ZShell (zsh) 等。

Page 7: 第  21  章

7

種類繁多的 Shell Bourne Shell 是最早被廣泛使用與標準化

的 shell, 幾乎所有的 Unix 相容家族都支援它。 BSD C Shell 由 Berkeley 大學開發 , 特點是易於使用且交談能力強。 Enhanced C Shell 提供指令列編輯功能、補全功能 , 以及拼字檢查功能。

Bourne Again Shell 衍生自 Bourne Shell, 融入 BSD C Shell 的特色 , 新增工作控制、別名 (alias) 、指令歷程 (history) 等功能。

Page 8: 第  21  章

8

種類繁多的 Shell

隨著 shell 程式版本不斷更新 , 各種不同的 shell 相互截長補短 , 彼此間的差異就逐漸減少。本 Linux 發行版預設的 shell 是 bash, 而且也支援 ash 、 ksh 、 tcsh 和 zsh 。

Page 9: 第  21  章

9

檢視與更換 Shell

各種 Unix 相容家族預設使用的 shell 不盡相同 , 例如 BSD 通常都使用 csh, Linux 都使用 bash 。不過多半都會提供其他的 shell 讓使用者更換。在更換 shell 之前 , 先讓我們認識提示符號並瞭解目前正在使用何種 shell 。

Page 10: 第  21  章

10

指令提示符號 Shell 各自擁有其指令提示符號 , 一般是在

使用者目前的目錄加上 $ 、 % 、 # 或 > 符號。以 cassia 帳號為例:

Page 11: 第  21  章

11

指令提示符號 我們來看看在不同的 shell 之下 , 其提示符號有何

不同 ( 提示符號可自行設定 , 此處以預設值為例 ) : ksh : $ bash 和 bash2 : [cassia@free ~]$ zsh : [cassia@free]~ % tcsh : [cassia@free ~]$

提示符號的用處是告訴使用者現在可以下達指令 , 同時也表示先前下達的指令已經完成 , 或是已經被放到背景執行。

Page 12: 第  21  章

12

檢視預設的 Shell 種類 要檢視登入系統時預設是用哪一種 shell,

最簡單的方式是執行 echo 指令 , 詢問系統 SHELL 環境變數的值:

Page 13: 第  21  章

13

檢視預設的 Shell 種類 另外 , 執行 finger 指令查詢使用者資料 ,

也能看出該使用者預設的 shell :

Page 14: 第  21  章

14

更換 Shell

不同的 shell 有不一樣的特性 , 有些時候使用者可能希望依自己的習慣使用別的 shell 。最簡單的方法就是直接執行該 shell 之名稱。若要回到原來的 shell, 則執行 exit 指令:

Page 15: 第  21  章

15

更換 Shell

Page 16: 第  21  章

16

更換 Shell 上述之方法僅能臨時改變環境 , 一旦登出

系統之後 , 下次登入時又將變回預設的 shell 。如果使用者希望更換預設值 , 其步驟如下 ( 以 cassia 帳號為例 ) :

Page 17: 第  21  章

17

更換 Shell

chsh 指令的用法 , 也可以簡寫如下:

使用者必須先登出再重新登入系統 , 就會啟用新指定的 shell 了。

Page 18: 第  21  章

18

禁止使用者登入 有些時候我們希望限制某位使用者僅能使

用 FTP 或 E-mail 服務 , 而不允許 telnet 或 ssh 登入。此時可將該使用者的 shell 換成 /sbin/nologin , 就能限定該使用者 ( 以 cas sia 為例 ) 不能 telnet 登入了。請以 root 帳號修改 /etc/passwd 檔案:

Page 19: 第  21  章

19

禁止使用者登入

Page 20: 第  21  章

20

21 - 2 Shell 的各種功能 每一種 shell 都會有些許的不同 , 本 Linux

發行版的預設值是 bash, 接下來讓我們一同看看 bash 的特色。

Page 21: 第  21  章

21

指令歷程當使用者在輸入指令的時候 , 可利用一些

基本按鍵幫助編修指令列: [↑] :顯示上一個指令。 [↓] :顯示下一個指令。 [←] :游標向左移動。 [→]游標向右移動。 [Backspace] :向左刪除一個字元。

Page 22: 第  21  章

22

指令歷程 使用上下鍵 , 不僅可切換此次登入後所執

行過的指令 , 還能夠記住使用者以前登入時所用過的指令。這些指令歷程都記錄在使用者家目錄裡的 .bash_history 檔案內。假設使用文書編輯器去開啟這個檔案 , 會看到類似下列的內容:

Page 23: 第  21  章

23

指令歷程 執行 history 指令可列出最近使用過的指令

及其編號 , 讓使用者免除反複輸入長串指令 , 節省時間並減少錯誤發生:

Page 24: 第  21  章

24

指令歷程

Page 25: 第  21  章

25

指令歷程 除了直接指定編號之外 , 也能根據 " 減法 "

原則執行指令:

Page 26: 第  21  章

26

指令歷程但是如果只輸入 ! 或 !-0 指令 , 會出現語法錯誤和未知事件的訊息:

Page 27: 第  21  章

27

定義指令別名 別名的作用可讓使用者自訂新的指令名稱

來替代原有的指令。範例如下:

Page 28: 第  21  章

28

定義指令別名從上面範例中我們可清楚地看出 , mycopy

指令在經過定義之後 , 成為 cp 指令的別名。每當執行 mycopy 指令就等於是執行 cp 指令。我們可以透過 alias 指令 , 採用熟悉的字彙替指令設定別名 , 讓 Linux 的指令名稱可依我們的喜好來更改。

Page 29: 第  21  章

29

定義指令別名欲得知目前有多少指令被設了別名 , 可執

行 alias 指令 , 參考一下別名的定義方法:

Page 30: 第  21  章

30

定義指令別名 可以定義別名 , 當然也能取消 , 請看下面用 u

nalias 指令取消別名的範例:

在指令列下所定義的別名只是暫時性的 , 當登出系統之後 , 再次登入時所有輸入的別名指令都會消失。若希望每次登入時系統會自動設定別名 , 請將 alias 指令加入該帳號家目錄下的 .bashrc 檔案裡:

Page 31: 第  21  章

31

定義指令別名

Page 32: 第  21  章

32

定義指令別名您也許會感到有些疑惑?原本在 .bashrc 檔案中沒有定義所有的別名 , 但執行 alias 指令還是列出一堆已經定義好的別名。其實這是因為系統已經預先設好一些較常用的別名 , 供所有的人使用。而這些已設好的別名並不會定義在每個使用者的 .bashrc 檔中 , 而是分別放在 /etc/profile.d 目錄內的 *.sh 設定檔中。

Page 33: 第  21  章

33

定義指令別名若欲改變這些別名的定義 , 請用文書編輯

器開啟家目錄下的 .bashrc 檔案 , 依自己的習慣將別名加入即可。系統讀取的順序是先讀 /etc/profile.d 內的 *.sh 檔案 , 然後讀使用者的 .bashrc 檔案。若兩者定義的內容互有衝突 , 則以後者為準。

Page 34: 第  21  章

34

指令補全 指令補全的功能可幫助使用者完成尚未全

部輸入的指令 , 範例如下:

Page 35: 第  21  章

35

指令補全假使輸入資料不足 , 導致 bash 無法判斷可

能的指令為何 , 系統便會發出聲響提醒使用者 , 倘若此時再按一次 [Tab] 鍵 , bash 就會把所有可能的指令都列出來 , 供使用者參考:

Page 36: 第  21  章

36

實務經驗談實務經驗談善用指令補全的功能 , 可以幫助我們更快速、更正確地輸入指令 , 例如:

Page 37: 第  21  章

37

工作控制 工作控制可在前景和背景間切換作業 , 並

且顯示有哪些工作正在背景中執行。所用的指令及其意義如下: bg :將中斷的工作放到背景裡面去執行。 fg :將正在背景執行的工作切回到前景

來進行。 jobs :顯示目前正在背景執行的工作名

單。

Page 38: 第  21  章

38

工作控制光是說說不易瞭解 , 實際操作最能體會 , 請您先切換到 root 帳號 , 再操作以下範例:

Page 39: 第  21  章

39

工作控制接著我們把正在執行的工作中斷 , 放到背

景裡面執行:

Page 40: 第  21  章

40

21 - 3 Shell 下的特殊字元 Shell 下有些特殊字元 , 可補系統指令之不足。

常用的特殊字元及其意義條列於下: # :標示註解 , 這些說明不會被當成指令或

程式執行。在 /etc/zshrc 檔案裡便能見到:

Page 41: 第  21  章

41

21 - 3 Shell 下的特殊字元 & :以背景方式執行。例如執行 updatedb

& 指令 , 會把這個工作丟到背景去執行。 ' :單引號定義引號內為一個完整的字串 ,

並且讓 shell 不要解讀其中的空白或特殊字元。例如執行 mycopy='cp -v' 指令 , 設定 mycopy 為 cp -v 指令的別名。

* :對應任何字串、字元或空字串。例如執行 ls a* 指令 , 會列出所有以英文字母 "a" 開頭的檔案及子目錄。

Page 42: 第  21  章

42

21 - 3 Shell 下的特殊字元 ? :對應任何單一字元。例如執行 ls b? 指

令 , 會列出檔名為 2 個字元 , 且第 1 個字元為 "b", 第 2 個字元為任意字元的檔案。

. :表示目前所在的目錄。例如執 ./exefile 指令 , 可執行位於現在目錄下的 exefile 執行檔 (exefile 為執行檔的檔案名稱 ) 。

.. :表示上一層的目錄。例如執行 cd .. 指令可切換到上一層目錄。

Page 43: 第  21  章

43

21 - 3 Shell 下的特殊字元 ; :可用它將多個指令分隔開來 , 讓指令依序

執行。範例如下所示:

> :把執行結果輸入一個檔案中。若該檔案已經存在 , 則原有內容會被刪除。範例如下:

Page 44: 第  21  章

44

21 - 3 Shell 下的特殊字元 >> :把執行結果附加到一個已存在的檔案後面。範例如下:

\ :脫逸符號 (escape), 解除特殊字元的含意。 | :建立管線 , 將前一個指令的執行結果輸入給

下一個指令使用。 ~ :使用者登入後所在的目錄 , 也就是使用者

家目錄。

Page 45: 第  21  章

45

21 - 3 Shell 下的特殊字元 [ 英文字母或數字 ] :對應括弧中任意範圍的字元。示範如下:

也可以指定字母的範圍:

也可以指定數字的範圍:

Page 46: 第  21  章

46

21 - 3 Shell 下的特殊字元 [! 英文字母或數字 ] :排除括弧中任意範圍

的字元。和前面一個的用法相反 , 比如執行 ls [!abc]* 指令 , 會顯示所有不以英文字母 "a" 、 "b" 、 "c" 中任一字元為檔名開頭的檔案。

{ 英文字母或數字 }: 對應括弧中的任意字元。效果和之前的 [英文字母或數字 ] 類似 , 但是字母或數字間要以逗號間隔開來 , 例如 ls {a,b,c}* 。

Page 47: 第  21  章

47

請謹慎使用 請謹慎使用 . . 與 與 ** 例如在 /tmp 目錄想檢查隱藏檔案時 , 會直覺地打 ls .*, 但是 “ .*” 會讓 shell 解釋成 . 與 .. 。所以此指令可引伸為 ls .. 將會顯示上一層目錄 , 也就是根目錄的列表。又例如執行 cp -R /root/.* /tmp/ 時 , 除了複製 /root 目錄下所有檔案 , 還能引伸成 cp -R /root/../* /tmp/, 導致根目錄底下所有目錄與檔案也會被複製過來。因此當執行指令時 , 務必小心 . 與 * 兩者的搭配使用。

Page 48: 第  21  章

48

21 - 4 Shell 的環境變數與設定 Shell 本身有一組用來儲存系統資訊的變數 ,

稱為環境變數 (Environment Variables) 。環境變數依據 shell 種類的不同 , 會有不一樣的變數及設定方法。

Page 49: 第  21  章

49

顯示環境變數 不同的 shell 雖擁有不一樣的環境變數 , 但彼此間的差異並不大。在 bash 下可用 set 指令查詢環境變數 (tcsh 請用 setenv 指令 ) :

Page 50: 第  21  章

50

修改環境變數 在 Bourne Shell 家族中 , 環境變數的設定

方式如下:

Page 51: 第  21  章

51

修改環境變數 用 export 指令也能變更環境變數:

Page 52: 第  21  章

52

修改環境變數這種改變方法 , 還是只能做臨時的更改 ,

如果想要在每次登入系統時 , 都會自動生效 , 請您編輯家目錄下的 .bashrc 檔案:

Page 53: 第  21  章

53

修改環境變數 每位使用者都有專屬的 .bashrc 檔案 , 這個檔案也僅對該使用者有效。倘若要更換全部使用者的預設值 , 必須使用 root 帳號編輯 /etc 目錄下的 bashrc 與 profile 檔案 , 以及 /etc/profile.d 目錄裡面所有 .sh 的檔案。

Page 54: 第  21  章

54

修改環境變數 由於每個使用者的預設路徑中並沒有包括

所有的目錄 , 因此有時候我們要執行某些程式時 , 會出現指令找不到的情形 , 例如:

Page 55: 第  21  章

55

修改環境變數這是因為系統只到 PATH 環境變數有設定

的路徑中去找檔案 , 沒設的就不找。而每個使用者的家目錄以及許多其他的目錄預設並沒放入 PATH 環境變數中 , 所以這時候我們可以用下面的方式來執行現行目錄下的程式:

Page 56: 第  21  章

56

修改環境變數 或者是將現行目錄也加入 PATH 環境變數中:

如此一來 , 您就能夠隨時隨地執行現行目錄下的程式了。同樣地這只是暫時性有效 , 若想在每次登入系統都自動生效 , 請您編輯家目錄下的 .bashrc 檔案 , 將上列這段指令加入設定檔後儲存即可。

Page 57: 第  21  章

57

21 - 5 .project 、 .plan 和 .forward 設定檔 除了 .bashrc 這種 shell 設定檔之外 , 接

下來我們還要介紹幾個其他的設定檔。

Page 58: 第  21  章

58

設定專案與計畫的 .project 與 .plan 檔 .project 和 .plan 檔是用來記錄該使用者

( 以 cassia 為例 ) 想給其他使用者 ( 以 lambert 為例 ) 查詢的資訊。當 lambert 執行 finger cassia 指令時 , 若 cassia 有開放權限 (cassia 家目錄的權限需設為 711, .project 和 .plan 檔案的權限則設為 644) , 則 cassia 家目錄下的 .project 和 .plan 檔案之內容就會顯示出來。

Page 59: 第  21  章

59

設定專案與計畫的 .project 與 .plan 檔 例如在 .project 與 .plan 檔的內容分別如

下所示:

則 lambert 執行 finger 指令時 , 就可以看到 cassia 的專案與計畫內容了:

Page 60: 第  21  章

60

設定專案與計畫的 .project 與 .plan 檔

Page 61: 第  21  章

61

設定轉信的 .forward 檔 在 Linux 系統中 , 我們能利用 .forward 檔案指定轉信位址。舉例而言 , 使用者 cassia 想暫時託付 lucy 代為處理信件 , 除了請 lucy 直接以 cassia 帳號登入之外 , 也可以在自己家目錄下編輯一個名稱為 .forward 的檔案 , cassia 只需在檔案內指定 lucy 的電子郵件帳號 , 之後寄給 cassia 的信件就會自動轉寄到 lucy 的信箱裡。

Page 62: 第  21  章

62

設定轉信的 .forward 檔 例如設定 .forward 檔的內容為:

然後執行 chmod go-w .forward 指令 , 以確定 .forward 檔案除了擁有者外 , 其他人沒有寫入的權限 , 否則系統會因為安全的顧慮拒絕為您轉信。現在我們執行 finger 指令後 , 就能看到以下訊息:

Page 63: 第  21  章

63

設定轉信的 .forward 檔

Page 64: 第  21  章

64

設定轉信的 .forward 檔假使您擁有兩個以上的電子郵件帳號 , 也

可以透過轉寄功能把信件集中管理。日後不再需要此功能時 , 僅需更改 .forward 檔案名稱或直接刪除即可。