【7.1】目錄與路徑
【7.1.2】目錄相關操作
1)特殊目錄列表:
(1)
2)目錄操作命令,底下我們就來談一談幾個常見的處理目錄的命令吧:
cd:變換目錄
pwd:顯示目前的目錄
mkdir:建立一個新的目錄
rmdir:刪除一個空的目錄
【荔枝】pwd 顯示目前的目錄 == print working directory
pwd [-P] 顯示當前路徑,而非使用串連link路徑;
(2)
因為 /var/mail 是連結檔,連結到 /var/spool/mail
# 所以,加上 pwd -P 的選項後,會不以連結檔的資料顯示,而是顯示正確的完整路徑啊。
【荔枝】mkdir [mp] 目錄名稱
-m :設定檔的許可權喔。直接配置,不需要看預設許可權 (umask) 的臉色~
-p :協助你直接將所需要的目錄(包含上一級目錄)遞迴建立起來。
(3)
(4)
【荔枝】rmdir [-p] 目錄名稱, 刪除目錄
-p 連同上層的空目錄一起刪除;
(5)
rmdir 僅能刪除空的目錄;
【7.1.3】關於執行檔案路徑的變數: $PATH
1)列印$PATH 變數
(6)
2)一般身份使用者無法使用 ifconfig eth0;但使用 /sbin/ifconfig eth0 可以執行;
3)把 ls 移動到 /root 目錄下,ls 無法執行了,因為ls檔案不在 $PATH 路徑下: ls是 root目錄下的可執行檔;故 /root/ls 可以執行;
(7)
如果想要 root 目錄下ls可以執行, 那就將 /root 目錄加入到 PATH 中;
PATH="$PATH":/root
(8)
【總結】
不同身份使用者預設的PATH不同,預設能夠隨意啟動並執行命令也不同(如root與vbird);
PATH是可以修改的,所以一般使用者還是可以透過修改PATH來運行某些位於/sbin或/usr/sbin下的命令來查詢;
使用絕對路徑或相對路徑直接指定某個命令的檔名來運行,會比搜尋PATH來的正確;
命令應該要放置到正確的目錄下,運行才會比較方便;
本目錄(.)最好不要放到PATH當中。
【7.2】檔案與目錄管理
【7.2.1】查看檔案與目錄: ls
(9)
【荔枝1】將主資料夾下的所有檔案列出來
(10)
【荔枝2】承上題,不顯示顏色,但在檔名末顯示出該檔名代表的類型(type)
(11)
【荔枝3】完整的呈現檔案的修改時間 *(modification time)
(12)
【7.2.2】複製,刪除與移動: cp, rm , mv
【荔枝1】cp-複製檔案或目錄
(13)
1)-i: 若目標檔(destination)已經存在時,在覆蓋時會先詢問動作的進行(常用)
(14)
2)-a:相當於 -pdr 的意思,至於 pdr 請參考下列說明;(常用) 把檔案的整個屬性複製過來;
(15)
(16)
3)複製 /etc/ 目錄下的所有內容到 /tmp 下面
(17)
4)利用cp 建立一個符號連結檔案和永久連結檔案
(18)
補充1)符號連結 == 捷徑;
補充2)永久連結和軟連結:(https://blog.csdn.net/qq_32907349/article/details/51510593)
永久連結:若一個 inode 號對應多個檔案名稱,則稱這些檔案為永久連結。換言之,永久連結就是同一個檔案使用了多個別名(見 圖 2.hard link 就是 file 的一個別名,他們有共同的 inode)。永久連結可由命令 link 或 ln 建立。
軟串連:若檔案使用者資料區塊中存放的內容是另一檔案的路徑名的指向,則該檔案就是軟串連。軟連結就是一個普通檔案,只是資料區塊內容有點特殊。軟連結有著自己的 inode 號以及使用者資料區塊
5)若~/.bashrc 比 /tmp/bashrc 新才複製過來;(cp -u 參數 常用於備份)
(19)
6)-d 若來源檔為連結檔的屬性(link file),則複製連結檔屬性而非檔案本身;
(20)
cp複製的是源檔案,而非連結檔案的屬性;-d參數可以複製連結檔案的屬性;
7)將多個檔案複製到一個目錄下
(21)
8)-a :相當於 -pdr 的意思,至於 pdr 請參考下列說明;(常用)
-a可以複製完整許可權;
(22)
【cp複製指令總結】在複製時,你必須要清楚的瞭解到:
是否需要完整的保留來源檔案的資訊。
來源檔案是否為連結檔 (symbolic link file)。
來源檔是否為特殊的檔案,例如 FIFO, socket 等。
來源檔是否為目錄。
【荔枝2】rm-移除檔案或目錄
(23)
1)-i 詢問是否刪除:
(24)
2)-r刪除目錄, rmdir僅能刪除空目錄(沒有檔案的目錄)
(25)
(26)
3)\rm 可以忽略掉 alias的指定參數;在命令前加上反斜線,可以忽略掉 alias 的指定選項喔。
(27)
4)刪除一個帶有 - 開頭的檔案
【荔枝3】mv-移動檔案(1804022214)
(28)
(29)
【荔枝】通過 rename來變更檔名
經實驗,rename根本就不起任何作用;
【7.2.3】取得路徑的檔案名稱與目錄名稱
(30)
(31)
【7.3】檔案內容查閱
1)檔案內容查閱命令列表:
cat:由第一行開始顯示檔案內容;
tac:從最後一行開始顯示,可以看出 tac 是 cat 的倒著寫;
nl:顯示的時候,順道輸出行號;
more:一頁一頁的顯示檔案內容;
less 與 more 類似:但是比 more 更好的是,他可以往前翻頁;
head:只看頭幾行;
tail:只看尾巴幾行;
od:以二進位的方式讀取檔案內容;
【7.3.1】直接查看檔案內容
1)直接查閱一個檔案的內容可以使用 cat/tac/nl 這幾個命令啊。
(32)
(33)
【荔枝】cat -A :可列出一些特殊字元而不是空白而已;
(34)
補充1)如果加上 -n 或 -b的話,每一行前面還會加上行號;
補充2)鳥哥很少用cat:畢竟當檔案內容行數超過40行時,螢幕根本無法顯示完全;
【荔枝】tac:反向顯示
(35)
【荔枝】nl:添加行號列印
(36)
(37)
【7.3.2】可翻頁查看
1)nl, cat, tac 都是一次性列印出常值內容;
2)翻頁查看:more 或 less
3)more命令:一頁一頁翻動(空白鍵)或一行一行翻動(斷行符號)
空白鍵 (space):代表向下翻一頁;
Enter :代表向下翻『一行』;
/字串 :代表在這個顯示的內容當中,向下搜尋『字串』這個關鍵字;
:f :立刻顯示出檔名以及目前顯示的行數;
q :代表立刻離開 more ,不再顯示該檔案內容。
b 或 [ctrl]-b :代表往回翻頁,不過這動作只對檔案有用,對管線無用。
(38)
補充)/輸入查詢的字元;重複查詢同一個字串,可以直接按 n 即可;
【荔枝】less(一頁一頁翻動,可前向(空白鍵或pagedown鍵)也可後向翻頁(pageup鍵))
空白鍵 :向下翻動一頁;
[pagedown]:向下翻動一頁;
[pageup] :向上翻動一頁;
/字串 :向下搜尋『字串』的功能;
?字串 :向上搜尋『字串』的功能;
n :重複前一個搜尋 (與 / 或 ? 有關。)
N :反向的重複前一個搜尋 (與 / 或 ? 有關。)
q :離開 less 這個程式;
(39)
【7.3.3】資料選取
1)head:取出前面幾行;
選項與參數:
-n :後面接數字,代表顯示幾行的意思
(40)
(41)
補充) head -n 負數:不顯示後面的負數行;如 head -n -100 不顯示第100行到最後的內容;
(42)
2)tail:取出後面幾行;
(43)
(44)
補充)-n +正整數 檔案名稱: 列出正整數之後的資料行;tail -n +100 /etc/man.config 列出100行以後的資料;
(45)
【補充】tail -f /var/log/messages: 持續監測 /var/log/messages 的內容;直到輸入 ctrl + c 之後才會離開 tail這個命令的執行;
(46)
補充1)當下達『tail -n +100 /etc/man.config』 代表該檔案從100行以後都會被列出來,同樣的,在man.config共有141行,因此第100~141行就會被列出來啦。 前面的99行都不會被顯示出來喔。 補充2) 至於範例二中,由於/var/log/messages隨時會有資料寫入,你想要讓該檔案有資料寫入時就立刻顯示到螢幕上, 就利用 -f 這個選項,他可以一直偵測/var/log/messages這個檔案,新加入的資料都會被顯示到螢幕上。 直到你按下[crtl]-c才會離開tail的偵測喔。 補充3)例題:
假如我想要顯示 /etc/man.config 的第 11 到第 20 行呢。
答:這個應該不算難,想一想,在第 11 到第 20 行,那麼我取前 20 行,再取後十行,所以結果就是:『 head -n 20 /etc/man.config | tail -n 10 』,這樣就可以得到第 11 到第 20 行之間的內容了。 但是裡面涉及到管線命令,需要在第三篇的時候才講的到。
(47)
【7.3.4】純文字檔案:od 查看二進位檔案
(48)
荔枝1)將/usr/bin/passwd的內容使用ASCII方式來展現。
(49)
荔枝2)將/etc/issue這個檔案的內容以8進位列出儲存值與ASCII的對照表
(50)
【7.3.5】修改檔案時間或建立新檔案:touch
1)每個檔案在linux底下都會記錄許多的時間參數, 其實是有三個主要的變動時間,那麼三個時間的意義是什麼呢。
modification time (mtime):當該檔案的『內容資料』變更時,就會升級這個時間。內容資料指的是檔案的內容,而不是檔案的屬性或許可權喔。 status time (ctime):當該檔案的『狀態 (status)』改變時,就會升級這個時間,舉例來說,像是許可權與屬性被更改了,都會升級這個時間啊。 access time (atime):當『該檔案的內容被取用』時,就會升級這個讀取時間 (access)。舉例來說,我們使用 cat 去讀取 /etc/man.config , 就會升級該檔案的 atime 了。
(51)
【荔枝】touch參數列表
(52)
選項與參數:
-a :僅修訂 access time; -c :僅修改檔案的時間,若該檔案不存在則不建立新檔案; -d :後面可以接欲修訂的日期而不用目前的日期,也可以使用 --date="日期或時間" -m :僅修改 mtime ; -t :後面可以接欲修訂的時間而不用目前的時間,格式為[YYMMDDhhmm] 荔枝1)建立一個空的檔案並觀察時間
(53)
荔枝2)將 ~/.bashrc 複製成為 bashrc,假設複製完全的屬性,檢查其日期
(54)
補充1)ll == ls -l ;其中 ll 是 ls -l 的命令別名;
補充2)分號; : 代表連續命令的下達啦。你可以在一行命令當中寫入多重命令, 這些命令可以『依序』運行。
補充3)至於啟動並執行結果當中,我們可以探索資料的內容與屬性是被複製過來的,因此檔案內容時間(mtime)與原本檔案相同。 但是由於這個檔案是剛剛被建立的,因此狀態(ctime)與讀取時間就便呈現在的時間啦。 那如果你想要變更這個檔案的時間呢。可以這樣做:
【荔枝】修改檔案的時間;
(55)
補充)atime mtime 改變了, 但ctime沒有改變;
【荔枝2】將bashrc的日期改為 2017/09/15 0202 如下:
(56)
補充)日期在 atime 與 mtime 都改變了,但是 ctime 則是記錄目前的時間。
【總結1】touch命令總結:
透過 touch 這個命令,我們可以輕易的修訂檔案的日期與時間。並且也可以建立一個空的檔案喔。 不過,要注意的是,即使我們複製一個檔案時,複製所有的屬性,但也沒有辦法複製 ctime 這個屬性的。 ctime 可以記錄這個檔案最近的狀態 (status)(即屬性和許可權) 被改變的時間。無論如何,還是要告知大家, 我們平時看的檔案屬性中,比較重要的還是屬於那個 mtime 啊。我們關心的常常是這個檔案的『內容』 是什麼時候被更動的說~了乎。
【總結2】touch 這個命令最常被使用的情況是:
建立一個空的檔案;
將某個檔案日期修訂為目前 (mtime 與 atime)
【7.4】檔案與目錄的預設許可權與隱藏許可權
1)設定檔的隱藏屬性:除了基本r, w, x許可權外,在Linux的Ext2/Ext3檔案系統下,我們還可以配置其他的系統隱藏屬性, 這部份可使用 chattr 來配置,而以 lsattr 來查看,最重要的屬性就是可以配置其不可修改的特性。
例題1)root 雖然可以將這個檔案複製給 dmtsai,不過這個檔案在 dmtsai 的家目錄中卻可能讓 dmtsai 沒有辦法讀寫(因為該檔案屬於 root 的嘛。而 dmtsai 又不能使用 chown 之故)。 此外,我們又擔心覆蓋掉 dmtsai 自己的 .bashrc 配置檔,因此,我們可以進行如下的動作喔:
複製檔案: cp ~/.bashrc ~dmtsai/bashrc
修改屬性: chown dmtsai:users ~dmtsai/bashrc
例題2)因為除了 dmtsai 之外,其他人不能修改該目錄下的檔案,所以整個目錄的許可權應該是 drwxr-xr-x 才對。 因此你應該這樣做:
建立目錄: mkdir /tmp/chapter7_1
修改屬性: chown -R dmtsai:users /tmp/chapter7_1
修改許可權: chmod -R 755 /tmp/chapter7_1
【7.4.1】檔案預設許可權:umask
1)umask 就是:指定 『目前使用者在建立檔案或目錄時候的許可權預設值』, 那麼如何得知或配置 umask 呢。他的指定條件以底下的方式來指定:
2)umask表示的是:該預設值需要減掉的許可權;(乾貨——umask)
(57)
-S == Symbolic(符號的)
補充1)怎麼 umask 會有四組數字啊。不是只有三組嗎。是沒錯啦。第一組是特殊許可權用的,我們先不要理他,所以先看後面三組即可。
補充2)預設的情況如下:
若使用者建立為『檔案』則預設『沒有可運行( x )許可權』,亦即只有 rw 這兩個項目,也就是最大為 666 分,預設許可權如下: -rw-rw-rw-;又由於需要減去的許可權umask=0022 == 022 == ----w--w- ,所以建立檔案最後得到的許可權是 -rw-r--r-- ;如上例所示;
若使用者建立為『目錄』,則由於 x 與是否可以進入此目錄有關,因此預設為所有許可權均開放,亦即為 777 分,預設許可權如下:drwxrwxrwx;又由於需要減去的許可權umask=0022 == 022 == ----w--w- ,所以建立檔案最後得到的許可權是 drwxr-xr-x ;如上例所示;
總結如下)
建立檔案時:(-rw-rw-rw-) - (-----w--w-) ==> -rw-r--r--
建立目錄時:(drwxrwxrwx) - (d----w--w-) ==> drwxr-xr-x
3)如何設定umask。直接在 umask 後面輸入 002 就好了。
(58)
例題)假設你的 umask 為 003 ,請問該 umask 情況下,建立的檔案與目錄許可權為。
答:
umask 為 003 ,所以拿掉的許可權為 --------wx,因此:
檔案: (-rw-rw-rw-) - (--------wx) = -rw-rw-r--
目錄: (drwxrwxrwx) - (--------wx) = drwxrwxr--
umask總結)在預設的情況中, root 的 umask 會拿掉比較多的屬性,root 的 umask 預設是 022 , 這是基於安全的考量啦~至於一般身份使用者,通常他們的 umask 為 002 ,亦即保留同群組的寫入權力。
【7.4.2】檔案隱藏屬性 chattr lsattr
1)不過要先強調的是:底下的chattr命令只能在Ext2/Ext3的檔案系統上面生效, 其他的檔案系統可能就無法支援這個命令了。
2)底下我們就來談一談如何配置與檢查這些隱藏的屬性吧。
(59)
補充)注意:屬性配置常見的是 a 與 i 的配置值,而且很多配置值必須要身為 root 才能配置;
a :當配置 a 之後,這個檔案將只能添加資料,而不能刪除也不能修改資料,只有root
才能配置這個屬性。
i :這個 i 可就很厲害了。他可以讓一個檔案『不能被刪除、改名、配置連結也無法
寫入或新增資料。』對於系統安全性有相當大的助益。只有 root 能配置此屬性;
(60)
3)lsattr (顯示檔案隱藏屬性)
(61)
(62)
【7.4.3】檔案特殊許可權:SUID, SGID, SBIT
【荔枝】看看 那個 /usr/bin/passwd 的隱藏許可權, 如下:
(63)
怎麼會是 -rwsr-xr-x; s 表示什麼。
1)Set UID == SUID(針對檔案的許可權)
當 s 這個標誌出現在檔案擁有者的 x 許可權上時,例如剛剛提到的 /usr/bin/passwd 這個檔案的許可權狀態:『-rwsr-xr-x』,此時就被稱為 Set UID,簡稱為 SUID 的特殊許可權。 1.1)那麼SUID的許可權對於一個檔案的特殊功能是什麼呢。基本上SUID有這樣的限制與功能:
● SUID 許可權僅對二進位程式(binary program)有效;
● 運行者對於該程式需要具有 x 的可運行許可權;
● 本許可權僅在運行該程式的過程中有效 (run-time);
● 運行者將具有該程式擁有者 (owner) 的許可權。
1.2)SUID荔枝(非常重要的荔枝):我們的 Linux 系統中,所有帳號的密碼都記錄在 /etc/shadow 這個檔案裡面,這個檔案的許可權為:『-r-------- 1 root root』,意思是這個檔案僅有root可讀且僅有root可以強制寫入而已。 既然這個檔案僅有 root 可以修改,那麼鳥哥的 vbird 這個一般帳號使用者能否自行修改自己的密碼呢。 你可以使用你自己的帳號輸入『passwd』這個命令來看看,嘿嘿。一般使用者當然可以修改自己的密碼了。
1.3)藉由上述的功能說明,我們可以知道:
● vbird 對於 /usr/bin/passwd 這個程式來說是具有 x 許可權的,表示 vbird 能運行 passwd;
● passwd 的擁有者是 root 這個帳號;
● vbird 運行 passwd 的過程中,會『暫時』獲得 root 的許可權;
● /etc/shadow 就可以被 vbird 所啟動並執行 passwd 所修改。
【注意】SUID 僅可用在binary program 上, 不能夠用在 shell script 上面。SUID許可權對於目錄也是無效的;
2)Set GID == SGID許可權(針對目錄和檔案的許可權)
2.0)當 s 標誌在檔案擁有者的 x 項目為 SUID,那 s 在群組的 x 時則稱為 Set GID, SGID 羅。是這樣沒錯。^_^。 舉例來說,你可以用底下的命令來觀察到具有 SGID 許可權的檔案喔:
(64)
2.1)如果是對檔案來說, SGID 有如下的功能:
● SGID 對二進位程式有用;
● 程式運行者對於該程式來說,需具備 x 的許可權;
● 運行者在啟動並執行過程中將會獲得該程式群組的支援。
【荔枝】舉例來說,你可以用底下的命令來觀察到具有 SGID 許可權的檔案喔:
(65)
2.2)當一個目錄配置了 SGID 的許可權後,他將具有如下的功能:
● 使用者若對於此目錄具有 r 與 x 的許可權時,該使用者能夠進入此目錄;
● 使用者在此目錄下的有效群組(effective group)將會變成該目錄的群組;
● 用途:若使用者在此目錄下具有 w 的許可權(可以建立檔案),則使用者所建立的新檔案,該新檔案的群組與此目錄的群組相同。
3)Sticky Bit: 這個 Sticky Bit, SBIT 目前只針對目錄有效,對於檔案已經沒有效果了。 SBIT 對於目錄的作用是:
● 當使用者對於此目錄具有 w, x 許可權,亦即具有寫入的許可權時;
● 當使用者在該目錄下建立檔案或目錄時,僅有自己與 root 才有權力刪除該檔案;
4)換句話說:當甲這個使用者於 A 目錄是具有群組或其他人的身份,並且擁有該目錄 w 的許可權, 這表示『甲使用者對該目錄內任何人建立的目錄或檔案均可進行 "刪除/更名/搬移" 等動作。』 不過,如果將 A 目錄加上了 SBIT 的許可權項目時, 則甲只能夠針對自己建立的檔案或目錄進行刪除/更名/移動等動作,而無法刪除他人的檔案。
【荔枝】舉例來說,我們的 /tmp 本身的許可權是『drwxrwxrwt』, 在這樣的許可權內容下,任何人都可以在 /tmp 內新增、修改檔案,但僅有該檔案/目錄建立者與 root 能夠刪除自己的目錄或檔案。這個特性也是挺重要的啊。你可以這樣做個簡單的測試:
● 以 root 登陸系統,並且進入 /tmp 當中;
● touch test,並且更改 test 許可權成為 777 ;
● 以一般使用者登陸,並進入 /tmp;
● 嘗試刪除 test 這個檔案。
5)SUID/SGID/SBIT 許可權配置:如何設定檔使成為具有 SUID 與 SGID 的許可權呢。
那麼如果在這三個數字之前再加上一個數位話,最前面的那個數字就代表這幾個許可權了。
4 為 SUID
2 為 SGID
1 為 SBIT
【荔枝】 假設要將一個檔案許可權改為『-rwsr-xr-x』時,由於 s 在使用者許可權中,所以是 SUID ,因此, 在原先的 755 之前還要加上 4 ,也就是:『 chmod 4755 filename 』來配置。此外,還有大 S 與大 T 的產生喔。參考底下的範例啦。
注意:你必須瞭解 SUID 不是用在目錄上,而 SBIT 不是用在檔案上的喔。
【荔枝】SUID SGID許可權操作
(66)
補充1)chmod 7666 test; ls -l test : user, group 以及 others 都沒有 x 這個可啟動並執行標誌( 因為 666 嘛 ),所以,這個 S, T 代表的就是『空的』啦。怎麼說。 SUID 是表示『該檔案在啟動並執行時候,具有檔案擁有者的許可權』,但是檔案 擁有者都無法運行了,哪裡來的許可權給其他人使用。當然就是空的啦。 ^_^
補充2)s 和 t 許可權 是基於 x 許可權的;如果檔案的 user, group 或 others 沒有x許可權,則其對應的s和t許可權是空的,即大S 或 大T;
6)以透過符號法來處理喔。其中 SUID 為 u+s ,而 SGID 為 g+s ,SBIT 則是 o+t 羅。來看看如下的範例:
(67)
(68)
【7.4.4】查看檔案類型:file
1)如果你想要知道某個檔案的基本資料,例如是屬於 ASCII 或者是 data 檔案,或者是 binary , 且其中有沒有使用到動態函式庫 (share library) 等等的資訊,就可以利用 file 這個命令來檢閱喔。
(69)
【7.5】命令與檔案的查詢
【7.5.1】指令檔名的查詢
1)命令的完整檔案名稱放置在哪裡。 通過 which 或 type來尋找;
2)which:尋找執行檔案;
(70)
【荔枝】如下: