第 9 章 文字環境的操作
本章重點 9-1 如何進入文字模式 9-2 登入、登出、關機 9-3 檔案與目錄的操作 9-4 使用光碟及軟碟機 9-5 在背景執行程序 9-6 排程工作 9-7 打包、壓縮與解壓縮 9-8 其他常用指令
前言 雖然 Linux 已經提供了漂亮的 X Window 視窗操作介面, 但有些功能在文字模式下操作 , 卻更顯得方便。因此本章中我們將為您介紹一些在 Linux 文字模式下常用的指令, 讓使用者熟悉文字模式的基本操作方法。
9-1 如何進入文字模式 安裝完 Linux 進入 X Window 的圖形模式後, 您可以使用下列幾種方式, 進入文字模式 (稍後會介紹詳細的操作方式): 在 X Window 中開啟文字模式視窗。 切換虛擬主控台進入文字模式。 開機直接進入文字模式。 在本章中, 這三種操作模式我們一律以文字模式來稱呼。
9-1-1 在 X Window 中開啟文字模式視窗 我們以預設的 GNOME 桌面環境為例, 在 X Window 下進入文字模式最簡單的方式, 就是按概覽鈕, 切換到應用程式頁次的系統工具類別 , 然後按終端機圖示開啟文字模式視窗: 您會看到有 2 個終端機圖示, 其差別僅在於文字和底色的配置不同罷了。本書將一律採白底黑字的配色。
在 X Window 中開啟文字模式視窗 在文字模式視窗中, 可以用 + 與 + 鍵來捲動視窗內容。
9-1-2 切換虛擬主控台進入文字模式 Linux 主機在主控台 (console) 下提供了 7 個虛擬主控台, 在每一個虛擬主控台中可以執行各自的程式。我們可以在登入 X Window 系統後的任何時間, 按下 + + 來切換到其他的虛擬主控台, 其中的是指 是指 到 的功能鍵:
切換虛擬主控台進入文字模式 主控台操作模式就使用者坐在 Linux 主機前直接操作電腦。
切換虛擬主控台進入文字模式 您也可以在 X Window 登入畫面一出現的時候, 就按 + + 直接登入文字模式的虛擬主控台。 文字模式虛擬主控台中的鍵盤操作方式與文字模式視窗相似。如果要捲動螢幕內容, 請按 + 或 + 鍵即可。
9-1-3 開機直接進入文字模式 如果您不習慣在圖形介面下操作, 也可以將系統設定成開機後, 直接在文字模式下登入。 Fedora 以往是以 /etc/inittab 這個檔案來決定開機時執行什麼模式, 但從第 15 版開始改用 /etc/systemd/system/default.target 這個檔案來決定系統預設的模式。Fedora 提供了 2 組常用設定: multi-user:文字模式, 相當於執行 init 3 指令 graphical-user:圖形介面模式, 也就是系統安裝完成時, 預設的執行模式, 相當於執行 init 5 指令
開機直接進入文字模式 要設定開機時進入文字模式, 請切換到文字模式虛擬主控台, 並以 root 帳號登入系統, 然後如下操作:
開機直接進入文字模式 若爾後想再改回開機時時進入圖形介面, 則可如下操作:
開機直接進入文字模式 在文字模式下登入系統後, 若要進入 X Window, 可於指令列執行 startx 指令。而按下 + + 鍵, 亦可切換到其他的虛擬主控台。
9-2 登入、登出、關機 Linux 是一個可供多人使用的作業系統, 每個人必須用自己的帳號登入系統, 並在不用的時候登出。此外, 系統管理人員還必須知道如何關閉或重新啟動系統。 本章所介紹的指令, 若指令提示符號為 "[root@free ~]#", 表示必須使用 root 權限才能執行, 所以請以 root 帳號登入, 或使用 su - 切換為 root 帳號執行這些指令。
登入、登出、關機 上一節我們已經將系統設定在文字模式下登入。文字模式下的登入/登出介面與第 7 章所介紹的視窗模式有很大的不同, 底下就來介紹如何在文字模式下登入系統。
9-2-1 登入系統 進入 Linux 系統的第一件事情是登入 (login) 系統, 使用者必須先有該主機的帳號才能登入。一個帳號包括使用者名稱和密碼兩個部份 (關於如何建立新的使用者, 請參考第 18-2 節), 使用者必須正確輸入才能進入系統, 登入系統的畫面如下:
登入系統
登入系統
登入系統 到此階段, 使用者算是通過系統的帳號驗證, 成功的進入系統了。但這並不表示可以使用系統所有功能, 還必須視所登入的帳號有多大的權限而定 (關於使用者權限的介紹, 請參考第 18 章)。
9-2-2 登出系統的 logout 指令 登出 (logout) 是登入的相對動作, 登入系統後, 若要離開系統, 使用者只要直接下達 logout 指令即可:
登出系統的 logout 指令 請特別注意!登出系統之後, 可不要立刻就關機。Linux 是個多人使用的作業系統, 登出系統只是結束自己的工作。如果要關機, 請看接下來介紹的 shutdown 指令。
如何查詢指令的用法? 在 Linux 系統中, 如果對某指令的功能不大清楚, 可以使用 man 指令查詢線上說明: 大多數指令的語法, 還可以透過 -h 或 --help 參數查詢。例如 ls 指令的語法可藉由 ls --help 或上述 man ls 指令查得。
9-2-3 關機或重新開機的 shutdown 指令 接著系統將依序關閉各項程序及服務。若您的電腦支援軟體關機, 系統會直接關機;若不支援則必須自行關閉電源。
關機或重新開機的 shutdown 指令 指定關機時間:加上 time 參數可指定關機的時間; 或設定多久時間後執行 shutdown 指令。time 參數有兩種模式: "hh:mm" 或 "+m"。"hh:mm" 表示幾點幾分關機, 例如 shutdown 10:45 指令表示 10:45 執行 shutdown 指令;"+m" 表示 m 分鐘後關機。範例如下: shutdown 指令只能指定關機的時間, 無法指定日期。若您想在特定的日期關機, 請參考 9-6-6 節搭配 at 指令使用。
關機或重新開機的 shutdown 指令 設定關機前的通知訊息:warning-message 參數可指定要送給所有登入使用者看的訊息。範例如下:
關機或重新開機的 shutdown 指令 關機後重新開機:-r 參數設定關機之後重新啟動。範例如下: -k 參數:不會真的關機, 只會送出系統訊息。 -c 參數:取消關機。只有在沒有使用立即關機的參數時 (如 +0 或 now) 才有用。 shutdown 指令不一定要在本機執行, 以 telnet 或 ssh 登入遠端機器時 (請參考 15-2 節), 同樣可執行 shutdown -h now 指令。
9-2-4 重新啟動電腦的 reboot 指令 顧名思義, reboot 指令是用來重新啟動系統的。常用的參數如下: -p 參數:搭配此參數可關機。 -f 參數:立即關機或重新開機, 不等待其他程式結束。 雖然 reboot 指令有幾個參數可以使用, 但一般只需要單獨執行 reboot 指令就可以了。
讓 + + 鍵無效 在 Linux 中直接按下 + + 鍵, 也會重新開機。如果您不希望任何人利用這組組合鍵隨意重新啟動電腦, 請刪除 /lib/systemd/system/ctrl-alt-del.target 這個檔案, 就可以讓按 + + 鍵重新開機的功能失效了。
9-3 檔案與目錄的操作 在文字模式下, 最常使用的指令便是瀏覽目錄和檔案的指令, 也就是本節要介紹的主題。
9-3-1 列出檔案清單的 ls 指令 ls (list) 指令是相當常用的指令, 用來顯示目前目錄中的檔案和子目錄清單。配合參數的使用, 能以不同的方式顯示目錄內容。底下我們列出一些常用的範例: 顯示目前目錄的內容:
列出檔案清單的 ls 指令 當執行 ls 指令時, 並不會顯示名稱以 "." 開頭的檔案。因此可加上 "-a" 參數指定要列出這些檔案:
.、. .、~ 和 / 在目錄的使用上, 有幾個特別的用法:"." 表示目前目錄, ".." 表示上一層目錄, "/" 表示系統根目錄, "~" 則為使用者家目錄或稱使用者專屬目錄。 其中使用者家目錄, 即使用者登入時所在的目錄。例如 root 使用者的家目錄為 /root, 而 tony 的使用者家目錄為 /home/tony 。
列出檔案清單的 ls 指令 以較詳細的格式顯示檔案 (這些顯示格式所代表的意義, 請參考 19-3 節):
列出檔案清單的 ls 指令 以 "-s" 參數顯示每個檔案所使用的空間, 並以 "-S" 參數指定依所佔用空間的大小排序:
9-3-2 切換目錄的 cd 指令 cd (change directory) 指令可讓使用者切換目前所在的目錄。範例如下:
9-3-3 建立目錄的 mkdir 指令 mkdir (make directory) 指令可用來建立子目錄。底下的範例會於所在目錄下建立 source 子目錄:
快速輸入指令的方法 在文字模式下操作指令時, 如果需要輸入與之前重複或類似的指令, 您可以按 、 鍵來回復最近執行過的命令。 在文字模式下操作指令時, 如果需要輸入與之前重複或類似的指令, 您可以按 、 鍵來回復最近執行過的命令。 另外當指令輸入到一半, 卻忘記指令名稱或僅記得前幾個字時, 只要按 鍵就能自動完成可能的指令, 若是尚未完成的指令有兩種以上的可能性, 再按第二次 鍵, 系統便會將所有可能的指令都列出來供您參考。關於這些功能的詳細操作方法, 請參閱 22-2 節。
9-3-4 刪除目錄的 rmdir 指令 rmdir (remove directory) 指令可用來刪除 "空" 的子目錄:
9-3-5 複製檔案的 cp 指令 cp (copy) 指令可以將檔案從一處複製到另一處。一般使用 cp 指令, 將一個檔案複製成另一個檔案或複製到某目錄時, 需要指定原始檔名, 以及目的檔名或目錄。範例如下:
複製檔案的 cp 指令 以下筆者舉幾個 cp 指令的參數供您參考: 顯示複製過程:加入 -v 參數可顯示指令執行過程。範例如下:
複製檔案的 cp 指令 遞迴複製:加入 - r 參數可同時複製目錄下的所有檔案及子目錄。範例如下:
9-3-6 刪除檔案或目錄的 rm 指令 rm (remove) 指令可以刪除檔案或目錄。用法如下: rm 指令的常用參數如下:
刪除檔案或目錄的 rm 指令 強迫刪除:使用 -f 參數時, rm 指令會直接刪除檔案, 不再詢問。範例如下: 此版 Fedora 的一般使用者在刪除檔案時並不會詢問是否確定要刪除, 您可用 root 身份編輯 /etc/bashrc 檔, 在最後面加上下列內容:
刪除檔案或目錄的 rm 指令 一般使用者重新登入後, 使用 rm 指令刪除檔案時就會詢問是否確定要刪除。
刪除檔案或目錄的 rm 指令 強制刪除指定目錄:當您使用 -r 參數刪除目錄時, 若該目錄下有許多子目錄及檔案, 則系統可能會不斷的詢問, 以確認您的確要刪除目錄或檔案。若已確定要刪除所有目錄及檔案, 則可使用 -rf 參數, 如此一來, 系統將直接刪除該目錄中所有的檔案及子目錄, 不會再一一詢問: 顯示刪除過程:使用 -v 參數。
9-3-7 顯示畫面暫停的 more 指令 為了避免畫面顯示瞬間就閃過去, 使用者可以使用 more 指令, 讓畫面在顯示滿一頁的時候暫停, 此時可按空白鍵繼續顯示下一個畫面, 或按 鍵停止顯示。 當用 ls 指令查看檔案列表時, 若檔案太多, 則可配合 more 指令使用:
顯示畫面暫停的 more 指令 單獨使用 more 指令時, 可用來顯示文字檔的內容: less 指令也具有讓畫面暫停的功能, 並且可以使用 、 鍵捲動畫面。
9-3-8 顯示檔案內容的 cat 指令 cat (concatenate) 指令可以顯示檔案的內容 (經常和 more 指令搭配使用), 或是將數個檔案合併成一個檔案。範例如下: 逐頁顯示 preface.txt 的內容:
顯示檔案內容的 cat 指令 將 preface.txt 附加到 outline.txt 檔案之後: 將 news.txt 和 info.txt 合併成 readme.txt 檔: 關於 "|"、 ">" 與 ">>" 的用法, 9-3-13 節還會再說明。
實務經驗談 cat 指令也可以配合 less 指令來使用, 除了可以分頁顯示、往前頁或後頁查閱, 還可以使用 "/" 來搜尋關鍵文字, 相當方便。
9-3-9 搬移或更改檔案、目錄名稱的 mv 指令 mv (move) 指令可以將檔案及目錄搬移到另一目錄下, 或更改檔案及目錄的名稱。範例如下:
9-3-10 顯示目前所在目錄的 pwd 指令 pwd (print working directory) 指令可顯示使用者目前所在的目錄。範例如下:
何時需要使用 pwd 指令呢? 在 Linux 下其實有很多相同的目錄名稱, 只是這些目錄分別位於不同的目錄之下。例如/usr/local/etc 與 /etc 目錄, 但提示符號通常只會列出目前所在的那個子目錄名稱, 如此無論是在 /usr/local/etc 或 /etc 看到的都是 "etc"!此時就可以使用 pwd 指令查得實際所在的目錄, 以免執行了錯誤的程式, 或是在錯誤的目錄下遍尋不到想找的檔案。
9-3-11 尋找檔案的 locate 指令 locate 指令可用來搜尋名字中包含指定條件字串的檔案或目錄。範例如下:
尋找檔案的 locate 指令 由於 locate 指令是從系統中儲存檔案及目錄名稱的資料庫中搜尋檔案, 雖然系統會定時更新資料庫, 但對於剛新增或刪除的檔案、目錄, 仍然可能會因為資料庫尚未更新而無法查得, 此時可以 root 帳號執行 updatedb 指令更新, 維持資料庫的內容正確。 第一次執行 locate 指令時, 可能會因為資料庫尚未建立, 會出現無法開啟資料庫的錯誤訊息。此時請先以 root 帳號執行 updatedb 指令建立資料庫, 再執行 locate 指令搜尋檔案。
9-3-12 搜尋字串的 grep 指令 grep 指令可以搜尋特定字串並顯示出來, 一般用來過濾先前的結果, 避免顯示太多不必要的資訊。範例如下:
搜尋字串的 grep 指令
搜尋字串的 grep 指令 若您是使用一般權限的使用者執行, 上例的輸出結果會包含許多如 "拒絕不符權限的操作" 之類的錯誤訊息, 可使用 -s 參數消除:
如何讓 grep 搜尋所有子目錄? grep 只能搜尋目前目錄下的檔案, 不包含子目錄。如果想要搜尋所有子目錄內的檔案, 必須加上 "-R" 參數, 例如 grep -R text *.conf。
9-3-13 重導與管線 重導 (redirect) 可將某指令的結果輸出到檔案中, 它有兩種用法:">" 和">>"。 ">" 可將結果輸出到檔案中, 該檔案原有內容會被刪除;">>" 則將結果附加到檔案中, 原檔案內容不會被清除。範例如下:
重導與管線 管線 (pipe) 指令的符號是 "|", 可將某指令的結果輸出給另一指令, 以下範例將 ls 指令的輸出結果傳給 grep 指令過濾:
重導與管線 再舉一個刪除檔案或目錄的例子, 我們可以利用 yes 指令會重複輸出 "y" 字元的特性, 將結果傳給 rm 指令, 如此即可省去重複輸入 "y" 的麻煩:
9-4 使用光碟機及軟碟機 在 Linux 的文字模式下要使用光碟或磁片, 並不是只將光碟或磁片放入即可, 使用者需要執行掛載的指令, 才可讀寫資料。本節將介紹如何在文字模式下, 使用光碟與磁片。 在第 7 章我們曾提到過, 所謂掛載, 就是將儲存媒體 (如光碟或磁片), 指定成系統中的某個目錄 (如 /mnt、/media/cdrom 或 /media/floppy)。透過直接存取此掛載目錄, 即可讀寫儲存媒體中的資料。以下我們就來看看, 在文字模式下的掛載及卸載指令。
X Window 下光碟的掛載目錄 在 X Window 下系統可自動掛載光碟片, 存取方式請參考 7-6 節的說明。其中光碟片的掛載點是自動產生的, 卸載後即會移除該目錄。光碟片通常掛載在 "/run/media/ 使用者名稱/光碟的標籤名稱" 目錄, 例如 /run/media/tony/mybackup 或是 /run/media/tony/我的光碟。
9-4-1 掛載的 mount 指令 由於 Linux 作業系統只允許 root 身份執行 mount 指令, 所以請您以 root 帳號來執行以下的操作。 以下筆者要將光碟掛載在 /media/cdrom 目錄, 但預設並沒有此目錄, 故請自行以 mkdir /media/cdrom 指令建立。要使用光碟片時, 請先把光碟片放入光碟機, 然後執行掛載的 mount 指令, 將光碟片掛載至系統中:
掛載的 mount 指令 若您的系統已登入 X Window 環境, 將光碟片放入光碟機中, 系統便會自動掛載光碟片, 就不需執行上述指令了。 同理, 使用磁片之前也和光碟一樣, 要先掛載後方能使用。請先建立 /media/floppy 目錄, 然後輸入以下指令:
掛載的 mount 指令 成功掛載光碟或磁片之後, 即可透過存取該目錄, 來讀寫碟片上的資料:
9-4-2 卸載的 umount 指令 如果不需要使用光碟片, 則需先執行卸載的 umount 指令後, 才能取出光碟片:
為何無法成功卸載光碟片 手動掛載光碟片後, 按下光碟機上面的退出鈕, 並無法退出光碟片, 必須先將光碟片卸載後, 方能退出光碟片。 若您目前所在之處就是光碟片掛載的目錄 (如 /media/cdrom), 或有其他使用者正在此目錄下, 將無法成功地卸載它, 當然也不能退出光碟片:
為何無法成功卸載光碟片 請先將工作目錄切換到別處, 或要求其他使用者離開此目錄, 才可卸載目錄並退出光碟片。而更換光碟片之後, 記得要將光碟片再次掛載才能使用。 如果您不確定是誰正在使用該目錄, 請執行 fuser -u /media/cdrom/ 指令, 便可以查出使用該目錄的程序與使用者。 在 X Window 中, 系統會自動掛載/卸載光碟, 無需另外執行卸載指令。
9-4-3 允許一般使用者掛載光碟或磁片 Linux 作業系統預設只允許 root 使用者才能執行 mount 指令, 若是一般使用者執行上述指令, 則會出現以下的錯誤訊息:
允許一般使用者掛載光碟或磁片 若您確定要開放一般使用者掛載光碟或磁片, 請以 root 使用者執行 visudo 指令如下修改 (預設會以 vi 編輯器開啟 /etc/sudoers 檔):
允許一般使用者掛載光碟或磁片 存檔離開後, 一般使用者要掛載或卸載光碟或磁片時, 只要在原來的 mount 及 umout 指令最前面加上 sudo 即可。亦即掛載時使用 sudo mount /dev/cdrom /media/cdrom;而卸載則是使用 sudo umount /media/cdrom。
掛載其他種類的儲存媒體 mount 指令除了可掛載光碟之外, 也可掛載硬碟分割區、USB 隨身碟、數位相機...等 (第 11 章會進一步介紹)。例如 /dev/sda1 (第 1 顆硬碟的第一個主要分割區) 是採用 Windows 的 NTFS 檔案系統, 可執行以下指令掛載:
掛載其他種類的儲存媒體 執行上述指令前, 您需先建立要掛載的目錄 (此例為 /media/windows )。 若要掛載 FAT32 檔案系統的分割區, 可用 -t vfat 參數指定檔案系統種類。
9-5 在背景執行程序 使用者有時候執行的程序可能要花很多時間, 如果將它放在前景執行, 將導致無法繼續做其他事情, 最好的方法就是將它放在背景執行。甚至可能希望在使用者登出系統後, 程序還可以繼續執行。讓我們看看如何達成此一目的。
9-5-1 在背景執行程序的 &、bg 指令 將程序放到背景執行最簡單的方法, 就是在指令最後加上 "&", 範例如下: 或者如下操作:
9-5-2 前景執行程序的 fg 指令 如果使用者目前有程序在背景執行中, 使用者可以下達 fg 指令, 將它從背景中移到前景執行:
9-5-3 於登出後讓程序繼續執行的 nohup 指令 nohup (no hangup) 指令可讓使用者登出系統後, 程序繼續執行。範例如下: 然後使用者就可登出。當再登入時, 可用 ps -aux 指令看到程序仍在背景中執行 (關於 ps 指令的解說請看第 20-2-2 節)。
Linux 指令常放置的位置 其實 Linux 系統提供的指令極多, 而且不同的 Linux 系統提供的指令和用法也有出入 , 有興趣的讀者可參考旗標出版的『Linux 指令詳解辭典』 , 或請自行執行 echo $PATH 指令檢視 PATH 參數所設定的目錄有那些 (一般至少有 /bin 、/usr/bin、/usr/local/bin), 再到這些目錄看看它提供了哪些檔案:
Linux 指令常放置的位置
9-6 排程工作 電腦有很多程式需要自動啟動或是週期性地被執行, 例如開機後自動啟用郵件服務、清理硬碟中不要的暫存檔、備份系統資料...等。 另外, 有時遇到某些工作需要延後執行, 或是在未來已確定的時間執行, 例如已知某日即將停電, 便可先設定讓系統在停電之前, 先行關機。對於這些重複性或是需要指定時間的工作, 其實不必感到困擾。您可利用本節所介紹的指令, 輕輕鬆鬆完成想要執行的工作。
9-6-1 排程的 crond 常駐指令 crond 是 Linux 用來定期執行程式的常駐指令。當安裝完成作業系統之後, 預設便會啟動此排程指令。crond 每分鐘會定期檢查是否有要執行的工作, 如果有要執行的工作, 便會自動執行該工作。而 Linux 所排程的工作主要分成以下 2 類: 系統執行的工作:系統週期性所要執行的工作, 如備份系統資料、清理暫存檔等, 這些工作通常由系統管理者安排。 個人執行的工作:某個使用者定期想做的工作, 例如每隔 10 分鐘就檢查郵件伺服器是否有新的信, 這些工作可由每個使用者自行設定。
9-6-2 排程設定檔的寫法 在介紹如何排程前, 讀者需先了解排程設定檔的寫法, 其格式如下: 而每個欄位所代表的意義如下表所示:
排程設定檔的寫法
排程設定檔的寫法 在這些欄位裏, 除了 "Command" 是每次都必須指定的欄位以外, 其他欄位皆可視需求自行決定是否指定。對於不指定的欄位, 請填上 "*" 即可。以下筆者就介紹幾個常用的範例:
排程設定檔的寫法 指定每小時的第 1 分鐘執行 program -a -b -c 指令:
排程設定檔的寫法 指定每天的 4 點 20 分執行 program 指令: 指定每月 9 日的 3 點 50 分執行 program 指令:
排程設定檔的寫法 指定每年的 9 月 8 日 0 點 1 分執行 program 指令:
排程設定檔的寫法 如果您要同時指定多個不連續的時間, 則可在時間跟時間之間用 ", " 區隔開來。如以下範例指定每月 1 日及 15 日的 2 點 20 分執行 program 指令:
排程設定檔的寫法 如果要指定連續的時間, 則可用 "-" 連接兩段時間。例如以下範例指定每天 1 點至 4 點的第 25 分鐘執行 program 指令:
排程設定檔的寫法 若要指定週期性的時間, 則可用 "/" 加上 "時間間隔" 指定。例如以下範例指定每隔 10 分鐘執行一次 program 指令:
排程設定檔的寫法 指定每月隔 10 天的 5 點 35 分執行一次 program 指令:
9-6-3 排程的系統工作 /etc/crontab 檔是 Linux 系統工作的排程設定檔, 可如下設定:
排程的系統工作
排程的系統工作
排程的系統工作 在上述的系統工作排程設定檔中, crond 排程指令會每小時、每天、每週及每月執行一次 /etc/cron.hourly、/etc/cron.daily、/etc/cron.weekly 及 /etc/cron.monthly 目錄中的所有設定檔。有興趣的讀者可自行瞭解這些目錄下的設定檔, 筆者在此就不再說明。 crond 還會執行 /etc/cron.d 目錄下的檔案, 讀者可自行了解該目錄下的設定檔。
9-6-4 排程的個人工作 除了上述排程的系統工作以外, 所有使用者則可利用 crontab 指令, 自行設定要定期執行的工作。
使用者新增排程工作 每個使用者可執行 crontab -e 指令, 編輯自己的排程設定檔, 並在此檔加入要定期執行的工作。以下範例為 tony 使用者編輯自己的排程設定檔:
使用者新增排程工作 執行上述指令後, 即會進入 vi 文書編輯器 (有關 vi 文書編輯器的使用方法, 請參考 14-3 節), 接下來即可自行編輯排程的工作。 例如以下範例指定每天的 14 點 55 分執行 tar czvf backup/backup.tar work/* 指令 (有關打包與壓縮的 tar 指令, 請參考 9-7-1 節), 將其家目錄中 work 子目錄下的所有檔案, 打包並壓縮後, 備份到其家目錄中 backup 子目錄下:
使用者新增排程工作 如果您不習慣使用預設的 v i 文書編輯器, 例如想改用 nano 編輯, 可執行 export VISUAL=nano 指令, 將預設的文書編輯器改為 nano。 而 crond 指令在 14 點 55 分執行了 tony 使用者指定的指令之後, 便會將輸出結果或錯誤訊息, 以 E-mail 寄送給該使用者。例如以下為 tony 使用者所收到執行結果郵件的內容:
使用者新增排程工作
使用者新增排程工作
使用者檢視目前排程的工作 要知道目前自己排程的工作, 可執行 crontab -l 指令查詢:
使用者刪除排程的工作 如果不想再定期執行排程中的工作, 則可執行 crontab -r 指令刪除所有排程的工作:
系統管理者可管理所有使用者排程的工作 root 系統管理者除了可執行上述的 crontab 指令, 設定自己的程排工作外, 亦可管理一般使用者的排程工作, 例如執行以下指令即可編輯 tony 使用者的排程工作: 同理, 系統管理者也可執行 crontab -l -u tony 指令列出 tony 使用者目前排程的工作;執行 crontab -r -u tony 指令刪除 tony 使用者所有排程的工作。
個人排程設定檔擺放的位置 每個使用者排程工作的設定檔會被儲存在 /var/spool/cron 目錄下, 以帳號名稱為檔名。例如 tony 使用者的排程設定檔即為 /var/spool/cron/tony 檔。不過這些設定檔只允許 root 系統管理者讀寫, 一般使用者並沒有權限讀取此排程設定檔。
9-6-5 排程程式的輸出結果 crond 指令預設會將執行的結果及錯誤訊息, 以 E-mail 的方式寄給要求執行的使用者。您如果不想收到這些郵件, 可加入以下所述的內容, 將執行結果導向到一個記錄檔:
排程程式的輸出結果 而下例則會將執行結果及錯誤訊息, 全部導向指定的記錄檔:
排程程式的輸出結果 而最後這個範例將不會儲存所有執行結果及錯誤訊息:
9-6-6 僅執行一次的排程 at 指令 除了前面說明的 crond 指令外, Linux 還有一個 at 指令可以設定排程, 指定在某一時間進行工作。
設定排程工作 以下我們用指定關機日期的範例, 來介紹 at 指令的用法:
實務經驗談 crond 與 at 都可以設定排程, 那麼兩者有什麼不同呢?一般來說, crond 指令適合需要週期性執行的工作, 如每天進行備份。 而如果是僅需執行一次的工作, 例如筆者收到通知, 星期天上午 10 點辦公室會停電, 可是當天不上班, 那麼就可以如上述段落的說明, 使用 at 指令配合 shutdown 指令設定排程, 讓系統在停電前關機。
查詢及刪除排程工作 設定好的排程如果臨時變更, 或想查詢或刪除排程呢?接著我們就要介紹, 可以查詢 at 指令所設定排程的 atq 指令, 及可以刪除排程的 atrm 指令:
查詢及刪除排程工作 若想刪除排程工作, 可以用 atrm 指令: atq 及 atrm 指令, 也可以分別用 at -l 及 at -d 來代替。詳細的指令用法, 您可以用 man at 指令來查詢, 或是參考旗標公司出版的『 Linux 指令詳解辭典』。
9-6-7 設定開機自動啟動的服務 若您希望 Linux 開機後便自動啟動某些系統服務, 如網頁或郵件伺服器時, 這些服務都位於 /lib/systemd/system 目錄下。您可使用如下的格式來設定開機要自動開啟的服務: 例如筆者要設定開機自動啟動 VSFTPD 伺服器:
9-6-8 指定開機自動執行的程式 如果您希望當 Linux 啟動時, 就能自動執行某些程式, 則請將要執行的程式寫入 /etc/rc.d/rc.local 檔案 (預設並不存在)。例如我們希望 Linux 啟動時, 便自動執行 program 指令, 請以 root 帳號用文書編輯器建立 /etc/rc.d/rc.local 檔案:
指定開機自動執行的程式 接著如下設定讓 /etc/rc.d/rc.local 可以被執行:
9-7 打包、壓縮與解壓縮 在 Linux 的世界中, 大部分的程式都是以壓縮檔的形式散佈。所以我們常常會看到一些以 .tar.gz, .tgz, .gz 或 .bz2 為副檔名的檔案。這些檔案都是使用各種不同壓縮程式所製作出來的壓縮檔, 我們從網路上取得這樣的檔案之後, 都要先解壓縮才能安裝使用。 由於這是每個 Linux 使用者經常會用到的基本功能, 因此筆者將在這一節中介紹最常見到的打包、壓縮和解壓縮程式。以後再遇到這些檔案時, 就知道該如何處理了。
9-7-1 打包檔案的 tar 指令 tar 指令位於 /bin 目錄中, 它能將使用者所指定的檔案或目錄打包成一個檔案, 不過它並不做壓縮。一般 Unix 上常用的壓縮方式是先用 tar 指令將許多檔案打包成一個檔案, 再以 gzip 等壓縮指令壓縮成 xxx.tar.gz (或稱為 xxx.tgz ) 的檔案。
打包檔案的 tar 指令 tar 指令的參數繁多, 您可執行 tar --help 指令得到各參數的語法及大致說明。以下列舉常用參數作說明: -c:建立一個新的 tar 檔。 -v:顯示運作過程的資訊。 -f:指定檔案名稱。 -z :呼叫 gzip 壓縮指令執行壓縮、解壓縮。 -j :呼叫 bzip2 壓縮指令執行壓縮、解壓縮。 -t :檢視壓縮檔案內容。 -x :解開 tar 檔。
打包檔案的 tar 指令 在此先舉一些最常用的範例: 以下就其各種功能分別解說。
壓縮與解壓縮 tar 指令本身沒有壓縮能力, 但是我們可以在產生 tar 檔案後, 立即使用其他壓縮指令來壓縮或解壓縮, 省去需要輸入兩次指令的麻煩: 使用 -z 參數來解開最常見的 .tar.gz 檔案: 使用 -j 參數解開 tar.bz2 壓縮檔:
壓縮與解壓縮 使用 -Z (大寫) 參數指定以 compress 指令壓縮, 或以 uncompress 指令解壓縮 tar 檔:
壓縮與解壓縮 使用 --totals 參數可在打包完成後, 顯示寫入的 bytes 數:
打包與解開 tar 的主要功能在於打包和解開, 讓我們看看其他相關參數的運作: 使用 --atime-preserve 參數, 可將解開後的檔案以原來的檔案時間存檔:
打包與解開 使用 -h 參數指定打包檔案時, 若遇到符號連結 (symbolic link, 請參考 19-5 節) 時, 要儲存符號連結所連結的檔案, 而不是符號連結本身:
更新與刪除 暸解了打包和解開的方法後, 接著看看如何針對部份檔案做更新與刪除的處理, 請看以下範例說明: 使用 --delete 參數刪除 .tar 檔中的檔案:
更新與刪除 使用 -r 參數將檔案附加到 tar 檔裡面: 使用 -k 參數解開 tar 檔案時, 不覆蓋已存在的檔案:
更新與刪除 使用 --remove-files 參數將檔案移入 tar 檔案中, 並移除原檔案:
9-7-2 壓縮與解壓縮的 zip 和 unzip 指令 在 Linux 中有許多不同的壓縮及解壓縮程式, 接下來介紹的是處理 .zip 檔的 zip 和 unzip 指令。這 2 個指令位於 /usr/bin 目錄中 , 它們和 DOS 下的 pkzip、pkunzip 以及 Windows 的 WinZip 軟體功能一樣, 可將檔案壓縮成 .zip 檔以節省磁碟空間, 而當需要使用的時候, 再將壓縮檔解開。
壓縮 .zip 檔案的 zip 指令 zip 指令可用來壓縮檔案, 如果我們有許多檔案需要做壓縮, zip 指令甚至可以將它們一併處理並壓縮成一個檔案。一般 zip 指令最常用的方法, 是依序在指令後加上壓縮後的指定檔名, 以及要壓縮的檔案。 若不清楚 zip 指令的執行參數, 可直接執行 zip 指令, 顯示版權與語法說明:
壓縮 .zip 檔案的 zip 指令 以下筆者舉幾個常用的範例: 壓縮指定的檔案 (可同時指定不同副檔名的檔案):
壓縮 .zip 檔案的 zip 指令 使用 -g 參數可壓縮指定的檔案, 並加入已存在的壓縮檔中:
壓縮 .zip 檔案的 zip 指令 使用 -j 參數壓縮時, 只會加入檔案的名稱及內容, 不會包含目錄結構:
壓縮 .zip 檔案的 zip 指令 使用 -r 參數, 可在壓縮時包含所有子目錄下的內容:
解壓縮 .zip 檔的 unzip 指令 unzip 指令用來將 zip 指令壓縮產生的檔案解壓縮。您同樣可不加任何參數, 直接執行 unzip 指令, 取得參數及使用說明, 接下來讓我們看一些常用的範例: 將檔案全部解壓縮:
解壓縮 .zip 檔的 unzip 指令 將檔案解壓縮至某個目錄下: 要解壓縮時, 若原來的檔案已存在目錄中, 就不解壓縮;若不存在, 才解壓縮:
解壓縮 .zip 檔的 unzip 指令 解壓縮時不要依照原來的目錄結構, 而將檔案置於目前目錄:
實務經驗談 雖然文字檔可以在各系統中通用, 但在 Windows/DOS 下, 文字檔的換行符號與 Linux 並不相同。一般文書編輯器與軟體皆可同時接受這兩種格式, 不過若是 script/CGI 程式檔, 可能會因為格式錯誤無法正常執行。 所以若您先在 Windows 下使用 Winzip 等軟體將 script/CGI 程式檔解壓縮, 再上傳到 Linux 主機, 可能會因為軟體自動將換行符號轉換成 Windows/DOS 格式, 而導致無法在 Linux 上執行, 故筆者建議您盡量使用 tar、unzip 等 Linux 程式進行解壓縮。
9-7-3 壓縮與解壓縮的 gzip 和 gunzip 指令 除了 .zip 檔的壓縮格式外, 在 Linux 系統下更常見的是 .gz 檔的壓縮格式, 這種檔案一般是由 gzip 指令所產生。由於 zip 指令能將許多檔案壓縮成一個檔案功能, 但 gzip 不能, 所以 gzip 一般會和 tar 合併使用。 目前大部分的壓縮檔大都是用 tar 將所有檔案包裝成一個檔案, 再用 gzip 做壓縮, 所以當我們看到副檔名為 .tar.gz 或 .tgz 者, 大多就是這類型的檔案。
壓縮檔案的 gzip gzip 和 zip 同為壓縮指令, 有了前面的基礎, 要使用 gzip 應該事半功倍。使用 gzip -h 可得到指令的參數及語法說明, 現在讓我們看看一些範例。 壓縮及解壓縮:
壓縮檔案的 gzip 解壓縮時, 使用 -f 參數, 可強迫覆蓋輸出檔案, 不要提示詢問訊息:
解壓縮 .gz 檔的 gunzip gunzip 的用法與 gzip 一樣, 它們擁有相同的指令列選項。其實 gunzip 與 gzip 基本上是同一支程式, 只是預設選項不同而已。讀者可以把 gunzip 視為 gzip -d 指令。因此筆者在此就不多作介紹。
9-7-4 壓縮與解壓縮的 bzip2 和 bunzip2 指令 在網路上還有一種 *.tar.bz2 的壓縮檔, 可能有不少人會很疑惑 bz2 是什麼程式壓縮的?答案是 bzip2。這種壓縮檔的壓縮能力較好, 通常會拿來壓縮系統 kernel 或 patch 檔。*.tar.bz2 的解壓縮方法如下: bzip2 與 bunzip2 在功能、參數的用法上與 gzip 幾乎一樣, 請您參考上一節來使用這個壓縮程式。
9-8 其他常用指令 Linux 可用的指令相當多, 本節再列舉幾個說明, 在爾後的章節中, 還會接觸到許多其他的指令。
9-8-1 修改密碼的 passwd 指令 passwd (password) 指令可讓使用者變更密碼。範例如下: 為了安全理由, 所輸入的密碼並不會顯示在螢幕上。
修改密碼的 passwd 指令 以下幾種狀況會出現密碼輸入錯誤的訊息: 輸入密碼太短, 會出現以下訊息: 輸入的密碼過於簡單:
修改密碼的 passwd 指令 重複的字元太多: 兩次輸入的密碼不同:
修改密碼的 passwd 指令 容易遭受字典攻擊的密碼: 輸入的密碼並不會顯示出來, 筆者是為了解說方便才列出來。
字典攻擊 舊版 Linux 不支援 MD5 編碼, 當時基本上只能使用最長 8 個字元的密碼, 依循 DES (Data Encryption Standard, 資料加密標準) 規則採用單向加密法, 每個密碼的編碼結果依編碼時所使用的 2 字元 Slat 參數的不同, 而有 4096 種變化。存放密碼的檔案是 /etc/passwd 檔, 此檔的預設權限是允許任何人讀取。
字典攻擊 雖然密碼的部份經過加密編碼, 卻無法阻擋有心破解的怪客。基於一般人習慣使用好記的常用字彙當做密碼, 怪客會節錄字典上的常用字 (普通英文字典一本約有十萬個單字), 然後把每個單字都進行編碼運算, 先計算出 4096 種可能的編碼, 再將這些結果與密碼檔 /etc/passwd 內的密碼編碼相互比對, 發現吻合則可得知密碼。這種利用字典來破解密碼的手段, 被稱做字典攻擊。
字典攻擊 由於 /etc/passwd 檔案內還有 UID (User ID, 使用者識別碼) 和 GID (Group ID, 群組識別碼) 的資訊, 必須能讓所有使用者讀取此檔, 系統方可正常運作, 所以不應該去限制此檔的讀取權限。 而當投影密碼啟動之後, 密碼將不再存放於 /etc/passwd 檔內, 而變成存放在 /etc/shadow 檔案裡, 這個檔案僅容許 root 帳號讀取, 因而有效地解決了這個問題。
9-8-2 顯示與設定時間的 date、clock 和 ntpdate 指令 clock 指令也可以顯示出系統目前的日期與時間 (不過 clock 指令預設不允許一般使用者執行, 請用 root 帳號執行):
顯示與設定時間的 date、clock 和 ntpdate 指令 如果您的系統時間不正確而想更改時, 可以使用 date 指令來設定時間!請用 root 帳號如下操作: 有時候您可能會苦於不知道標準時間為何!沒關係, 目前網路上也有校時伺服器提供標準時間, 可供使用者校正自己主機的時間, 如中央研究院計算中心校時伺服器的網址為 stdtime.sinica.edu.tw。
顯示與設定時間的 date、clock 和 ntpdate 指令 因此您可執行 ntpdate 指令, 將系統時間設成與校時伺服器一致 (請參考第17 章的說明安裝 ntpdate):
顯示與設定時間的 date、clock 和 ntpdate 指令 然後您再執行一次 date 指令, 就會發現系統時間已經更改。不過這樣還沒有結束, 我們還需要執行 clock -w 指令將更改的時間寫入電腦的 CMOS 中, 如此下次開機時才會使用更改過的時間: