1. 程式人生 > >2018-05-14筆記

2018-05-14筆記

linux

文件特殊權限suid、sgid、stick_bit

可以用file命令查看文件類型

[root@localhost ~]# file /etc/passwd
/etc/passwd: ASCII text
[root@localhost ~]# file /usr/bin/passwd 
/usr/bin/passwd: setuid ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, stripped

一、特殊屬性之suid

suid=set uid,只針對二進制文件,它會出現在文件擁有者權限的執行位上,具有這種權限的文件會在其執行時,使調用者暫時獲得該文件擁有者的權限,passwd命令就設置有這種權限

語法: chmod [u] [+,-] s 二進制文件

[root@localhost ~]# ll /usr/bin/passwd 
-rwsr-xr-x. 1 root root 25980 2月  22 2012 /usr/bin/passwd

可以看到,在文件擁有者的執行位上出現為小s而不是x,(如果U沒有執行權限會顯示大S)所以說passwd這個程序是具有SUID權限的。我們在修改用戶密碼的時候,用的就是passwd這個命令,在linux下面,用戶密碼是存儲在/etc/shadow這個文件裏面的。首先查看一下/etc/shadow這個文件的權限:

[root@localhost ~]# ll /etc/passwd
-rw-r--r--. 1 root root 1207 5月  14 16:45 /etc/passwd

可以看到只有root具有寫權限,可以往shadow文件中寫入數據,其他用戶連查看的權限都沒有。那我們平時是怎麽修改密碼呢?沒錯,就是和SUID有關。當我們使用passwd命令時,就獲得了passwd的所有者即root的權限,進而可以對shadow文件進行寫入操作。使用SUID需要滿足幾點:
1.SUID只對二進制文件有效
2.調用者對該文件有執行權
3.在執行過程中,調用者會暫時獲得該文件的所有者權限
4.該權限只在程序執行的過程中有效

我們可以用例子來解釋下:

[root@localhost ~]#ls -ld /root                          #可以看到其他用戶是沒有任何權限的
dr-xr-x---. 3 root root 4096 5月   9 18:12 /root
[root@localhost ~]#su - luo                             #切換到普通用戶
[luo@localhost ~]$ id
uid=500(luo) gid=500(luo) 組=500(luo) 環境=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[luo@localhost ~]$ ls -l /root/                         #顯示權限不夠
ls: 無法打開目錄/root/: 權限不夠
[root@localhost ~]#chmod u+s /bin/ls           #用root給ls命令加上suid權限
[root@localhost ~]# su - luo                         #再切換到普通用戶luo
[luo@localhost ~]$ ls -l /root/                       #可以看到已經可以臨時擁有了root權限
總用量 24
-rw-------. 1 root root   974 4月  22 00:06 anaconda-ks.cfg
-rw-r--r--. 1 root root 12360 4月  22 00:06 install.log
-rw-r--r--. 1 root root  3482 4月  22 00:05 install.log.syslog

二、特殊屬性之sgid

SGID即Set GID的縮寫,它出現在文件所屬組權限的執行位上面,它對普通二進制文件和目錄都有效。當它作用於普通文件時,和SUID類似,在執行該文件時,用戶將獲得該文件所屬組的權限。當SGID作用於目錄時,意義就非常重大了。當用戶對某一目錄有寫和執行權限時,該用戶就可以在該目錄下建立文件,如果該目錄有SGID權限,則該用戶在這個目錄下新建立的文件都是屬於這個目錄所屬的組,舊文件不受影響。
語法: chmod [g] [+,-] s 二進制文件或目錄
例如:

 [root@localhost ~]# mkdir /tmp/333/                      #在tmp目錄下新建個333目錄
 [root@localhost ~]# chmod 777 /tmp/333/              #權限設置為777
 [root@localhost ~]# chmod g+s /tmp/333/               #給333目錄加上sgid權限
 [root@localhost ~]# ls -ld /tmp/333/                         #可以看到已經設置了sgid權限
drwxrwsrwx. 2 root root 4096 5月  14 19:53 /tmp/333/
[root@localhost ~]# su - luo                                     #切換到普通用戶luo
[luo@localhost ~]$ touch /tmp/333/2.txt                  #用普通用戶新建個2.txt文件
[luo@localhost ~]$ ll !$                                            #可以看到新建文件的所屬組為root
ll /tmp/333/2.txt
-rw-rw-r--. 1 luo root 0 5月  14 19:53 /tmp/333/2.txt

三、特殊屬性之sbit

SBIT即Sticky Bit,它出現在其他用戶權限的執行位上,它只作用於目錄(文件也行,沒有意義)。當某一個目錄擁有SBIT權限時,則任何一個能夠在這個目錄下建立文件的用戶,該用戶在這個目錄下所建立的文件,只有該用戶自己和root可以刪除,其他用戶均不可以,也可以理解為防刪除位,一個文件是否可以被某用戶刪除,主要取決於該文件所在目錄是否對該用戶具有寫權限。如果沒有寫權限,則這個目錄下的所有文件都不能被刪除,同時也不能添加新文件。如果希望用戶能夠添加文件但同時不能刪除該目錄下的其他用戶(root除外)的文件,則可以對其父目錄增加該權限.
語法:chmod [o] [+,-] t 目錄
例如:

 [root@localhost ~]# ll -d /tmp/333/
drwxrwxrwx. 2 root root 4096 5月  14 19:53 /tmp/333/
[root@localhost ~]# chmod o+t /tmp/333/               #給/tmp/333/目錄加上sbit權限
[root@localhost ~]# ll -d /tmp/333/
drwxrwxrwt. 2 root root 4096 5月  14 19:53 /tmp/333/
[root@localhost ~]# su - luo                                  #切換到普通用戶luo
[luo@localhost ~]$ touch /tmp/333/3.txt                #新建個文件3.txt
[luo@localhost ~]$ su - gen                                   #切換到普通用戶gen
密碼:
[gen@localhost ~]$ cd /tmp/333/
[gen@localhost 333]$ ll
總用量 0
-rw-rw-r--. 1 luo root 0 5月  14 19:53 2.txt
-rw-rw-r--. 1 luo luo  0 5月  14 20:08 3.txt
[gen@localhost 333]$ rm 3.txt                            #/tmp/333/ 目錄權限是777,但是設置了sbit權限,用普通用戶gen是不能刪除其它用戶創建的文件的
rm:是否刪除有寫保護的普通空文件 "3.txt"?y
rm: 無法刪除"3.txt": 不允許的操作

軟鏈接和硬鏈接

Linux 系統中有軟鏈接和硬鏈接兩種特殊的“文件”。

軟鏈接可以看作是Windows中的快捷方式,可以讓你快速鏈接到目標檔案或目錄。

硬鏈接則透過文件系統的inode來產生新檔名,而不是產生新檔案。

創建方法都很簡單:

創建軟鏈接: ln -s [源文件] [目標文件]
創建硬鏈接: ln [源文件] [目標文件]

inode

當劃分磁盤分區並格式化的時候,整個分區會被劃分為兩個部分,即inode區和data block(實際數據放置在數據區域中)這個inode即是(目錄、檔案)文件在一個文件系統中的唯一標識,需要訪問這個文件的時候必須先找到並讀取這個 文件的 inode。 Inode 裏面存儲了文件的很多重要參數,其中唯一標識稱作 Inumber, 其他信息還有創建時間(ctime)、修改時間(mtime) 、文件大小、屬主、歸屬的用戶組、讀寫權限、數據所在block號等信息
用實例來解釋下軟鏈接和硬鏈接

[gen@localhost tmp]$ touch AAA BBB    #新建兩個文件AAA BBB
[gen@localhost tmp]$ ll -i 
261147 -rw-rw-r--. 1 gen  gen     0 5月  14 20:34 AAA
261148 -rw-rw-r--. 1 gen  gen     0 5月  14 20:34 BBB
[gen@localhost tmp]$ ln AAA AAAhard   #給AAA創建一個硬鏈接AAAhard
[gen@localhost tmp]$ ll -i
261147 -rw-rw-r--. 2 gen  gen     0 5月  14 20:34 AAA
261147 -rw-rw-r--. 2 gen  gen     0 5月  14 20:34 AAAhard
261148 -rw-rw-r--. 1 gen  gen     0 5月  14 20:34 BBB

註意在創建鏈接前,AAA顯示的鏈接數目為1,創建鏈接後
1.AAA和AAAhard的鏈接數目都變為2。
2.AAA和AAAhard的inode號是一樣的,都是261147。
3.AAA和AAAhard顯示的文件大小也是一樣。
可見進行了ln命令的操作結果:AAA和AAAhard是同一個文件的兩個名字, 它們具有同樣的索引節點號和文件屬性,建立文件AAA的硬鏈接,就是為 AAA的文件索引節點在當前目錄上建立一個新指針。你可以刪除其中任何一個,如rm AAA,每次只會刪除一個指針,鏈接數同時減一,只有將所有指向文件內容的指針,也即鏈接數減為0時,內核才會把文件內容從磁盤上刪除
盡管硬鏈接節省空間,也是Linux系統整合文件系統的傳統方式,但是存在一些不足之處:
1.不允許給目錄創建硬鏈接。
2.不可以在不同文件系統的文件間建立鏈接。因為 inode 是這個文件在當前分區中的索引值,是相對於這個分區的,當然不能跨越文件系統了
再給BBB創建個軟鏈接

[gen@localhost tmp]$ ln -s BBB BBBsoft
[gen@localhost tmp]$ ll -i
261147 -rw-rw-r--. 2 gen  gen     0 5月  14 20:34 AAA
261147 -rw-rw-r--. 2 gen  gen     0 5月  14 20:34 AAAhard
261148 -rw-rw-r--. 1 gen  gen     0 5月  14 20:34 BBB
261149 lrwxrwxrwx. 1 gen  gen     3 5月  14 20:42 BBBsoft -> BBB

可以看到鏈接數目不變都是1,大小是不一樣的,一個是0 一個是3 ,而且BBBsoft前面顯示是l文件,軟鏈接克服了硬鏈接的不足,沒有任何文件系統的限制,任何用戶可以創建指向目錄的符號鏈接。因而現在更為廣泛使用,它具有更大的靈活性,甚至可以跨越不同機器、不同網絡對文件進行鏈接

區別:

**1.硬鏈接原文件/鏈接文件公用一個inode號,說明他們是同一個文件,不能跨分區,不能作用於目錄,而軟鏈接原文件/鏈接文件擁有不同的inode號,表明他們是兩個不同的文件;
2.在文件屬性上軟鏈接明確寫出了是鏈接文件,而硬鏈接沒有寫出來,因為在本質上硬鏈接文件和原文件是完全平等關系;
3.鏈接數目是不一樣的,軟鏈接的鏈接數目不會增加;
4.文件大小是不一樣的,硬鏈接文件顯示的大小是跟原文件是一樣的。而軟鏈接顯示的大小與原文件就不同了
5.軟鏈接沒有任何文件系統的限制,任何用戶可以創建指向目錄的符號鏈接

總之,建立軟鏈接就是建立了一個新文件。當訪問鏈接文件時,系統就會發現他是個鏈接文件,它讀取鏈接文件找到真正要訪問的文件。
當然軟鏈接也有硬鏈接沒有的缺點:因為鏈接文件包含有原文件的路徑信息,所以當原文件從一個目錄下移到其他目錄中,再訪問鏈接文件,系統就找不到了,而硬鏈接就沒有這個缺陷,你想怎麽移就怎麽移;軟鏈接要系統分配額外的空間用於建立新的索引節點和保存原文件的路徑**

find命令

find是個使用頻率比較高的命令。常常用它在系統特定目錄下,查找具有某種特征的文件。

find命令的格式:find [-path……] -options [-print -exec -ok]

path:要查找的目錄路徑。

print:表示將結果輸出到標準輸出。

exec:對匹配的文件執行該參數所給出的shell命令。
形式為command {} \;,註意{}與\;之間有空格

ok:與exec作用相同,
區別在於,在執行命令之前,都會給出提示,讓用戶確認是否執行

options常用的有下選項:
-name:按照名字查找
-perm:安裝權限查找
-user:文件屬主來查找
-group:文件所屬組來查找
-nogroup:查找無有效所屬組的文件
-nouser:查找無有效屬主的文件
-type:按照文件類型查找
-mtime 按修改內容時間查找
-size 按大小查找

例如:
根據名字查找

[root@localhost ~]# find /etc -name ‘host*‘          #在/etc目錄下查找host開頭的文件或目錄
/etc/hosts
/etc/hosts.allow
/etc/host.conf
/etc/hosts.deny

按權限查找

[root@localhost ~]# find /tmp -perm 777
/tmp/BBBsoft
[root@localhost ~]# ll /tmp/BBBsoft 
lrwxrwxrwx. 1 gen gen 3 5月  14 20:42 /tmp/BBBsoft -> BBB

按文件類型查找

[root@localhost ~]# find /tmp -type l 
/tmp/BBBsoft

按時間查找

find . -mtime -2 -type f    #在當前目錄下查找兩天內被更改過的文件 
find . -mtime +2 -type f   #在當前目錄下查找兩天前被更改過的文件

按大小查找

[root@localhost ~]# find /tmp -size +1k -type f      #在/tmp目錄下查找大於1K的文件
[root@localhost ~]# find /tmp -size -1k -type f      #在/tmp目錄下查找小於1K的文件
/tmp/AAAhard
/tmp/BBB
/tmp/333/3.txt
/tmp/333/2.txt
/tmp/yum.log
/tmp/AAA

查找後執行命令

$ find . -name ‘del.txt‘ -ok rm {} \;                        #在當前目錄下查找名字為del.txt的並刪除,刪除前提示確認   
$ find . -name ‘aa.txt‘ -exec cp {} {}.bak \;          #在當前目錄下查找名字為aa.txt 並備份為aa.txt.bak

linux和windows互傳文件

實現的方式有很多種 securecrt xshell 可以通rz sz 命令,或者xshell自帶的 xftp工具實現(在 xshell上點擊新建文件傳輸),windows下可以用winscp工具實現,走的都是22端口,下圖是xshell自帶的xftp工具
技術分享圖片

2018-05-14筆記