第六章 Linux文件與目錄管理
6.1 目錄操作
. 當前目錄
.. 上層目錄
- 前一個工作目錄
~ 當前用戶的家目錄
~account account用戶的家目錄
cd 絕對路徑or相對路徑 切換到這個指定路徑
cd 不加任何路徑,是回到當前家目錄,等於cd ~
cd - 返回剛剛的上個目錄
pwd 直接就能顯示當前目錄
pwd -P 顯示鏈接文件的真身
mkdir test 創建test文件夾,默認權限
mkdir -m 711 test2 創建一個test2文件夾,權限爲711
mkdir -p test/test1/test2 遞歸創建子文件夾
rmdir test 直接刪掉空文件夾,如果test有內容則無法刪除
rmdir -r test 直接刪掉test,不管test內有無內容
rmdir -p test/test1/test2 遞歸刪除,包括空文件夾
PATH
PATH="${PATH} : /root" 將/root文件夾加入到PATH路徑中
從安全角度考慮,本目錄(.)最好不要放到PATH中
6.2 文件與目錄管理
ls cp rm mv basename dirname
ls 顯示文件屬性
ls [-aAdfFhilnrRSt] 文件或目錄名稱
-a 全部文件,包括隱藏文件
-d 僅列出目錄本身,而不是列出目錄內的文件數據
-l 詳細信息顯示,包含文件的屬性與權限等數據
ls [--color={never,auto,always}] 文件或目錄名稱
--color=never 不要依據文件特性給與顏色顯示
--color=auto 你自己看着顯示
--color=always 要依據文件特性給與顏色顯示
ls [--full-time] 文件或目錄名稱
--full-time 以完整時間輸出,年月日時分
--time={atime,ctime} 輸出access時間(atime),或改變權限屬性的時間(ctime)
cp 複製文件或目錄
cp [-adfilprsu] 源文件source 目標文件directory
-a 相當於-dr --preserve=all 整個數據特性完全一模一樣
-d 若源文件爲鏈接,則複製鏈接而非文件本身
-r 遞歸複製,用於目錄的複製
-i 若目標文件已經存在,覆蓋時會先詢問操作的進行
-p 連同文件的屬性(權限、用戶、時間)一起復制過去,而非使用默認屬性,備份時常用
-l 進行硬鏈接的鏈接文件建立,而非複製文件本身
-s 複製成符號鏈接文件,也就是快捷方式文件
-u 當destination比source舊,才更新destination;或者destination不存在,纔會複製過來,備份常用
--preserve=all 除了-p的權限相關參數外,還加入SELinux的屬性,links、xattr等也複製
cp [options] source1 source2 source3 ... directory
這裏需要注意,如果源文件有兩個以上,最後一個目標文件一定得是目錄
拷貝之前瞭解:
是否需要完整保留源文件的信息
源文件是否爲符號鏈接文件
原文件是否爲特殊文件,如FIFO、Socket
源文件是否爲目錄
rm 刪除文件或目錄
rm [-fir] 文件名或目錄名
-f 就是force,忽略不存在的文件,不會出現警告信息
-i 交互模式,刪除前詢問是否刪除
-r 遞歸刪除,極其危險,慎用!
rm 非空文件夾 會提示說裏面有內容,刪不掉
rm -r 非空文件夾 按照提示刪除就行了
\rm -r 文件夾 命令前面加個反斜線,可以忽略掉alias的指定選項
rm ./-aaa- 刪除一個-開頭的文件,加上./表示-aaa-是本目錄下的文件
rm -- -aaa- 此法也可以刪除-aaa-
mv 移動文件或目錄,或重命名
mv [-fiu] source destination
-f fource強制的意思,如果目標文件已經存在,不會詢問而直接覆蓋
-i 若目標文件已經存在,詢問是否覆蓋
-u 若目標文件已經存在,且source比較新,纔會更新
mv 源文件a.txt 目標文件b.txt 實現將單一文件a.txt重命名爲另一文件b.txt
mv [option] source1 source2 source3 ... directory 多個文件移到目錄中
獲取路徑的文件名與目錄名
basename /etc/sysconfig/network 獲取最後的文件名network
dirname /etc/sysconfig/network 獲取最開始的目錄名/etc/sysconfig/
6.3 文件內容查看
cat tac nl more less head tail od touch
cat 從第一行開始顯示文件內容
cat [-AbEnTv]
-A 相當於-vET,可列出一些特殊字符而不是空白而已
-b 列出行號,僅針對非空白行做行號展示,空白行不標行號
-E 將結尾的換行符$顯示出來
-n 打印行號,連同空白行也會有行號,與-b不同
tac 從最後一行開始顯示,是cat倒着寫
tac 文件名
nl 顯示的時候,同時顯示行號
nl [-bnw] 文件名
-b 指定行號指定的方式,主要有兩種
-b a 不論是否爲空行,列出行號
-b t 如果有空行,空的那行不要列出行號(默認值)
-n 列出行號表示方法,主要3種
-n ln 行號在屏幕的最左方顯示
-n rn 行號在自己欄位的最右方顯示,且不加0
-n rz 行號在自己欄位的最右方顯示,且加0
-w 行號欄位佔用的字符
-w 3 表示默認欄位是3位
more 一頁一頁顯示文件內容,翻頁查看
可用按鍵:
space: 向下翻一頁
Enter: 向下翻一行
/字符串:在這個顯示的內容當中,向下查找字符串這個關鍵詞
:f :立刻顯示出文件名以及目前顯示的行數
q: :立刻離開more,不再顯示該文件內容
b或者[ctrl]-b :往回翻頁,這個操作只對文件有用,對管道無用
less 可以往前翻頁
可用按鍵:
space: 向下翻一頁
[pagedown]:向下翻一頁
[pageup]: 向上翻一頁
/字符串: 向下查找字符串這個關鍵詞
?字符串: 向上查找字符串這個關鍵詞
n: 重複前一個查找(與/或?命令有關)
N: 反向重複前一個查找(與/或?命令有關)
g: 前進到這個數據的第一行
G: 前進到這個數據的最後一行(注意大小寫)
q: 離開less
head 只看前面幾行
head [-n number] 文件
-n 後面接數字,代表顯示幾行
-n 10 顯示前10行(默認)
-n -100 如果數字是負數,表示後面的100行都不打印,只打印前面的所有內容
tail 只看後面幾行
tail [-n number] 文件
-n 後面接數字,代表顯示幾行
-n 10 只顯示後10行(默認)
-n 20 只顯示後20行
-n +100 從100行以後的內容全部列出
-f 表示持續刷新顯示後面所接文件中的內容,要等到按下Ctrl+c才結束;有數據寫入時就顯示
顯示文件的第11到第20行(先取前20行,在此基礎上再取後10行)
head -n 20 filename | tail -n 10
列出正確的行號,顯示文件的第11到第20行(先給全文添加行號,取前20行,在此基礎上再取後10行)
cat -n filename | head -n 20 | tail -n 10
od 以二進制的方式讀取文件內容
od [-t TYPE] 文件
-t a 利用默認的字符來輸出
-t c 使用ASCII字符輸出
-t d[size] 利用十進制(decimal)輸出數據,每個整數佔size字節
-t f[size] 利用浮點數(floating)輸出數據,每個數佔size字節
-t o[size] 利用八進制(octal)輸出數據,每個整數佔size字節
-t x[size] 利用十六進制(hexadecimal)輸出數據,每個整數佔size字節
echo password | od -t oCc 自助查詢password這幾個字母對應的ASCII對照
文件3個時間:
修改時間 mtime 文件內容改變 (默認ls列出這個修改時間mtime)
狀態時間 ctime 權限和屬性改變
讀取時間 atime 被新訪問了
touch 修改文件時間或創建新文件
touch filename 創建了一個空文件
touch [-acdmt] 文件
-a 僅自定義atime
-c 僅修改文件的時間,若該文件不存在則不建立新文件
-d 後面可以接欲自定義的日期而不用目前的時間,或者--data="日期或時間"
-m 僅自定義mtime
-t 後面可以接欲自定義的日期而不用目前的時間, 格式爲[YYYYMMDDhhmm]
touch -d "2 days ago" filename 將atime和mtime改成2天前,ctime未變
touch -t 202005251629 filename 將atime和mtime改成指定時間,ctime未變
6.4 文件與目錄的默認權限與隱藏權限
將root的~/.bashrc文件複製給dj:
cp ~/.bashrc ~dj/bashrc 複製文件
chown dj:dj ~dj/bashrc 修改屬性
建立一個目錄,所有人都可以訪問目錄中的文件,但是隻有dj用戶可以修改這些文件:
應該建立的文件夾權限:drwxr-xr-x 755
mkdir /tmp/dirname 建立目錄
chown -R dj:dj /tmp/dirname 修改屬性
chmod -R 755 /tmp/dirname 修改權限
umask 負責制定當前用戶在建立文件或目錄時候的默認權限
umask 得到0022,與普通權限相關的是後三個數字022,拿掉0,2,2
umask -S 得到以符號形式顯示的權限:u=rwx,g=rx,o=rx
umask 002 只將組外人拿掉一個寫權限
chattr 在ext2 ext3 ext4的linux傳統文件系統上面可以生效,xfs文件系統對其支持不全[Aadis]
chattr [+-=] [ASacdistu] 文件或目錄名稱
a 這個文件只能追加數據,不能刪除也不能修改,
只有root能設置該屬性
i 可以讓一個文件不能被刪除、改名,設置鏈接,也無法寫入或
新增數據,有利於系統安全,只有root能修改該屬性
s 如果改文件被刪除,就會完全從硬盤刪除,誤刪完全無法恢復
u 與s相反,如果文件被刪除,數據內容還存在磁盤中,可以用來恢復該文件
lsattr [-adR] 文件或目錄
-a 將隱藏文件的屬性也顯示出來
-d 如果接的是目錄,僅列出目錄本身的屬性,而非目錄內的文件名
-R 連同子目錄一同列出來
chattr +aiS attrtest 使用chattr設置屬性
lsattr attrtest 使用lsattr查看屬性
特殊權限介紹:
SUID 不可針對目錄
僅對二進制程序有效,不可用在shell腳本上,
執行者對於該程序需要有x的可執行權限,
本權限只在執行程序過程中有效,
執行者將具有該程序擁有者的權限
例如:一般用戶可以修改自己的密碼
只有root用戶可以讀取保存密碼的/etc/shadow文件內容,並強制寫入數據
又因/usr/bin/passwd命令的權限是-rwsr-xr-x,文件所有者權限有s
dj用戶可以調用passwd命令,執行過程中擁有root所有權限,
成功向/etc/shadow文件寫入數據
cat 命令沒有這個s,因此無法在調用cat過程中享有root的權限,
因此無法使用cat查看/etc/shadow文件內容
SGID 既可以針對文件,又可針對目錄
對於文件來說:
對二進制程序有用
程序執行着對於該程序來說,需要具備x的權限
執行者在執行過程中獲得該程序用戶組的支持
例如:
當文件mlocate.db文件的屬性:-rw-r-----,
按理說組外人無法查看內容
而普通用戶dj,可以調用/usr/bin/locate命令查找這個理論上
根本無法查看的mlocate.db
因爲locate命令的屬性:-rwx--s--x,在文件所屬組中的x上是個s,
也就是,即使非本組人員執行這個命令,
那麼恭喜你,你就具有這個命令所屬組的權限,
這個命令所屬的組是root,root組用戶可以查看mlocate.db文件,
因此查詢成功
對於目錄來說:
若用戶對於此目錄具有r或x權限時,該用戶能夠進入該目錄
用戶在此目錄下的有效用戶組,將會變成該目錄的用戶組
用途:若用戶在此目錄下具有w的權限(可以新建文件),
該文件的用戶組與此目錄的用戶組相同
SBIT 不可針對文件
如果用戶對此目錄具有w、x的權限,即具有寫入權限
當用戶在該目錄下建立文件或目錄時,僅有自己與root纔有權利刪除該文件
例如:
用戶dj對於A目錄具有用戶組或其他人的身份,並擁有目錄w權限,
這表示dj用戶對A目錄內任何人建立的目錄或文件具有刪除、改名、移動等操作
但是,如果把A目錄權限加上了SBIT權限,
則dj用戶只能對自己建立的文件刪除、改名、移動等,無法刪除他人文件
例如:
/tmp目錄的權限是:drwxrwxrwt,最後組外人的權限中有個t
任何人都可以在/tmp文件夾下新增修改文件,
但僅有該文件/目錄建立者和root能刪除自己的目錄或文件
特殊權限設置:
4 SUID
2 SGID
1 SBIT
chmod 4755 filename 將一個文件權限改爲-rwsr-xr-x SUID
chmod 6755 filename 將一個文件權限改爲-rwsr-sr-x SUID+SGID
chmod 1755 filename 將權限改爲-rwxr-xr-t SBIT
chmod 7666 filename 將權限改爲-rwSrwSrwT 根本不具備w,都是空
file 查看文件類型:
屬於ASCII文件、數據文件、二進制文件
有沒有用到動態鏈接庫等信息,可以利用file來看
file filename
6.5 命令與文件查找
腳本文件的查找:
which 查找執行文件
which [-a] commod
-a 將所有由PATH目錄中可以找到的命令均列出,
而不止第一個被找到的命令名稱
which config
which which
which history 找不到,因爲which是查找【path】這個環境變量所規定的路徑
而history是bash內置的命令,得通過type找
文件查找:
whereis 只查找特定目錄下的文件
whereis [-bmsu] 文件或目錄名
-l 可以列出whereis會去查詢的幾個主要目錄
-b 只找binary格式的文件,二進制文件
-m 只找在說明文件manual路徑下的文件
-s 只找source源文件
-u 查找不在上述三個項目中的其他特殊文件
whereis ifconfig 列出與ifconfig有關的文件名
whereis passwd
whereis -m passwd
whereis -l 可以列出whereis命令到底查詢了哪些文件夾
主要在/bin、/sbin目錄和/usr/share/man目錄裏查找
locate 只查找已建立的數據庫/var/lib/mlocate
locate [-irclS] keyword 關鍵字檢索
-i 忽略大小寫的差異
-c 不輸出文件名,僅計算找到的文件數量
-l 僅輸出幾行,若-l 5 則只輸出前5行
-S 輸出locate所用的數據庫文件的相關信息,包括該數據庫記錄的文件目錄數量等
-r 後面可接正則表達式的顯示方式
locate -l 5 passwd
locate -S
locate查詢基於建立的數據庫,
但數據庫每天才更新一次,如果新建了一個文件,這個文件自然一時半會不在數據庫內,
需要手動更新數據庫,否則會提示找不到數據
updatedb 這個命令是用來更新數據庫,根據 /etc/updatedb.conf的設置
去查找系統硬盤內的文件,
並更新/var/lib/mlocate內的數據庫文件
由於要去硬盤裏查找文件名,最後更新整個數據庫,要等數分鐘
find
1、
find [PATH] [option] [action]
與時間有關的選項:-atime,-ctime,-mtime
-mtime n: n是數字,在n天之前的【一天之內】被修改過內容的文件
[n-1,n]
-mtime +n: 列出在n天之前(不含n天本身)被修改過內容的文件
(負無窮,n-1]
-mtime -n: 列出在n天之內(含n天本身)被修改過內容的文件
[n,現在]
-newer file:file爲一個存在的文件,列出比file還要新的文件
find / -mtime 0 列出過去系統上面24h內修改過內容的文件,
0表示當前,從現在開始往前推24h
find / -mtime 3 列出3天之前那一天的24小時內修改過內容的文件
find /etc -newer /etc/passwd 列出/etc下面的文件,如果文件日期比/etc/passwd新就列出
2、
find /home -user dj 找出dj用戶的在系統中的所有數據
find / -nouser 找出不太正常的文件,
列出這些不屬於系統任何用戶的文件,以源代碼自行編譯軟件時會出現這種情況;
刪除了一個用戶,這個用戶曾在系統留下很多文件時也會出現這種情況
3、
find -name filename 查找文件名爲filename的文件
find -size [+-]SIZE 查找比SIZE還要大(+)或小(-)的文件,
SIZE規格:c:Bytes;k:1024Bytes;
find -size +50k 找到大於50kb的文件
find -type TYPE 查找文件類型是TYPE的,類型主要有:
一般正規文件 f
設備文件 b,c
目錄 d
鏈接文件 l
socket s
FIFO p
find -perm mode 查找權限==mode的文件
find -perm -mode 列出的文件權限必然要能囊括這個mode
find -perm /mode 查找文件權限中包含任一mode的權限的文件
find / -name passwd 找出文件名爲passwd的文件
find / -name "*passwd*" find只能查找完整文件名,若查找關鍵字,用正則
find /run -type s 找出socket文件,-type有利於找出類型怪異的文件
find / -perm /7000 所謂7000:---s--s--t,只要含有s或t就列出
find / -perm -7000 必須同時含有s或t,---s--s--t,才列出
find /usr/bin /usr/sbin -perm /6000 這兩個文件夾中只要有SUID或SGID就列出
find會遞歸查找子目錄
4、
find [PATH] [option] [action] 這個action
-exec commod 接額外別的命令處理找到的結果
-print 將結果打印輸出到屏幕(默認)
find /usr/bin /usr/sbin -perm /7000 -exec ls -l {} \;
此處只能用命令本名ls -l,不可用命令別名ll
find / -size +1M 找出系統中大於1MB的文章
find /etc -name '*http*' 找出/etc下面的文件名包含http的文件
不要有事沒事用find,它很消耗硬盤資源,可以用whereis和locate
6.6 權限與命令的關係
什麼命令 在什麼權限下才能夠運行
1、
讓用戶能進入某目錄並查看目錄中有哪些文件的基本權限:
cd 目錄
用戶首先要能進入這個目錄,對這個目錄要有x權限
額外,如果要在這個目錄內ls查看文件名,則要求用戶對這個目錄還需要r權限
2、
用戶在某個目錄內,讀取一個文件的基本權限:
cat 或 more 或 less 等
用戶首先要能進入這個目錄,對這個目錄要有x權限
用戶想讀這個文件內容,對這個文件要有r權限
3、
讓用戶可以修改一個文件的基本權限:
用 nano 或 gedit 或 vi 等
用戶首先要能進入這個目錄,對這個目錄要有x權限
用戶想要修改這個文件,要能看到文件內容(r),要能修改內容(w)
4、
讓用戶可以建立一個文件的基本權限:
用戶在該目錄要具有w和x的權限,
首先要能進去目錄(x),
然後要能新建文件,就是修改目錄中的內容(w)
5、
讓用戶能執行 cp /dir1/file1 /dir2 的基本權限:
用戶首先要能讀取源文件,並寫入目標文件
dir1 用戶至少要能進到dir1中(x)
file1 用戶要能看到file1的內容(r)
dir2 用戶要能往dir2裏寫入內容(w、x)
課後習題中的部分:
8.嘗試用find找出目前Linux系統中所有具有SUID的文件有哪些?
find / -perm /4000 -print
9.找出/etc下面,文件大小介於50KB到60KB之間的文件,並且將權限完整地列出(ls-l)
find /etc -size +50k -a -size -60k -exec ls -l {} \;
注意到 -a
,那個 -a 是 and 的意思,爲符合兩者纔算成功
10.找出/etc下面,文件容量大於50KB且文件所有者不是root的文件名,且將權限完整地列出(ls-l)
find /etc -size +50k -a ! -user root -exec ls -ld {} \;
11.找出/etc下面,容量大於1500KB以及容量等於0的文件
find /etc -size +1500k -o -size 0
那個 -o
就是或 (or) 的意思