文章目錄
這裏是一段防爬蟲文本,請讀者忽略。
本文原創首發於CSDN,作者IDYS
博客首頁:https://blog.csdn.net/weixin_41633902/
本文鏈接:https://blog.csdn.net/weixin_41633902/article/details/105748894
- 寫在開頭的話
- 請記住:實踐是掌握知識的最快方法
- 如果你只是懷着看看的態度去快速瀏覽文章,而不去認認真真的把文章裏面講的任何一個知識點去實踐一遍,那麼你永遠也掌握不了它
- 生命不息,折騰不止!
- find命令詳解
- 文件查找命令簡介
-
在文件系統上查找符合條件的文件
-
文件查找命令:locate,find
- 非實時查找(數據庫查找)
- 實時查找:find
- locate命令
-
依賴於事先構建的索引:索引的構建是在系統較爲空閒時自動進行(週期性任務);手動更新數據庫(updatedb)
-
whatis命令也是根據數據庫查詢的,makewhatis構建數據庫(索引)
-
索引構建過程需要遍歷整個根文件系統,極耗費資源
-
Windows上類似於locate的工具,如:everything
-
工作特點:
-
查找速度快
-
模糊查找
-
非實時查找
-
-
locate KEYWORD
- find命令
-
實時查找工具,通過遍歷指定路徑下的文件系統完成文件查找
-
工具特點
-
查找速度略慢
-
精確查找
-
實時查找
-
-
語法:find [OPTION]… [查找路徑] [查找條件] [處理動作]
- 查找路徑:指定具體目標路徑,默認爲當前目錄
- 查找條件:指定的查找標準,可以文件名、大小、類型、權限等標準進行。默認爲找出指定路徑下的所有文件
- 處理動作:對符合條件的文件做什麼操作:默認輸出至屏幕
-
查找條件:
- 根據文件名查找
- -name ”文件名稱“ 支持使用glob,嚴格區分字母大小寫
- *,?,[],[^]
- -iname ”文件名稱“:查找文件不區分字母大小寫
- -regex ”PATH“:以PATTERN匹配整個文件路徑字符串,而不僅是文件名稱
- 根據屬主、屬組查找:
- -user USERNAME:查找屬主爲指定用戶的文件
- -group GROUPNAME:查找屬組爲指定組名的文件
- -uid UserID:查找屬主爲指定UID號的文件
- -gid GroupID:查找屬組爲指定GID號的文件
- -nouser:查找沒有屬主的文件
- -nogroup:查找沒有屬組的文件
#在/etc/ 下查找文件名爲network的文件
[root@dayuanshuai ~]# find /etc -name "network"
/etc/sysconfig/networking/profiles/default/network
/etc/sysconfig/network
/etc/rc.d/init.d/network
#在/etc/ 下查找以文件名以network結尾的文件
[root@dayuanshuai ~]# find /etc -name "*network"
/etc/sysconfig/networking/profiles/default/network
/etc/sysconfig/network
/etc/rc.d/rc5.d/S10network
/etc/rc.d/rc4.d/S10network
/etc/rc.d/rc2.d/S10network
/etc/rc.d/rc1.d/K90network
/etc/rc.d/init.d/network
/etc/rc.d/rc0.d/K90network
/etc/rc.d/rc6.d/K90network
/etc/rc.d/rc3.d/S10network
/etc/security/console.apps/system-config-network
/etc/pam.d/system-config-network
#在/tmp目錄下查找屬主爲root的文件,且以長格式顯示,-ls代表長格式
[root@dayuanshuai ~]# find /tmp -user root -ls
130817 4 drwxrwxrwt 6 root root 4096 4月 1 09:18 /tmp
130917 4 drwxrwxrwt 2 root root 4096 9月 19 2019 /tmp/.ICE-unix
130818 0 -rw------- 1 root root 0 3月 29 09:57 /tmp/yum.log
130924 4 -rw----rwx 1 root root 761 4月 1 06:25 /tmp/grub.conf
130925 28 -rw-r----- 1 root root 25592 4月 1 06:33 /tmp/functions
# 在/hemo目錄下查找 uid爲501的文件,且以長格式顯示
[root@dayuanshuai ~]# find /home -uid 501 -ls
261677 4 drwx------ 8 xiao xiao 4096 4月 1 09:18 /home/xiao
261678 4 drwxr-xr-x 2 xiao xiao 4096 11月 12 2010 /home/xiao/.gnome2
261699 4 drwxrwxr-x 2 xiao xiao 4096 3月 31 15:58 /home/xiao/y_n
261700 4 -rw-rw-r-- 1 xiao xiao 20 3月 31 21:06 /home/xiao/grep_big.txt
261693 8 -rw------- 1 xiao xiao 4788 4月 1 09:18 /home/xiao/.viminfo
261679 4 -rw-r--r-- 1 xiao xiao 176 3月 23 2017 /home/xiao/.bash_profile
261680 4 drwxr-xr-x 4 xiao xiao 4096 9月 16 2019 /home/xiao/.mozilla
- 根據文件類型查找
-
-type TYPE
- f:普通文件
- d:目錄文件
- l:符號鏈接文件
- s:套接字文件
- b:塊設備文件
- c:字符設備文件
- p:管道文件
-
組合條件:
- 與:-a
- 或:-o
- 非:-not,!
- !A -a !B = !(A -o B)
- !A -o !B = !(A -a B)
在/home目錄下查找沒有屬主或者沒有屬組的文件
[root@dayuanshuai ~]# find /home -nouser -o -nogroup
#長格式顯示
[root@dayuanshuai ~]# find /home \( -nouser -o -nogroup \)
# 在/tmp下查找名字不是 'fstab'且屬主不是root的文件
[root@dayuanshuai ~]# find /tmp \( -not -name 'fuctions' -a -not -user root \) -ls
[root@dayuanshuai ~]# find /tmp -not \( -name 'fuctions' -o -user root \) -ls
- 根據文件大小來查找
- -size [ + | - ] #UNIT
- 常用單位:k,M,G
- #UNIT: (#-1,#]
- -#UNIT: [0,#-1]
- +#UNIT:(#,oo)
find /usr -size 2k -exec ls -lh {} \;
-
根據時間戳:
- 以”天“爲單位
- -atime [ +|- ]#
- # [#,#+1)
- +# [#+1,oo)
- -# (0,#)
- -mtime
- -ctime
- 以”分鐘“爲單位
- -amin
- -mmin
- -cmin
注意上面使用 + 號的地方在CentOS7上變爲 /
#設置當前時間爲2020年 04月 24日 星期五 17:15:30 CST
[root@dayuanshuai ~]# date 0424171520.30
2020年 04月 24日 星期五 17:15:30 CST
# 設置Atime的訪問時間爲2020年3月12日4點12分
[root@dayuanshuai ~]# touch -a -t 202003120412.00 Atime.txt
# 查看文件
[root@dayuanshuai tmp]# stat Atime.txt
File: "Atime.txt"
Size: 0 Blocks: 0 IO Block: 4096 普通空文件
Device: 803h/2051d Inode: 130926 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2020-03-12 04:12:00.000000000 +0800
Modify: 2020-04-24 17:19:18.821998093 +0800
Change: 2020-04-24 17:19:18.821998093 +0800
[root@dayuanshuai tmp]# find /tmp -atime -3
-
根據權限查找
-
-perm [ +|- ] MODE
-
MODE:精確權限匹配
-
+MODE:任何一類(u,g,o)對象的權限中只要能有一位匹配即可
- +100
- 400不符合
- 500符合
- 700符合
- 717符合
- +400
- 711符合
- 613符合
- 447符合
- +100
-
-MODE:每一類對象都必須同時擁有爲其指定的權限標準:
-
-666
- 477不符合
- 644不符合
- 766符合
-
-233
-
666不符合
-
644不符合
-
277符合
-
-
-
注意上面使用 + 號的地方在CentOS7上變爲了 /
-
處理動作
- -print:默認的處理動作,顯示至屏幕
- -ls:類似於對查找到的文件執行”ls -l“命令
- -delete:刪除查找到的文件
- -fls /PATH/TO/SOMEWHERE:查找到的所有文件的長格式信息保存至指定文件中
- -ok COMMAND {} \; 對查找到的每個文件執行由COMMAND指定的命令:對於每個文件執行命令之前,都會交互式要求用戶確認。
- -exec COMMAND {}; 對查找到的每個文件執行由COMMAND指定的命令;
- 注意:find 傳遞查找到的文件至後面指定的命令時,查找到所有符合條件的文件一次性傳遞給後面的命令
- 有些命令不能接受過多參數,此時命令執行可能會失敗;另一種方式可規避此問題
- find | xargs COMMAND
[root@dayuanshuai tmp]# find /tmp -nogroup -ok chown :root {} \;
#查找在/tmp目錄下,改變時間在5分鐘之內的文件,
[root@dayuanshuai tmp]# find /tmp -cmin -5 -exec mv {} {}.new \;
- find與xargs
- xargs簡介
-
args(argument),xargs是命令傳遞參數的一個過濾器,也是組合多個命令的一個工具
-
可以將管道或標準輸入(stdin)數據轉換成命令行參數,也能夠從文件的輸出中讀取數據
-
xargs 默認的命令是 echo,這意味着通過管道傳遞給 xargs 的輸入將會包含換行和空白,不過通過 xargs 的處理,換行和空白將被空格取代。
-
之所以使用這個命令是因爲很多命令不支持管道來傳遞參數
- xargs的用法
一個簡短的例子
-
例如需要以長格式顯示/etc下屬主爲root用戶,文件類型爲普通文件,權限爲700的文件
-
錯誤做法
[root@dayuanshuai ~]# find /etc -user root -type f -perm 700 | ls -l
總用量 24
-rw-------. 1 root root 943 8月 31 2019 anaconda-ks.cfg
-rw-r--r--. 1 root root 13195 8月 31 2019 install.log
-rw-r--r--. 1 root root 3482 8月 31 2019 install.log.syslog
- 正確做法1
[root@dayuanshuai ~]# find /etc -user root -type f -perm 700 -exec ls -l {} \;
-rwx------. 1 root root 180 7月 10 2003 /etc/cron.daily/logrotate
-rwx------. 1 root root 927 3月 22 2017 /etc/cron.daily/makewhatis.cron
- 正確做法2
[root@dayuanshuai ~]# find /etc -user root -type f -perm 700 | xargs ls -l
-rwx------. 1 root root 180 7月 10 2003 /etc/cron.daily/logrotate
-rwx------. 1 root root 927 3月 22 2017 /etc/cron.daily/makewhatis.cron
xargs 選項
- -n NUM:命令在執行時一次用的argument的個數,默認個數爲所有的
[xiao@dayuanshuai ~]$ cat b.txt
abxy
xyaaabxy
xay
xayyy
xayss
sssdasasd
xyxxxxxxy
xxxxxxxysss
[xiao@dayuanshuai ~]$ cat b.txt | xargs -n2
abxy xyaaabxy
xay xayyy
xayss sssdasasd
xyxxxxxxy xxxxxxxysss
- -d :定義定界符
[xiao@dayuanshuai xargs_test]$ cat arg1.txt
how how how N HOW HOW N are
you N you how N
what
[xiao@dayuanshuai xargs_test]$ cat arg1.txt | xargs -dN -n2
how how how HOW HOW
are
you you how
what
- -0:將stdin中的特殊字符當作一般字符,將\0作爲定界符
[xiao@dayuanshuai xargs_test]$ echo -e "|\n|"
|
|
[xiao@dayuanshuai xargs_test]$ echo -e "|\n|" | xargs echo #此時將換行當作分隔符,多兩個參數進行處理
| |
[xiao@dayuanshuai xargs_test]$ echo -e "|\n|" | xargs -0 echo
|
|
- -a file 從文件讀入作爲stdin
#從args1.txt中讀取文件內容,作爲xargs的參數
[xiao@dayuanshuai xargs_test]$ xargs -a arg1.txt -dN
how how how HOW HOW are
you you how
what
- -e flag ,注意有的時候可能會是-E,flag必須是一個以空格分隔的標誌,當xargs分析到含有flag這個標誌的時候就停止。(這個flag前必須以空格分隔)
[xiao@dayuanshuai xargs_test]$ cat arg1.txt
how how how N HOW HOW N are
you N you how N
what
[xiao@dayuanshuai xargs_test]$ xargs -a arg1.txt -E'are'
how how how N HOW HOW N
- p 當每次執行一次argument的時候詢問一次用戶
[xiao@dayuanshuai xargs_test]$ xargs -a arg1.txt -n2
how how
how N
HOW HOW
N are
you N
you how
N what
[xiao@dayuanshuai xargs_test]$ xargs -a arg1.txt -n2 -p
/bin/echo how how ?...y
/bin/echo how N ?...how how
y
/bin/echo HOW HOW ?...how N
y
/bin/echo N are ?...HOW HOW
y
/bin/echo you N ?...N are
y
/bin/echo you how ?...you N
y
/bin/echo N what ?...you how
y
N what
- -I:爲參數指定一個替換字符串,當 -i 時默認使用{}作爲替換字符串不需要直接指定,而 -I 則需要指定替換字符串
# 使用-I 指定替換字符串,而-i則默認替換字符串爲{}
[xiao@dayuanshuai xargs_test]$ cat a.txt | xargs -I {} echo {} ?
how are you ?
fine ?
ok ?
[xiao@dayuanshuai xargs_test]$ cat a.txt | xargs -i echo {} ?
how are you ?
fine ?
ok ?
- find與xargs結合使用
- 爲什麼find 中已經有-exec 了還要使用xargs呢?
find將查找到的參數一次性傳遞給-exec執行,而系統對-exec一次執行的參數個數有限制,可能會導致-exec處理不了,從而導致溢出。而xargs可以選擇一次從find匹配出來的參數中取出幾個參數,然後一次又一次的取出。然後又繼續執行,直到取完,或者其自定義的某個點結束爲止
- 管道|對find傳遞來的參數,僅僅作爲一個輸入參數對待,而xargs可以對傳遞來的參數作爲文件對待
# | 僅僅將find的輸出作爲輸入參數
[root@dayuanshuai ~]# find /etc -type f -perm 700 -user root | cat -n
1 /etc/cron.daily/logrotate
2 /etc/cron.daily/makewhatis.cron
# 查看/etc/cron.daily/logrotate和/etc/cron.daily/makewhatis.cron的內容,因爲使用了xargs,所以會把兩個輸入參數當文件看
[root@dayuanshuai ~]# find /etc -type f -perm 700 -user root | xargs -i cat -n {} 1 #!/bin/sh
2
3 /usr/sbin/logrotate /etc/logrotate.conf
4 EXITVALUE=$?
- 將xiao用戶的家目錄下所有以.txt結尾且屬主爲xiao的普通文件加上後綴名.xiao
[xiao@dayuanshuai ~]$ find /home/xiao -user xiao -type f -name "*.txt" | xargs -i mv {} {}.xiao
- Linux文件系統的特殊權限
- 特殊權限
- SUID
- SGID
- Sticky
- 基本權限
- user
- r:read(讀)
- w:write(寫)
- x:exec(執行)
- group
- r:read(讀)
- w:write(寫)
- x:exec(執行)
- other
-
r:read(讀)
-
w:write(寫)
-
x:exec(執行)
-
- 安全上下文
- 前提:進程有屬主和屬組;文件有屬主和屬組
- 任何一個可執行程序文件能不能啓動爲進程:取決發起者對程序文件是否擁有執行權限
- 啓動爲進程之後,其進程的屬主爲發起者;進程的屬組爲發起者所屬的組
- 進程訪問文件時的權限,取決於進程的發起者
- 進程的發起者,同文件的屬主:則應用文件屬主權限
- 進程的發起者,屬於文件的屬組;則應用文件屬組權限
- 應用文件“其它”權限
SUID
- 任何一個可執行程序文件能不能啓動爲進程:取決發起者對程序文件是否擁有執行權限
- 啓動爲進程之後,其進程的屬主爲原程序文件的屬主
- 權限設定:
- chmod u+s FILE…
- chmod u-s FILE…
[root@dayuanshuai ~]# cp /bin/cat /tmp #將cat二進制文件複製到/tmp下
[root@dayuanshuai tmp]# su - xiao
[xiao@dayuanshuai ~]$ /tmp/cat /etc/shadow #以xiao用戶運行cat二進制文件,對/etc/shadow執行操作
/tmp/cat: /etc/shadow: 權限不夠 #此時因爲xiao
用戶對/etc/shadow沒有任何權限。所以提示權限不足
[xiao@dayuanshuai ~]$ exit
[root@dayuanshuai tmp]# chmod u+s cat #回到root用戶,然後給cat文件賦予suid權限
[xiao@dayuanshuai tmp]$ /tmp/cat /etc/shadow
root:$6$/YdhVB92$IRRt7M1b2JmxWLuPgbrejaHInPufjH1nujuSn7Q98PVzaGah3kv49R468VG7Rj4So1U2FIMP/k/SACAXQx4Zv0:12157:0:99999:7:::
bin:*:17446:0:99999:7:::
daemon:*:11246:0:99999:7:::
adm:*:17546:0:99999:7:::
lp:*:17746:0:99999:7:::
sync:*:17146:0:99999:7:::
#此時當xiao用戶執行/tmp/cat時候,它被賦予了屬主權限,也就是root權限,所以可以查看/etc/shadow,還有我對加密密碼已經修改了,然後貼上去的
SGID
- 默認情況下,用戶創建文件時,其屬組爲此用戶所屬的基本組
- 一旦某目錄被設定了SGID,則對此目錄有寫權限的用戶在此目錄中創建的文件所屬的組爲此目錄的屬組
- 權限設定:
- chmod g+s DIR…
- chmod g-s DIR…
Sticky
-
對於一個多人可寫的目錄,如果設置了sticky,則對於每一個用戶來說,它僅能刪除自己的文件
-
權限設定:
- chmod o+t DIR…
- chmod o-t DIR…
# 查看/tmp目錄,所以用戶對tmp目錄都有可讀,可寫,可執行權限,同時/tmp目錄被賦予了sticky權限,這意味着在該目錄下,每個用戶只能刪除自己的文件,不能刪除他人的文件
[xiao@dayuanshuai tmp]$ ls -ld /tmp
drwxrwxrwt. 6 root root 4096 4月 24 20:06 /tmp
#在tmp目錄下查看Atime文件,可以看到屬主和屬組爲root
[xiao@dayuanshuai tmp]$ ls -l Atime.txt
-rw-r--r--. 1 root root 0 4月 24 17:19 Atime.txt
# 此時xia用戶無法刪除Atime文件
[xiao@dayuanshuai tmp]$ rm Atime.txt
rm:是否刪除有寫保護的普通空文件 "Atime.txt"?Y
rm: 無法刪除"Atime.txt": 不允許的操作
# /tmp和/var/tmp都設置有sticky位
[root@dayuanshuai ~]# ls -ld /tmp /var/tmp
drwxrwxrwt. 6 root root 4096 4月 24 20:06 /tmp
drwxrwxrwt. 2 root root 4096 4月 1 04:52 /var/tmp
- SUID 權限值4
- SGID 權限值2
- STICKY 權限值1
- chmod 477 /tmp/IDYS
- 所以用戶對該目錄都有讀寫執行權限,同時IDYS目錄有SUID權限
- chmod 477 /tmp/IDYS
- 權限位映射
- SUID: 映射到user,佔據屬主的執行權限位
- s:屬主擁有x(執行)權限
- S:屬主沒有x(執行)權限
- SGID: 映射到group, 佔據group的執行權限位
- s: group擁有x權限
- S:group沒有x權限
- Sticky: 映射到other, 佔據ohter的執行權限位
- t:other擁有x權限
- T:other沒有x權限
- SUID: 映射到user,佔據屬主的執行權限位
- 練習
- 查找/var/目錄下屬主爲root,且屬組爲mail的所有文件或者目錄
[root@dayuanshuai ~]# find /var -user root -group mail \( -type f -o -type d \) -ls
523667 4 drwxrwxr-x 2 root mail 4096 4月 1 06:24 /var/spool/mail
524429 4 -rw------- 1 root mail 1402 4月 1 06:24 /var/spool/mail/root
- 查找/usr目錄下不屬於root、bin或xiao的所有文件或目錄
[root@dayuanshuai ~]# find /usr -not \( -user root -o -user bin -o -user xiao \)
- 查找/etc目錄下最週一周內其內容修改過,同時屬主不爲root,也不是xiao的文件或目錄
[root@dayuanshuai ~]# find /etc -not \( -user root -o -user xiao \) -mtime -7
- 查找當前系統上沒有屬主或屬組,且最近一個周內曾被訪問過的文件或目錄
[root@dayuanshuai ~]# find / \( -nouser -o -nogroup \) -atime -7
- 查找/etc目錄下大於1M且類型爲普通文件的所有文件
[root@dayuanshuai ~]# find /etc -size +1M -type f -exec ls -lh {} \;
-rw-r--r--. 1 root root 8.1M 8月 31 2019 /etc/selinux/targeted/modules/active/policy.kern
-rw-r--r--. 1 root root 8.1M 8月 31 2019 /etc/selinux/targeted/policy/policy.24
- 查找/etc目錄下所有用戶都沒有寫權限的文件
# CentOS6做法
[root@dayuanshuai ~]# find /etc -not -perm +222 -ls
1309261 4 ---------- 1 root root 897 3月 30 02:55 /etc/shadow
1308691 4 -r-xr-xr-x 1 root root 1362 11月 15 2017 /etc/rc.d/init.d/blk-availability
1308193 4 ---------- 1 root root 774 9月 19 2019 /etc/shadow-
1309385 4 ---------- 1 root root 412 3月 30 06:25 /etc/gshadow
1308185 4 ---------- 1 root root 524 3月 30 06:24 /etc/gshadow-
1308409 276 -r--r--r-- 1 root root 281419 8月 31 2019 /etc/pki/ca-trust/extracted/openssl/ca-bundle.trust.crt
1308410 228 -r--r--r-- 1 root root 231105 8月 31 2019 /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem
1308412 144 -r--r--r-- 1 root root 144247 8月 31 2019 /etc/pki/ca-trust/extracted/pem/objsign-ca-bundle.pem
1308411 192 -r--r--r-- 1 root root 194274 8月 31 2019 /etc/pki/ca-trust/extracted/pem/email-ca-bundle.pem
1308413 168 -r--r--r-- 1 root root 168365 8月 31 2019 /etc/pki/ca-trust/extracted/java/cacerts
1308919 4 -r--r--r-- 1 root root 324 6月 20 2018 /etc/ld.so.conf.d/kernel-2.6.32-754.el6.x86_64.conf
1309520 4 -r-xr----- 1 root root 3756 3月 29 16:56 /etc/sudoers
1308416 4 -r-------- 1 root root 45 8月 31 2019 /etc/openldap/certs/password
# CentOS7 做法
[root@dayuanshuai ~]# find /etc -not -perm +222 -ls
- 查找/etc目錄下至少有一類用戶沒有執行權限的文件
[root@dayuanshuai ~]# find /etc -not -perm -111 -ls
- 查找/etc/init.d目錄下,所有用戶都有執行權限,且其它用戶有寫權限的文件
[root@dayuanshuai ~]# find /etc/init.d -perm -113
- 寫在最後的話:
- 無論每個知識點的難易程度如何,我都會盡力將它描繪得足夠細緻
- 歡迎關注我的CSDN博客,IDYS’BLOG
- 持續更新內容:運維 | 網工 | 軟件技巧
- 如果你有什麼疑問,或者是難題。歡迎評論或者私信我。你若留言,我必回覆!
- 雖然我現在還很渺小,但我會做好每一篇內容。謝謝關注!