【BASH】回顧與知識點梳理 十五
- 十五. 指令與文件的搜尋
- 15.1 腳本文件名的搜尋
- which (尋找『執行檔』)
- 15.2 文件檔名的搜尋
- whereis (由一些特定的目錄中尋找文件文件名)
- locate / updatedb
- find
- 與時間有關的選項
- 與使用者或組名有關的參數
- 與文件權限及名稱有關的參數
- 額外可進行的動作
- 15.3 權限與指令間的關系
- 讓用戶能進入某目錄成為『可工作目錄』的基本權限為何?
- 用戶在某個目錄內讀取一個文件的基本權限為何?
- 讓使用者可以修改一個文件的基本權限為何?
- 讓一個使用者可以建立一個文件的基本權限為何?
- 讓用戶進入某目錄并執行該目錄下的某個指令之基本權限為何?
該系列目錄 --> 【BASH】回顧與知識點梳理(目錄)
十五. 指令與文件的搜尋
文件的搜尋可就厲害了!因為我們常常需要知道那個文件放在哪里,才能夠對該文件進行一些修改或維護等動作。 有些時候某些軟件配置文件的文件名是不變的,但是各 distribution 放置的目錄則不同。 此時就得要利用一些搜尋指令將該配置文件的完整檔名捉出來,這樣才能修改嘛!您說是吧!
15.1 腳本文件名的搜尋
我們知道在終端機模式當中,連續輸入兩次[tab]按鍵就能夠知道用戶有多少指令可以下達。 那你知不知道這些指令的完整文件名放在哪里?舉例來說,ls 這個常用的指令放在哪里呢? 就透過 which 或 type 來找尋吧!
which (尋找『執行檔』)
[root@study ~]# which [-a] command
選項或參數:
-a :將所有由 PATH 目錄中可以找到的指令均列出,而不止第一個被找到的指令名稱
# 范例一:搜尋 ifconfig 這個指令的完整文件名
[root@study ~]# which ifconfig
/sbin/ifconfig# 范例二:用 which 去找出 which 的檔名為何?
[root@study ~]# which which
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'/bin/alias/usr/bin/which
# 竟然會有兩個 which ,其中一個是 alias 這玩意兒呢!那是啥?
# 那就是所謂的『命令別名』,意思是輸入 which 會等于后面接的那串指令啦!
# 更多的數據我們會在 bash 章節中再來談的!# 范例三:請找出 history 這個指令的完整文件名
[root@study ~]# which history
/usr/bin/which: no history in (/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin)
[root@study ~]# history --help
-bash: history: --: invalid option
history: usage: history [-c] [-d offset] [n] or history -anrw [filename] or history -ps arg
# 瞎密?怎么可能沒有 history ,我明明就能夠用 root 執行 history 的啊!
這個指令是根據『PATH』這個環境變量所規范的路徑,去搜尋『執行檔』的檔名~ 所以,重點是找出『執行檔』而已!且 which 后面接的是『完整檔名』喔!若加上 -a 選項,則可以列出所有的可以找到的同名執行文件,而非僅顯示第一個而已!
最后一個范例最有趣,怎么 history 這個常用的指令竟然找不到啊!為什么呢?這是因為 history 是『bash 內建的指令』啦! 但是 which 預設是找 PATH 內所規范的目錄,所以當然一定找不到的啊(有 bash 就有 history!)!那怎辦?沒關系!我們可以透過 type 這個指令喔!
15.2 文件檔名的搜尋
再來談一談怎么搜尋文件吧!在 Linux 底下也有相當優異的搜尋指令呦!通常 find 不很常用的!因為速度慢之外, 也很操硬盤!一般我們都是先使用 whereis 或者是 locate 來檢查,如果真的找不到了,才以 find 來搜尋呦! 為什么呢?因為 whereis 只找系統中某些特定目錄底下的文件而已,locate 則是利用數據庫來搜尋文件名,當然兩者就相當的快速, 并且沒有實際的搜尋硬盤內的文件系統狀態,比較省時間啦!
whereis (由一些特定的目錄中尋找文件文件名)
[root@study ~]# whereis [-bmsu] 文件或目錄名
選項與參數:
-l :可以列出 whereis 會去查詢的幾個主要目錄而已
-b :只找 binary 格式的文件
-m :只找在說明文件 manual 路徑下的文件
-s :只找 source 來源文件
-u :搜尋不在上述三個項目當中的其他特殊文件
# 范例一:請找出 ifconfig 這個檔名
[root@study ~]# whereis ifconfig
ifconfig: /sbin/ifconfig /usr/share/man/man8/ifconfig.8.gz# 范例二:只找出跟 passwd 有關的『說明文件』檔名(man page)
[root@study ~]# whereis passwd # 全部的檔名通通列出來!
passwd: /usr/bin/passwd /etc/passwd /usr/share/man/man1/passwd.1.gz
/usr/share/man/man5/passwd.5.gz
[root@study ~]# whereis -m passwd # 只有在 man 里面的檔名才抓出來!
passwd: /usr/share/man/man1/passwd.1.gz /usr/share/man/man5/passwd.5.gz
等一下我們會提到 find 這個搜尋指令, find 是很強大的搜尋指令,但時間花用的很大!(因為 find 是直接搜尋硬盤,為如果你的硬盤比較老舊的話,嘿嘿!有的等!) 這個時候 whereis 就相當的好用了!另外, whereis 可以加入選項來找尋相關的數據,例如,如果你是要找可執行文件 (binary) 那么加上-b
就可以啦! 如果不加任何選項的話,那么就將所有的數據列出來啰!
那么 whereis 到底是使用什么咚咚呢?為何搜尋的速度會比 find 快這么多? 其實那也沒有什么,只是因為 whereis 只找幾個特定的目錄而已~并沒有全系統去查詢之故。所以說,whereis 主要是針對 /bin /sbin 底下的執行檔, 以及 /usr/share/man 底下的 man page 文件,跟幾個比較特定的目錄來處理而已。所以速度當然快的多!不過,就有某些文件是你找不到的啦! 想要知道 whereis 到底查了多少目錄?可以使用 whereis -l
來確認一下即可!
locate / updatedb
# 安裝
yum install -y mlocate
updatedb
[root@study ~]# locate [-ir] keyword
選項與參數:
-i :忽略大小寫的差異;
-c :不輸出檔名,僅計算找到的文件數量
-l :僅輸出幾行的意思,例如輸出五行則是 -l 5
-S :輸出 locate 所使用的數據庫文件的相關信息,包括該數據庫紀錄的文件/目錄數量等
-r :后面可接正規表示法的顯示方式
# 范例一:找出系統中所有與 passwd 相關的檔名,且只列出 5 個
[root@study ~]# locate -l 5 passwd
/etc/passwd
/etc/passwd-
/etc/pam.d/passwd
/etc/security/opasswd
/usr/bin/gpasswd# 范例二:列出 locate 查詢所使用的數據庫文件之文件名與各數據數量
[root@study ~]# locate -S
Database /var/lib/mlocate/mlocate.db:8,086 directories # 總紀錄目錄數109,605 files # 總紀錄文件數5,190,295 bytes in file names2,349,150 bytes used to store database
這個 locate 的使用更簡單,直接在后面輸入『文件的部分名稱』后,就能夠得到結果。 舉上面的例子來說,我輸入 locate passwd ,那么在完整文件名 (包含路徑名稱) 當中,只要有 passwd 在其中,就會被顯示出來的!這也是個很方便好用的指令,如果你忘記某個文件的完整檔名時~~
但是,這個東西還是有使用上的限制呦!為什么呢?你會發現使用 locate 來尋找數據的時候特別的快, 這是因為 locate 尋找的數據是由『已建立的數據庫 /var/lib/mlocate/』 里面的數據所搜尋到的,所以不用直接在去硬盤當中存取數據,呵呵!當然是很快速啰!
那么有什么限制呢?就是因為他是經由數據庫來搜尋的,而數據庫的建立默認是在每天執行一次 (每個 distribution 都不同,CentOS 7.x 是每天更新數據庫一次!),所以當你新建立起來的文件, 卻還在數據庫更新之前搜尋該文件,那么 locate 會告訴你『找不到!』呵呵!因為必須要更新數據庫呀!
那能否手動更新數據庫哪?當然可以啊!更新 locate 數據庫的方法非常簡單,直接輸入『 updatedb
』就可以了! updatedb 指令會去讀取 /etc/updatedb.conf 這個配置文件的設定,然后再去硬盤里面進行搜尋文件名的動作, 最后就更新整個數據庫文件啰!因為 updatedb 會去搜尋硬盤,所以當你執行updatedb 時,可能會等待數分鐘的時間喔!
- updatedb:根據 /etc/updatedb.conf 的設定去搜尋系統硬盤內的文件名,并更新 /var/lib/mlocate 內的數據庫文件;
- locate:依據 /var/lib/mlocate 內的數據庫記載,找出用戶輸入的關鍵詞文件名。
find
與時間有關的選項
[root@study ~]# find [PATH] [option] [action]
選項與參數:
1. 與時間有關的選項:共有 -atime, -ctime 與 -mtime ,以 -mtime 說明-mtime n :n 為數字,意義為在 n 天之前的『一天之內』被更動過內容的文件;-mtime +n :列出在 n 天之前(不含 n 天本身)被更動過內容的文件檔名;-mtime -n :列出在 n 天之內(含 n 天本身)被更動過內容的文件檔名。-newer file :file 為一個存在的文件,列出比 file 還要新的文件檔名
# 范例一:將過去系統上面 24 小時內有更動過內容 (mtime) 的文件列出
[root@study ~]# find / -mtime 0
# 那個 0 是重點!0 代表目前的時間,所以,從現在開始到 24 小時前,
# 有變動過內容的文件都會被列出來!那如果是三天前的 24 小時內?
# find / -mtime 3 有變動過的文件都被列出的意思!# 范例二:尋找 /etc 底下的文件,如果文件日期比 /etc/passwd 新就列出
[root@study ~]# find /etc -newer /etc/passwd
# -newer 用在分辨兩個文件之間的新舊關系是很有用的!
時間參數真是挺有意思的!我們現在知道 atime, ctime 與 mtime 的意義,如果你想要找出一天內被更動過的文件名, 可以使用上述范例一的作法。但如果我想要找出『4 天內被更動過的文件檔名』呢?那可以使用『 find /var -mtime -4 』。那如果是『4 天前的那一天』就用『 find /var -mtime 4 』。有沒有加上『+, -』差別很大喔!我們可以用簡單的圖示來說明一下:
圖中最右邊為目前的時間,越往左邊則代表越早之前的時間軸啦。
- +4 代表大于等于 5 天前的檔名:ex>
find /var -mtime +4
- -4 代表小于等于 4 天內的文件檔名:ex>
find /var -mtime -4
- 4 則是代表 4-5 那一天的文件檔名:ex>
find /var -mtime 4
與使用者或組名有關的參數
選項與參數:
2. 與使用者或組名有關的參數:-uid n :n 為數字,這個數字是用戶的賬號 ID,亦即 UID ,這個 UID 是記錄在/etc/passwd 里面與賬號名稱對應的數字。-gid n :n 為數字,這個數字是組名的 ID,亦即 GID,這個 GID 記錄在/etc/group,相關的介紹我們會第四篇說明~-user name :name 為使用者賬號名稱喔!例如 dmtsai-group name:name 為組名喔,例如 users ;-nouser :尋找文件的擁有者不存在 /etc/passwd 的人!-nogroup :尋找文件的擁有群組不存在于 /etc/group 的文件! 當你自行安裝軟件時,很可能該軟件的屬性當中并沒有文件擁有者,這是可能的!在這個時候,就可以使用 -nouser 與 -nogroup 搜尋。
# 范例三:搜尋 /home 底下屬于 dmtsai 的文件
[root@study ~]# find /home -user dmtsai
# 這個東西也很有用的~當我們要找出任何一個用戶在系統當中的所有文件時,
# 就可以利用這個指令將屬于某個使用者的所有文件都找出來喔!# 范例四:搜尋系統中不屬于任何人的文件
[root@study ~]# find / -nouser
# 透過這個指令,可以輕易的就找出那些不太正常的文件。如果有找到不屬于系統任何人的文件時,
# 不要太緊張,那有時候是正常的~尤其是你曾經以原始碼自行編譯軟件時。
如果你想要找出某個用戶在系統底下建立了啥咚咚,使用上述的選項與參數,就能夠找出來啦! 至于那個 -nouser 或 -nogroup 的選項功能中,除了你自行由網絡上面下載文件時會發生之外, 如果你將系統里面某個賬號刪除了,但是該賬號已經在系統內建立很多文件時,就可能會發生無主孤魂的文件存在! 此時你就得使用這個 -nouser 來找出該類型的文件啰!
與文件權限及名稱有關的參數
選項與參數:
3. 與文件權限及名稱有關的參數:-name filename:搜尋文件名為 filename 的文件;-size [+-]SIZE:搜尋比 SIZE 還要大(+)或小(-)的文件。這個 SIZE 的規格有:c: 代表 byte, k: 代表 1024bytes。所以,要找比 50KB還要大的文件,就是『 -size +50k 』-type TYPE :搜尋文件的類型為 TYPE 的,類型主要有:一般正規文件 (f), 裝置文件 (b, c),目錄 (d), 連結檔 (l), socket (s), 及 FIFO (p) 等屬性。-perm mode :搜尋文件權限『剛好等于』 mode 的文件,這個 mode 為類似 chmod的屬性值,舉例來說, -rwsr-xr-x 的屬性為 4755 !-perm -mode :搜尋文件權限『必須要全部囊括 mode 的權限』的文件,舉例來說,我們要搜尋 -rwxr--r-- ,亦即 0744 的文件,使用 -perm -0744,當一個文件的權限為 -rwsr-xr-x ,亦即 4755 時,也會被列出來,因為 -rwsr-xr-x 的屬性已經囊括了 -rwxr--r-- 的屬性了。-perm /mode :搜尋文件權限『包含任一 mode 的權限』的文件,舉例來說,我們搜尋-rwxr-xr-x ,亦即 -perm /755 時,但一個文件屬性為 -rw-------也會被列出來,因為他有 -rw.... 的屬性存在!
關于文件的特殊權限,參考SECTION 7 理解文件權限
# 范例五:找出檔名為 passwd 這個文件
[root@study ~]# find / -name passwd
# 范例五-1:找出文件名包含了 passwd 這個關鍵詞的文件
[root@study ~]# find / -name "*passwd*"
# 利用這個 -name 可以搜尋檔名啊!默認是完整文件名,如果想要找關鍵詞,
# 可以使用類似 * 的任意字符來處理# 范例六:找出 /run 目錄下,文件類型為 Socket 的檔名有哪些?
[root@study ~]# find /run -type s
# 這個 -type 的屬性也很有幫助喔!尤其是要找出那些怪異的文件,
# 例如 socket 與 FIFO 文件,可以用 find /run -type p 或 -type s 來找!# 范例七:搜尋文件當中含有 SGID 或 SUID 或 SBIT 的屬性
[root@study ~]# find / -perm /7000
# 所謂的 7000 就是 ---s--s--t ,那么只要含有 s 或 t 的就列出,所以當然要使用 /7000,
# 使用 -7000 表示要同時含有 ---s--s--t 的所有三個權限。而只需要任意一個,就是 /7000 ~瞭乎?
上述范例中比較有趣的就屬 -perm 這個選項啦!他的重點在找出特殊權限的文件啰! 我們知道SUID 與 SGID 都可以設定在二進制程序上,假設我想要找出來 /usr/bin, /usr/sbin 這兩個目錄下,只要具有 SUID 或 SGID 就列出來該文件,你可以這樣做:
find /usr/bin /usr/sbin -perm /6000
因為 SUID 是 4 分,SGID 2 分,總共為 6 分,因此可用 /6000 來處理這個權限! 至于 find 后面可以接多個目錄來進行搜尋!另外,find 本來就會搜尋次目錄,這個特色也要特別注意喔! 最后,我們再來看一下 find 還有什么特殊功能吧!
額外可進行的動作
選項與參數:
4. 額外可進行的動作:-exec command :command 為其他指令,-exec 后面可再接額外的指令來處理搜尋到的結果。-print :將結果打印到屏幕上,這個動作是預設動作!
# 范例八:將上個范例找到的文件使用 ls -l 列出來~
[root@study ~]# find /usr/bin /usr/sbin -perm /7000 -exec ls -l {} \;
# 注意到,那個 -exec 后面的 ls -l 就是額外的指令,指令不支持命令別名,
# 所以僅能使用 ls -l 不可以使用 ll 喔!注意注意!# 范例九:找出系統中,大于 1MB 的文件
[root@study ~]# find / -size +1M
find 的特殊功能就是能夠進行額外的動作(action)。我們將范例八的例子以圖解來說明如下:
該范例中特殊的地方有 {} 以及 \; 還有 -exec 這個關鍵詞,這些東西的意義為:
- {} 代表的是『由 find 找到的內容』,如上圖所示,find 的結果會被放置到 {} 位置中;
- -exec 一直到 ; 是關鍵詞,代表 find 額外動作的開始 (-exec) 到結束 (
\;
) ,在這中間的就是 find 指令內的額外動作。 在本例中就是『 ls -l {} 』啰! - 因為『
;
』在 bash 環境下是有特殊意義的,因此利用反斜杠來跳脫
。
如果你要找的文件是具有特殊屬性的,例如 SUID 、文件擁有者、文件大小等等, 那么利用 locate 是沒有辦法達成你的搜尋的!此時 find 就顯的很重要啦! 另外,find 還可以利用通配符
來找尋檔名呢!舉例來說,你想要找出 /etc 底下檔名包含 httpd 的文件, 那么你就可以這樣做:
[root@node-135 yurq]# find /etc -name '*yscon*'
/etc/sysconfig
不但可以指定搜尋的目錄(連同次目錄),并且可以利用額外的選項與參數來找到最正確的檔名!真是好好用! 不過由于 find 在尋找數據的時后相當的操硬盤!所以沒事情不要使用 find 啦!有更棒的指令可以取代呦!那就是上面提到的 whereis 與 locate 啰!
find /etc -size +50k -a ! -user root -type f -exec ls -l {} \;
find /etc -size +1500k -o -size 0
注意到 -a ,那個 -a 是 and 的意思,為符合兩者才算成功,
相對于 -a ,那個 -o 就是或 (or) 的意思啰!
注意到 ! ,那個 ! 代表的是反向選擇,亦即『不是后面的項目』之意!
15.3 權限與指令間的關系
我們知道權限對于使用者賬號來說是非常重要的,因為他可以限制使用者能不能讀取/建立/刪除/修改文件或目錄!在這一章我們介紹了很多文件系統的管理指令,在這個小節當中, 我們就將這兩者結合起來,說明一下什么指令在什么樣的權限下才能夠運作吧!
讓用戶能進入某目錄成為『可工作目錄』的基本權限為何?
- 可使用的指令:例如 cd 等變換工作目錄的指令;
- 目錄所需權限:用戶對這個目錄至少需要具有 x 的權限 ,即751可進入目錄
- 額外需求:如果用戶想要在這個目錄內利用 ls 查閱文件名,則用戶對此目錄還需要 r 的權限,即755可進入目錄并ls
用戶在某個目錄內讀取一個文件的基本權限為何?
- 可使用的指令:例如本章談到的 cat, more, less 等等
- 目錄所需權限:用戶對這個目錄至少需要具有 x 權限;即751可以進入目錄
- 文件所需權限:使用者對文件至少需要具有 r 的權限才行!即754可讀取
讓使用者可以修改一個文件的基本權限為何?
- 可使用的指令:例如 nano 或未來要介紹的 vi 編輯器等;
- 目錄所需權限:用戶在該文件所在的目錄至少要有 x 權限;
- 文件所需權限:使用者對該文件至少要有 r, w 權限
如果只賦予其他用戶w(752),那么vim和nano無法操作,但是echo能把內容清空,好奇怪,所以基本權限為w就可以修改,不過只能清空
[root@node-135 test]# lltotal 0-rwxr---w- 1 root root 0 Aug 8 16:32 123[root@node-135 test]# vim 123[root@node-135 test]# cat 123123123123[yurq@node-135 test]$ echo 123>123[root@node-135 test]# cat 123
讓一個使用者可以建立一個文件的基本權限為何?
- 目錄所需權限:用戶在該目錄要具有 w,x 的權限,重點在 w 啦!
讓用戶進入某目錄并執行該目錄下的某個指令之基本權限為何?
- 目錄所需權限:用戶在該目錄至少要有 x 的權限;
- 文件所需權限:使用者在該文件至少需要有 x 的權限
讓一個使用者 dmtsai 能夠進行『cp /dir1/file1 /dir2』的指令時,請說明 dir1, file1, dir2 的最小所需權限為何?
答:
執行 cp 時, dmtsai 要『能夠讀取來源文件,并且寫入目標文件!
』所以應參考上述第二點與第四點的說明! 因此各文件/目錄的最小權限應該是:
- dir1 :至少需要有 x 權限;
- file1:至少需要有 r 權限;
- dir2 :至少需要有 w, x 權限。
有一個文件全名為 /home/student/www/index.html ,各相關文件/目錄的權限如下:
drwxr-xr-x 23 root root 4096 Sep 22 12:09 /
drwxr-xr-x 6 root root 4096 Sep 29 02:21 /home
drwx------ 6 student student 4096 Sep 29 02:23 /home/student
drwxr-xr-x 6 student student 4096 Sep 29 02:24 /home/student/www
-rwxr–r-- 6 student student 369 Sep 29 02:27 /home/student/www/index.html
請問 vbird 這個賬號(不屬于 student 群組)能否讀取 index.html 這個文件呢?
答:
雖然 www 與 index.html 是可以讓 vbird 讀取的權限,但是因為目錄結構是由根目錄一層一層讀取的,因此 vbird 可進入 /home 但是卻不可進入 /home/student/ ,既然連進入 /home/student 都不許了, 當然就讀不到 index.html 了!所以答案是『vbird 不會讀取到 index.html 的內容』喔!
那要如何修改權限呢?其實只要將 /home/student 的權限修改為最小 711 ,或者直接給予 755 就可以啰! 這可是很重要的概念喔!
該系列目錄 --> 【BASH】回顧與知識點梳理(目錄)