開始進行文字終端機模式底下的指令操作行為!以及一點點初階的檔案管理行為囉!
前一堂課我們談到了文字界面 (command-line interface, CLI) 的指令操作,不過只是很簡單的一些指令而已。 你會發現如果指令每個字元都要手動輸入,好像很容易打字錯誤。這堂課我們會介紹一些組合按鈕,讓你可以快速的下達指令, 同時,透過 bash-completion 軟體的協助,連選項與參數都可以透過熱鍵來完成補齊的功能。另外,前一堂課我們也學到使用圖形界面查閱系統檔案, 這節課,就讓我們來簡單的透過 CLI 進行檔案管理的行為,當然,在實際操作檔案管理之前,本的目錄內資料的了解,也是必須要知道的項目。
其實我們都是透過『軟體』或『程式』在跟系統作溝通的。文字模式登入後所取得的程式被稱為殼(Shell),這是因為這支程式負責最外面跟使用者(我們)溝通, 所以才被戲稱為殼程式!CentOS 8 的預設殼程式為 bash,使用者最好一開始就能夠建立良好的操作行為,對於未來的 Linux 使用上,會有很大的幫助。
另外,關於 CLI 的環境,有幾個常見會搞混的名詞,這裡我們先來理解一下:
bash shell 環境下,指令的下達基本上有幾個需要注意的地方:
[student@localhost ~]$ command [-options] [parameter1...]
前一堂課我們使用過 ls 與 ll 這兩個簡易的指令來查看檔名,那如果想要知道目前的時間,或者是格式化輸出時間時,就得要使用 date 這個指令來處理!
[student@localhost ~]$ date
二 3月 3 17:54:38 CST 2020
因為 student 選擇中文語系的關係,所以螢幕上出現的就會是中文的星期二與月日這樣。 若需要格式化的輸出,就得要加上特別的選項或參數來處理,例如一般台灣我們常見 2020/03/03 這樣的日期輸出格式, 此時你可能要這樣下達指令:
[student@localhost ~]$ date +%Y/%m/%d
2020/03/03
上述的選項資料 (+%Y/%m%d) 基本上不太需要背誦,使用線上查詢的方式來處理即可。 最簡單的處理方式,可以透過 --help 這個長選項來查詢各個選項的功能,如下所示:
[student@localhost ~]$ date --help Usage: date [OPTION]... [+FORMAT] or: date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]] <==上面這兩行是語法的部份 Display the current time in the given FORMAT, or set the system date. <==這一行是指令說明 Mandatory arguments to long options are mandatory for short options too. <==底下是主要的 option 說明 -d, --date=STRING display time described by STRING, not 'now' --debug annotate the parsed date, and warn about questionable usage to stderr -f, --file=DATEFILE like --date; once for each line of DATEFILE -I[FMT], --iso-8601[=FMT] output date/time in ISO 8601 format. FMT='date' for date only (the default), 'hours', 'minutes', 'seconds', or 'ns' for date and time to the indicated precision. Example: 2006-08-14T02:34:56-06:00 -R, --rfc-email output date and time in RFC 5322 format. Example: Mon, 14 Aug 2006 02:34:56 -0600 --rfc-3339=FMT output date/time in RFC 3339 format. FMT='date', 'seconds', or 'ns' for date and time to the indicated precision. Example: 2006-08-14 02:34:56-06:00 -r, --reference=FILE display the last modification time of FILE -s, --set=STRING set time described by STRING -u, --utc, --universal print or set Coordinated Universal Time (UTC) --help 顯示此求助說明並離開 --version 顯示版本資訊並離開 FORMAT controls the output. Interpreted sequences are: <==底下則是格式 (FORMAT) 的說明 %% a literal % %a locale's abbreviated weekday name (e.g., Sun) %A locale's full weekday name (e.g., Sunday) %b locale's abbreviated month name (e.g., Jan) ......
整個輔助文件大致上可分為幾個部份:
你懂這個 command --help 的用法之後,未來許多指令你都可以自己查用法了!舉例來說,你知道 cal 這個指令的功能與如何應用嘛?
繼續來玩一下 date 這個指令!從前一小節使用 date --help 後,可以發現語法有兩種情況,如下所示:
[student@localhost ~]$ date --help Usage: date [OPTION]... [+FORMAT] or: date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]] Display the current time in the given FORMAT, or set the system date.
指令說明當中,可以是『顯示, display』也能夠是『設定, set』日期。語法 (Usage) 的第一行就是顯示日期而已,第二行當然就是設定日期了。 如果使用 student 身份來設定日期,會有什麼狀況?
# 先注意,設定日期的格式是: MMDDhhmmYYYY,也就是 月日時分年,除了年,其他都有兩位數 [student@station10-101 ~]$ date 三 3月 4 00:04:53 CST 2020 <==當下的日期 [student@station10-101 ~]$ date 030400052020 <==重設為當下的時間 date: 無法設定時間: 此項操作並不被允許 三 3月 4 00:05:00 CST 2020 <==這個動作其實沒有生效!
可以發現到日期並沒有變更到正確的日期,而且 date 也明白的告訴操作者,操作者沒有權限 (Operation not permitted)!因為日期的設定要系統管理員才能夠設定的。 此時我們就得要切換身份成為系統管理員(root)才行。處理的方法如下:
[student@localhost ~]$ su - 密碼: <==輸入密碼時,不會出現 * 符號! [root@localhost ~]#
本教學系統 root 的密碼為 myCentOS8,請注意大小寫不同!因此在『密碼:』後面輸入 myCentOS8 之後,你就可以發現使用者的身份變換成為 root 了! 此時再次使用 date 來看看日期能否被設定為正確?
[root@localhost ~]# date 030400052020 Wed Mar 4 00:05:00 CST 2020 [root@localhost ~]# date Wed Mar 4 00:05:20 CST 2020 [root@localhost ~]# hwclock -w
讀者們可以發現上表兩個指令的操作相差約 20 秒鐘,因此輸出的資訊就會有兩秒鐘的誤差。不過,日期確實就被修訂成為目前的狀態。 但如果需要完整的設定系統時間,則需要使用 hwclock -w 寫入 BIOS 時間鐘才行。(由於虛擬機的 BIOS 也是虛擬的,因此就不需要使用 hwclock 寫入)
另外, root 的身份是作為系統管理所需要的功能,因此做完任何系統維護行為後,請回復到一般用戶的身份較佳 (這個習慣請務必養成!)。
由於我們的系統環境使用中文,因此在日期的輸出方面可能就是以中文為主。那如果想要顯示為英文年月時,就得要修改一個變數,如下所示:
[student@localhost ~]$ date 三 3月 4 00:12:33 CST 2020 <==這個時候是中文 [student@localhost ~]$ LANG=en_US.utf8 <==這個 LANG 就可以改語系 [student@localhost ~]$ date Wed Mar 4 00:13:10 CST 2020 <==輸出就變成英文了!
你可以發現日期已經變更成為英文的方式來顯示了!此即 LANG 語系變數的設定功能。台灣地區經常使用的語系有中文 (zh_TW) 與英文 (en_US) 的萬國碼兩種, 當然,比較舊的資料可能需要使用 big5 編碼,所以台灣常見的語系有:
我們操作終端機 (terminal) 需要很多顯示的環境,還有一些基礎的設定,這些設定很多都是可以調整的。為了方便使用者可以自行修訂參數, 因此,我們就使用類似上面的 LANG 這個『變數』來設定一些功能。透過修改這些『變數』,就能夠影響操作環境或操作行為了。那如何查看某個變數呢? 透過 echo 這個指令,搭配變數取用方法即可。常見的呼叫變數的方式有:
[student@localhost ~]$ echo $var [student@localhost ~]$ echo ${var} # 簡單的說,就是變數名稱 (var) 前面加上錢字號成為 $var 即可。詳細規範則加上大括號成為 ${var} 即可。
至於語系的變化其實有兩個變數可以使用,除了常用的 LANG 之外,也可以透過 LC_ALL 來修訂!但一般建議使用 LANG 即可。 既然已經知道語系的設定變數為 LANG,透過上面的呼叫方式,則查閱目前語系的方法就是:
[student@localhost ~]$ echo ${LANG}
en_US.utf8
[student@station10-101 ~]$ LANG=zh_TW.utf8 [student@station10-101 ~]$ echo ${LANG} zh_TW.utf8 <==這樣就變更了語系
[student@station10-101 ~]$ locale LANG=zh_TW.utf8 <==整體語系,底下則是個別訊息的語系 LC_CTYPE="zh_TW.utf8" LC_NUMERIC="zh_TW.utf8" LC_TIME="zh_TW.utf8" LC_COLLATE="zh_TW.utf8" LC_MONETARY="zh_TW.utf8" LC_MESSAGES="zh_TW.utf8" LC_PAPER="zh_TW.utf8" LC_NAME="zh_TW.utf8" LC_ADDRESS="zh_TW.utf8" LC_TELEPHONE="zh_TW.utf8" LC_MEASUREMENT="zh_TW.utf8" LC_IDENTIFICATION="zh_TW.utf8" LC_ALL= [student@station10-101 ~]$ locale --help 使用方式: locale [參數…] 名稱 或者: locale [參數…] [-a|-m] 取得語區資料特定的資訊 系統相關資訊: -a, --all-locales 寫出存在的語區資料名稱 -m, --charmaps 寫出存在的字集對照表名稱 ....
[student@station10-101 ~]$ locale -a C <==標準 C 程式語言語系 C.utf8 en_AG en_AU en_AU.utf8 ...... zh_TW zh_TW.euctw zh_TW.utf8上面的資料量輸出比較多,如果超出整個視窗的行列範圍,我們可以按下 [shift]+[pageup] 向上翻頁,或 [shift]+[pagedown] 向下翻頁喔!你就可以看到所有的語系資料了。
[student@station10-101 ~]$ echo ${LANG} zh_TW.utf8 <==是中文 [student@station10-101 ~]$ localectl System Locale: LANG=en_US.UTF-8 <==是英文 VC Keymap: us X11 Layout: us [student@station10-101 ~]$ localectl --help localectl [OPTIONS...] COMMAND ... ...... Commands: status Show current locale settings set-locale LOCALE... Set system locale <==看起來是可以設定成為不同的語系 list-locales Show known locales set-keymap MAP [MAP] Set console and X11 keyboard mappings ...... [student@station10-101 ~]$ localectl set-locale zh_TW.utf8 # 這個指令要經過 root 驗證,因為會更動到系統設定值!所以這裡先知道即可。不建議修改啦!
除了上個例題談到的可以上下移動螢幕畫面的組合按鍵之外,在純文字模式 (bash shell) 的環境下,建議讀者們一定要熟記且經常應用的熱鍵與組合鍵有:
ll, ls, date, cal 均可使用 --help 來查詢語法與相關的選項、參數資料,但某些指令則沒有辦法顯示詳細的資訊。例如底下的小算盤指令:
[student@localhost ~]$ bc --help
usage: bc [options] [file ...]
-h --help print this usage and exit
-i --interactive force interactive mode
-l --mathlib use the predefined math routines
......
並沒有說明算術邏輯的符號,例如指數應用、小數點位數、加減乘除的符號等等。在開始說明之前,我們先來使用 bc 軟體的功能, 進行一下,如果你沒有計算機在身邊時,如何透過文字界面來進行數值運算:
[student@localhost ~]$ bc bc 1.07.1 Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006, 2008, 2012-2017 Free Software Foundation, Inc. This is free software with ABSOLUTELY NO WARRANTY. For details type `warranty'. 1+2+3+4 10 1/3 0 <==預設不輸出小數點後資料 quit
bc 指令為 Linux 純文字界面下的小算盤,你可以使用 bc --help 查詢到相關的選項資料,但是如上所示,加減乘除的符號, 還有小數點位數資料,以及離開 (quit) 等資訊,則沒有顯示於 --help 的輸出畫面中。Linux 有提供一個名為 manual page (手冊頁) 的功能, 你可以用 manual 縮寫 (man) 來查詢,如下所示:
[student@localhost ~]$ man bc bc(1) General Commands Manual bc(1) NAME bc - An arbitrary precision calculator language SYNTAX bc [ -hlwsqv ] [long-options] [ file ... ] DESCRIPTION bc is a language that supports arbitrary precision numbers with interactive exe‐ cution of statements. There are some similarities in the syntax to the C pro‐ gramming language. A standard math library is available by command line option. If requested, the math library is defined before processing any files. bc starts by processing code from all the files listed on the command line in the order listed. After all files have been processed, bc reads from the standard input. All code is executed as it is read. (If a file contains a command to halt the processor, bc will never read from the standard input.) ...... OPTIONS -h, --help Print the usage and exit. -i, --interactive Force interactive mode. ...... VARIABLES ...... There are four special variables, scale, ibase, obase, and last. scale defines how some operations use digits after the decimal point. The default value of scale is 0. ibase and obase define the conversion base for input and output num‐ bers. The default for both input and output is base 10. last (an extension) is a variable that has the value of the last printed number. These will be dis‐ cussed in further detail where appropriate. All of these variables may have values assigned to them as well as used in expressions. ...... - expr The result is the negation of the expression. ++ var The variable is incremented by one and the new value is the result of the expression. -- var The variable is decremented by one and the new value is the result of the expression. var ++ The result of the expression is the value of the variable and then the variable is incremented by one. var -- The result of the expression is the value of the variable and then the variable is decremented by one. expr + expr The result of the expression is the sum of the two expressions. ...... MATH LIBRARY If bc is invoked with the -l option, a math library is preloaded and the default scale is set to 20. The math functions will calculate their results to the scale set at the time of their call. The math library defines the following functions: ...... EXAMPLES In /bin/sh, the following will assign the value of "pi" to the shell variable pi. pi=$(echo "scale=10; 4*a(1)" | bc -l) ...... AUTHOR Philip A. Nelson philnelson@acm.org ......
這個 man 是比較詳細的資料,在該畫面中,你可以使用底下的按鈕來移動螢幕顯示整份文件的位置:
有興趣的話,讀者們可以自己慢慢的閱讀 man page。如果是短時間要查詢重要的項目,例如我們需要調整輸出的小數點位數 (scale) 時, 可以『跑到整份文件的第一行,然後輸入斜線 / ,輸入關鍵字』之後 man page 就可以自動幫你找關鍵字。
man page 除了上述的功能之外,其實 man page 的第一行也顯示了該指令/檔案的功能,例如 BC(1) 代表的是 1 號 man page, 而共有 9 種左右的 man page 號碼,其意義為:
代號 | 代表內容 |
1 | 使用者在shell環境中可以操作的指令或可執行檔 |
2 | 系統核心可呼叫的函數與工具等 |
3 | 一些常用的函數(function)與函式庫(library),大部分為C的函式庫(libc) |
4 | 裝置檔案的說明,通常在/dev下的檔案 |
5 | 設定檔或者是某些檔案的格式 |
6 | 遊戲(games) |
7 | 慣例與協定等,例如Linux檔案系統、網路協定、ASCII code等等的說明 |
8 | 系統管理員可用的管理指令 |
9 | 跟kernel有關的文件 |
上述的表格內容可以使用『man man』來更詳細的取得說明。透過這張表格的說明, 未來你如果使用man page在察看某些資料時,就會知道該指令/檔案所代表的基本意義是什麼了。
[student@station10-101 ~]$ man man MAN(1) Manual pager utils MAN(1) NAME man - an interface to the on-line reference manuals SYNOPSIS man [-C file] [-d] [-D] [--warnings[=warnings]] [-R encoding] [-L locale] [-m ...... DESCRIPTION ...... The table below shows the section numbers of the manual followed by the types of pages they contain. 1 Executable programs or shell commands 2 System calls (functions provided by the kernel) 3 Library calls (functions within program libraries) 4 Special files (usually found in /dev) 5 File formats and conventions eg /etc/passwd 6 Games 7 Miscellaneous (including macro packages and conventions), e.g. man(7), groff(7) 8 System administration commands (usually only for root) 9 Kernel routines [Non standard] ...... OPTIONS ...... Main modes of operation -f, --whatis Equivalent to whatis. Display a short description from the manual page, if available. See whatis(1) for details. -k, --apropos Equivalent to apropos. Search the short manual page descriptions for keywords and display any matches. See apropos(1) for details. ......文件說明中, -f 類似 whatis 指令,顯示較為完整的查詢,而 -k 則是與 apropos 指令相似,列出的是關鍵字的內容。 兩者都是在查詢有沒有某個 man page 的意思。底下我們來查查看這兩個差別在哪裡:
[student@station10-101 ~]$ man -f passwd passwd: nothing appropriate. [student@station10-101 ~]$ man -k passwd passwd: nothing appropriate.見鬼!沒東西!這是因為我們的 man 還沒有建置資料庫的問題所致。處理方案很簡單,透過 root 執行 mandb 即可!
[student@station10-101 ~]$ su - 密碼: [root@station10-101 ~]# mandb ...... Checking for stray cats under /usr/local/share/man... Checking for stray cats under /var/cache/man/local... 112 man subdirectories contained newer manual pages. 7466 manual pages were added. 0 stray cats were added. 0 old database entries were purged. [root@station10-101 ~]# exit logout [student@station10-101 ~]$下達指令前,請注意你的身份為何啊!
[student@station10-101 ~]$ man -f passwd openssl-passwd (1ssl) - compute password hashes passwd (1) - update user's authentication tokens passwd (5) - password file # 只有左側是完整的 passwd 的項目,才會列出來 [student@station10-101 ~]$ man -k passwd chpasswd (8) - 成批更新使用者的口令 chgpasswd (8) - update group passwords in batch mode fgetpwent_r (3) - get passwd file entry reentrantly getpwent_r (3) - get passwd file entry reentrantly gpasswd (1) - administer /etc/group and /etc/gshadow grub2-mkpasswd-pbkdf2 (1) - Generate a PBKDF2 password hash. lpasswd (1) - Change group or user password openssl-passwd (1ssl) - compute password hashes pam_localuser (8) - require users to be listed in /etc/passwd passwd (1) - update user's authentication tokens passwd (5) - password file passwd2des (3) - RFS password encryption pwhistory_helper (8) - Helper binary that transfers password hashes from passwd or shad... saslpasswd2 (8) - set a user's sasl password smbpasswd (5) - The Samba encrypted password file sslpasswd (1ssl) - compute password hashes userpasswd (1) - A graphical tool to allow users to change their passwords. vncpasswd (1) - change the VNC password # 無論是左側還是右側,只要有 passwd 這個關鍵字,就列出來!這樣就很輕鬆的可以查詢到,passwd(1) 是指令,可以變更密碼, passwd(5) 則是檔案,意思是密碼檔。
[student@station10-101 ~]$ man passwd PASSWD(1) User utilities PASSWD(1) NAME passwd - update user's authentication tokens SYNOPSIS passwd [-k] [-l] [-u [-f]] [-d] [-e] [-n mindays] [-x maxdays] [-w warndays] [-i inactivedays] [-S] [--stdin] [username] DESCRIPTION The passwd utility is used to update user's authentication token(s). ......前面幾行就告訴你,這是 (1) 的指令說明!如果想要知道 passwd(5) 的話,這樣做:
[student@station10-101 ~]$ man 5 passwd PASSWD(5) Linux Programmer's Manual PASSWD(5) NAME passwd - password file DESCRIPTION The /etc/passwd file is a text file that describes user login accounts for the system. It should have read permission allowed for all users (many utilities, like ls(1) use it to map user IDs to usernames), but write access only for the superuser. ......如此就可以查詢兩個相同檔名,但不同位置與功能的說明文件了!
從前幾小節的練習中,有時候我們會發現幾件事情:(1)指令輸出的資料量常常很大,一個螢幕裝不下,連使用[shift]+[pageup] 都沒有辦法全部看完; (2)在 man bc 時,找那個 pi= 的項目中,範例提到在文字界面下,可以透過某些方式不要進入 bc 去算 pi !
尤其是第 2 個項目,裡面就談到那個 | 的符號,這個符號我們稱作『管線 (pipe) 』! 它的目的是『將前一個指令輸出的資料,交由後面的指令來處理』的意思~我們來談談該指令的意義:
[student@localhost ~]$ echo "scale=10; 4*a(1)" | bc -l
如果你將上面的指令分成兩部份來看,第一部份先執行『echo "scale=10; 4*a(1)"』,就可以發現從螢幕上輸出『 scale=10; 4*a(1) 』的字樣,echo 這個指令很單純的將後續的資料當成文字訊息輸出到螢幕上。 這些資料之後被帶入到 bc 指令中,亦即直接在 bc 的環境中進行 scale=10; 4*a(1) 的運算之意。
有兩個指令很常使用於大量資料輸出時的片段展示,那就是 more 與 less。more 會一頁一頁翻動,但是無法向前回去查詢之前的畫面。 至於 less 就是 man page 的操作環境。
除了使用 | less 的功能加上斜線 (/) 找到關鍵字的方法之外,我們也可以透過 grep 來取得關鍵字! 以上頭的例題來看,如果要使用 ll /etc/ 找出 passwd 的關鍵字『那一行』的話,可以簡單的這樣做:
[student@localhost ~]$ ll /etc/ | grep 'passwd'
在 Linux 的系統下,總是會需要用到檔案管理的情況發生,包括建立目錄與檔案、複製與移動檔案、刪除檔案與目錄等等。 另外,讀者也應該要知道在 Linux 的系統下,那些目錄是正規系統會存在的,以及該目錄又應該要放置哪些資料等等。
所有的 Linux distribions 理論上都應該要遵循當初 Linux 開發時所規範的各項標準,其中之一就是檔案系統的階層標準 (Filesystem Hierarchy Standard, FHS)。基本上 FHS 只是一個基本建議值,詳細的資料還是保有讓各個 distribution 自由設計的權力! 無論如何,FHS 還是規範了根目錄與 /usr, /var 這三個目錄內應該要放置的資料就是了。
另外,根據檔案是否經常變動,以及檔案運作的情況,大致上有幾個比較重要的目錄分類:
CentOS 7 以後 (包含 CentOS 8) 的系統目錄規範跟以前的版本差異挺大的,詳細的資料還請參考相關文件,底下僅就個別目錄中應該要放置的資料做個基本的解釋。 請自行『 ll / 』對照下表的相關目錄說明。
目錄名稱 | 應放置檔案內容(一定要知道的內容) |
/bin /sbin |
/bin 主要放置一般用戶可操作的指令 /sbin 主要放置系統管理員可操作的指令 這兩個資料目前都是連結檔,分別連結到 /usr/bin, /usr/sbin 當中 |
/boot | 與開機有關的檔案,包括核心檔案 / 開機管理程式與設定檔 |
/dev | 是 device 的縮寫,放置裝置檔,包括硬碟檔、鍵盤滑鼠終端機檔案等 |
/etc | 一堆系統設定檔,包括帳號、密碼與各式服務軟體的設定檔大多在此目錄內 |
/home /root |
/home 是一般帳號的家目錄預設放置位置 /root 則是系統管理員的家目錄了! |
/lib /lib64 |
系統函式庫與核心函式庫,其中 /lib 包含核心驅動程式,而其他軟體的函式庫若為 64 位元,則使用 /lib64 目錄內的函式庫檔案。 這兩個目錄目前也都是連結到 /usr/lib, /usr/lib64 內。 |
/proc | 將記憶體內的資料做成檔案類型,放置於這個目錄下,連同某些核心參數也能手動調整 |
/sys | 跟 /proc 類似,只是比較針對硬體相關的參數方面。 |
/usr | 是 usr 不是 user 喔!是 unix software resource 的縮寫,與 Unix 程式有關。從 CentOS 7 開始, 系統相關的所有軟體、服務等,均放置在這個目錄中了!因此不能與根目錄分離。 |
/var | 是一些變動資料,系統運作過程中的服務資料、暫存資料、登錄資料等等。 |
/tmp | 一些使用者操作過程中會啟用的暫存檔,例如 X 軟體相關的資料等等。 |
Linux 是由工程師開發的,許多的目錄也沿用 Unix 的規範,Unix 也是工程師開發的,所以許多的目錄命名通常就與該目錄要放置的資料有點相關性。 例如 bin, sbin 就類似 binary, system binary (二進位程式、系統管理二進位程式) 來結合這樣~
目錄名稱 | 應放置檔案內容(以後用到就知道了) |
/media /mnt |
/media 主要是系統上臨時掛載使用的裝置(如隨插即用 USB)之慣用目錄 /mnt 主要是使用者或管理員自行暫時手動掛載的目錄 |
/opt | /opt 是 optional 的意思,通常是第三方協力廠商所開發的軟體放置處 |
/run | 系統進行服務軟體運作管理的功能,CentOS 7以後,這個目錄也放在記憶體當中了! |
/srv | 通常是給各類服務 (service) 放置資料使用的目錄 |
另外,在 Linux 環境下,所有的目錄都是根目錄 (/) 衍生出來的,從根目錄開始撰寫的檔名也就被稱為『絕對路徑』。 而磁碟規劃方面,若需要了解磁碟與目錄樹的搭配,可以使用 df (display filesystem) 的軟體來查閱:
[student@localhost ~]$ df
檔案系統 1K-區段 已用 可用 已用% 掛載點
devtmpfs 918108 0 918108 0% /dev
tmpfs 936140 0 936140 0% /dev/shm
tmpfs 936140 9388 926752 2% /run
tmpfs 936140 0 936140 0% /sys/fs/cgroup
/dev/mapper/centos-root 10475520 4359596 6115924 42% /
/dev/vda2 1998672 149448 1727984 8% /boot
/dev/mapper/centos-home 3135488 70240 3065248 3% /home
tmpfs 187228 16 187212 1% /run/user/42
tmpfs 187228 4 187224 1% /run/user/0
tmpfs 187228 4 187224 1% /run/user/1000
上表中最左側為檔案系統,最右側則是掛載點。掛載點有點類似 windows 系統的 C:, D:, E: 等磁碟槽的意思。 在 Linux 底下所有的檔案都是從目錄樹分出來,因此檔案系統也需要跟目錄結合在一起。以上表來說,『當你進入 /boot 這個目錄時, 就可以看到 /dev/vda2 這個裝置的內容』之意。
此外,系統也已經將記憶體模擬成檔案系統,提供使用者將暫存資料放置於高速的記憶體內。只是這些資料在關機後就會消失。 這些目錄包括很重要的 /dev/shm (上表)。
預設的情況下,使用者取得 shell 的環境時,通常就是在自己的『家目錄』,例如 windows 檔案總管打開後, 出現在畫面中的,通常是『我的文件夾』之類的環境。若要變更『工作目錄』,例如變更工作目錄到 /var/spool/mail 去,可以這樣做:
[student@localhost ~]$ ls Desktop Downloads Music Public text1.txt Documents group Pictures Templates Videos [student@localhost ~]$ cd /var/spool/mail [student@localhost mail]$ ls rpc student
如上所示,一開始讀者會在 student 家目錄下,因此單純使用 ls 時,會列出工作目錄 (家目錄) 底下的資料,亦即是一堆家目錄應該會存在的目錄名稱。 而當讀者操作『 cd /var/spool/mail 』之後,工作目錄會變成該目錄,所以提示字元裡面也將 ~ 變成了 mail 了。因此使用 ls 所列出的工作目錄下的資料, 就會有不一樣的檔名出現。讀者在操作指令時,要特別注意『工作目錄』才行。而列出目前工作目錄的方法為使用 pwd:
[student@localhost mail]$ pwd
/var/spool/mail
[student@localhost mail]$
讀者操作系統時,不要只看提示字元下的檔名,最好能夠查閱實際的目錄較佳。如下案例:
[student@localhost mail]$ cd /etc [student@localhost etc]$ pwd /etc [student@localhost etc]$ cd /usr/local/etc [student@localhost etc]$ pwd /usr/local/etc [student@localhost etc]$
操作者可發現,自從進到 /etc 之後,提示字元內的目錄位置一直是『 etc 』,然而使用 pwd 就能夠發現兩者的差異。 這在系統管理時非常的重要,若去錯目錄,會導致檔案修訂的錯誤!
除了根目錄與家目錄之外,Linux 上有一些比較特別的目錄需要記憶:
目錄名稱 | 目錄意義 |
/ | 根目錄,從根目錄寫起的檔名只會存在一個 |
~ | 使用者的家目錄,不同用戶的家目錄均不相同 |
. | 一個小數點,代表的是『本目錄』,亦即目前的工作目錄之意 |
.. | 兩個小數點,代表的是『上一層目錄』 |
- | 一個減號,代表『上一次的工作目錄』之意 |
操作者應該要注意,根據檔名寫法的不同,也可將所謂的路徑(path)定義為絕對路徑(absolute)與相對路徑(relative)。 這兩種檔名/路徑的寫法依據是這樣的:
由本章的說明,讀者可以清楚 /etc 與 /boot 為兩個相當重要的目錄,其中 /etc 更是需要備份的所在。 若讀者使用 student 的身份來暫時進行檔案管理行為時,例如將 /etc 完整備份時,可以如何進行?
[student@localhost ~]$ cd /dev/shm [student@localhost shm]$ pwd /dev/shm
[student@localhost shm]$ mkdir backup [student@localhost shm]$ ll 總計 0 drwxrwxr-x. 2 student student 40 3月 4 13:14 backup
[student@localhost shm]$ cd backup [student@localhost backup]$ pwd /dev/shm/backup
[student@localhost backup]$ cp --help 用法:cp [選項]... [-T] 來源 目的地 或:cp [選項]... 來源... 目錄 <==這個是最常用的指令串! 或:cp [選項]... -t 目錄 來源... Copy SOURCE to DEST, or multiple SOURCE(s) to DIRECTORY. Mandatory arguments to long options are mandatory for short options too. -a, --archive same as -dR --preserve=all <==嘗試完整保留權限 --attributes-only don't copy the file data, just the attributes --backup[=CONTROL] make a backup of each existing destination file ...... -R, -r, --recursive copy directories recursively <==複製目錄 ...... # 開始嘗試將 /etc 檔名複製到本目錄 (.) 底下 [student@localhost backup]$ cp /etc . cp: -r not specified; omitting directory '/etc'因為 cp 會自動忽略目錄的複製,因此需要如下的指令來複製目錄才行
# 剛剛 cp --help 有看到 -r 可以複製目錄,因此加上這個選項功能來處理目錄複製: [student@localhost backup]$ cp -r /etc . cp: 無法開啟 ‘/etc/crypttab’ 來讀取資料: 拒絕不符權限的操作 cp: 無法存取 ‘/etc/pki/CA/private’: 拒絕不符權限的操作 cp: 無法存取 ‘/etc/pki/rsyslog’: 拒絕不符權限的操作 ....... [student@localhost backup]$ ll 總計 0 drwxr-xr-x. 135 student student 5020 3月 4 13:21 etc因為系統很多保密的檔案是不許被一般用戶所讀取的,因此 student 許多檔案無法順利複製也是正確的!操作者無須擔心。
[student@localhost backup]$ cp -r /etc . 2> /dev/null [student@localhost backup]$ ll -d /etc ./etc drwxr-xr-x. 135 student student 5020 3月 4 13:22 ./etc drwxr-xr-x. 135 root root 8192 3月 3 17:54 /etc
透過上面的練習,最終我們知道其實 student 身份複製的 /dev/shm/backup/etc 是沒有完整的備份的!因為兩者的容量大小、 內容檔案、權限都不相同之故。至於相關的指令功能、選項功能等等,請自由 man cp、 man mkdir 來預先了解。
另外,在一些錯誤訊息要丟棄的環境中,也可以在指令的最後面加上 2> /dev/null 來將錯誤的資料導向垃圾桶 (/dev/null)。
作業硬碟一般操作說明:
作業當中,某些部份可能為簡答題~若為簡答題時,請將答案寫入 /home/student/ans.txt 當中,並寫好正確題號,方便老師訂正答案。 請注意,檔名寫錯將無法上傳!
作業結果傳輸:請以 root 的身分執行 vbird_book_check_unit 指令上傳作業結果。 正常執行完畢的結果應會出現【XXXXXX_aa:bb:cc:dd:ee:ff_unitNN】字樣。若需要查閱自己上傳資料的時間, 請在作業系統上面使用瀏覽器查詢: http://192.168.251.254 檢查相對應的課程檔案。 相關流程請參考: vbird_book_check_unit