Linux文件權限管理及目錄文件的深入理解。

文件權限及目錄

初學Linux,感覺這個東西該復雜,而且邏輯非常的強。難~!

自己根據學習到的理論和實踐,得出的對文件權限,進程,以及特殊權限的深入理解。希望能解決初學者對于權限的困惑。如有錯誤請指正。

文件的權限,指定的是什么?

是文件的權限位上的權限,針對三類用戶,任何用戶都必須是三類用戶中的一種,屬主屬組和其他人的權限rwx
    -rw-r--r--. 1 root root     3 Jul 23 16:20 a
    -rw-------. 1 root root  1482 Jul 20 17:12 anaconda-ks.cfg
    -rw-r--r--. 1 root root    21 Jul 23 16:38 bc
    drwxr-xr-x. 7 root root  4096 Jul 20 18:46 cheat
    drwxr-xr-x. 2 root root  4096 Jul 20 17:19 Desktop

系統時如何識別用戶?

登錄系統的時候,輸入用戶名和密碼。這時系統就通過用戶名解析出用戶的uid和gid。以后就靠這個識別用戶的身份。解析使用的文件
/etc/passwd

Linux是多用戶操作系統,同一用戶名登錄兩個用戶,操作系統又是如何知道那個用戶運行了什么,而且不同用戶的進程互不影響?

根據馬哥視頻將的Linux運行機制,我的個人理解如下
    用戶空間,系統空間。每個用戶都有自己的用戶空間。即使是同名用戶登錄,使用的也不是相同的用戶空間。用戶空間是相互隔離的。用戶空間不能訪問系統空間。但是系統空間可以訪問用戶空間。
    用戶運行程序,在內存中表現為進程,進程是用戶的代理。它繼承了用戶的uid和gid。

系統如何為用戶分配權限?。

例如一個程序cat運行了,文件的權限不是相對于cat程序本身,而是相對于cat在內存中的進程的身份uid和gid而言的。從而實現權限分配。
    [user1@yangyouwei ~]$ ll /bin/cat
    -rwxr-xr-x. 1 root root 48568 May 11 16:59 /bin/cat

    [user1@yangyouwei ~]$ id
    uid=702(user1) gid=702(user1) groups=702(user1) 

    [user1@yangyouwei ~]$ ll /tmp
    total 124
    -rw-r--r--. 1 root root   29 Jul 23 15:40 code
    -rw-r--r--. 1 root root    2 Jul 29 22:13 homework.txt

對cat程序的權限設置是任何人都能運行,但是/tmp/code文件的權限設置是,任何人都能讀取,但是只有root用戶能夠修改該文件。其他的用戶都只能讀取不能寫入內容。

權限匹配過程

系統先比較用戶的uid與文件的屬主的uid是否同一人,是的話應用屬主權限
否則繼續比較用戶的gid與文件的屬組的gid是否一致,一致應用屬組的權限
否則應用其他人的權限。

特殊權限—身份變換的過程。

經過上面的介紹,我個人理解,suid和sgid只是系統在用戶運行程序為進程后,改變進程的屬主和組。只是個身份變換的過程。用戶(用戶發起的進程)獲取是身份而非權限。要說權限,那就是具體到,該進程要訪問那個文件,而那個文件的權限的設置才能決定用戶進程訪問該文件的權限。

通過實驗得到的結果是:先運行程序為進程后再獲取相應的身份

user1不是屬主也不是屬組。但是匹配了cat哪個權限位的x權限生效的?是其它人的x權限還是屬主的x?

    [root@yangyouwei ~]# ll /tmp/cat
    -rwsr-xr-x. 1 root root 48568 Aug  1 15:05 /tmp/cat

    [user1@yangyouwei ~]$ /tmp/cat
        ##cat已經運行,等待用戶通過標準輸入輸入內容。
    [root@yangyouwei ~]# ps aux
    root       2616  0.0  0.0 100944   552 pts/0    S+   15:08   0:00 /tmp/cat

程序已經執行,進程的屬主為root。但是沒有回答上面的問題

先將屬主的x權限去掉。在執行以user1身份運行。
    為了看清,先去掉執行權限,在添加suid
    [root@yangyouwei ~]# chmod u-x /tmp/cat  
    [root@yangyouwei ~]# ll /tmp/cat        
    -rw-r-xr-x. 1 root root 48568 Aug  1 15:05 /tmp/cat
    [root@yangyouwei ~]# chmod u+s /tmp/cat   
    [root@yangyouwei ~]# ll /tmp/cat 
    -rwSr-xr-x. 1 root root 48568 Aug  1 15:05 /tmp/cat
        大S表示沒有指向權限
再執行cat
    [user1@yangyouwei ~]$ /tmp/cat
可以執行,cat運行,等待用戶通過標準輸入輸入內容。
    [root@yangyouwei ~]# ps aux
    root       2670  0.0  0.0 100944   548 pts/0    S+   15:20   0:00 /tmp/cat
看到已經cat已經運行。并且屬主是root

另一個蛋疼實驗??梢哉f明問題

如還有懷疑請將/tmp/cat的屬主執行權限加上,在把其他人的執行權限去掉??纯催€能運行嗎?
不做演示了,結果是user1不能運行cat程序。設置了suid的程序的屬主權限位,對于能夠運行該程序的用戶沒有影響。

即使把/tmp/cat的權限改為屬主無任何權限,其他人有執行權限,user1可以運行該程序。
對于使用/tmp/cat讀取/tmp/cat,也就是catcat自己,這種蛋疼的問題的結果是。cat可以以root身份運行,但是cat不能讀取cat程序文件。也就是執行成功,讀取失敗。

    注:cat讀取cat程序,就是讀取自己程序文件,正常情況是可讀取的,就是一堆亂碼。
        -rwxr-xr-x. 1 root root 48568 May 11 16:59 /bin/cat

        用戶沒有權限執行程序的報錯是如下,要是做該實驗自己對比實驗結果。
            [user1@yangyouwei ~]$ useradd
            -bash: /usr/sbin/useradd: Permission denied

        用戶沒有讀取權限cat的報錯如下:
            [user1@yangyouwei ~]$ cat /etc/shadow
            cat: /etc/shadow: Permission denied

同時設置了suid和sgid的情況下,用戶是其他人,用戶運行的進程可以同時獲得文件屬主和屬組的身份。

[root@yangyouwei ~]# ll /tmp/cat 
-rwSr-sr-x. 1 root root 48568 Aug  1 15:05 /tmp/cat  #cat的屬主x權限還沒有恢復也不影響結果。

[user1@yangyouwei ~]$ /tmp/cat  #user1運行cat

[root@yangyouwei ~]# ps axo user,ruser,group,rgroup,cmd
root     user1    root     user1    /tmp/cat
root     root     root     root     ps axo user,ruser,group,rgroup,cmd

對目錄操作,改名,刪除文件

根據老師所講自己整理出,目錄與文件(普通文件和目錄)的關系。
要先擺脫windows形成的慣性思維,摒棄文件夾的概念。圖形化的東西對于我們理解Linux下的原理有誤導。

目錄是什么?
目錄是文件,目錄的內容是目錄下的文件列表--有吻合了Linux一切皆文件的理論。

文件列表內容包括:由文件(目錄)名+文件(目錄)的inod       是一一對應的關系。
文件名不是文件的一部分。文件對于系統而言僅是inod元數據+數據。文件名是給用戶(人)用的。

改名和刪除目錄下的文件
    改名是改變文件列表,名字改變,但是inod不變。

        mv命令的工作原理:
        在同一文件系統上,mv只是針對目錄操作,將目錄下的文件列表中刪除(移動到不同目錄下,且在同一文件系統下)或改名(文件位置不變,僅僅是改了名字)
            [root@yangyouwei ~]# ll -i /tmp                  
            total 124
            3937387 -rwSr-sr-x. 1 root root 48568 Aug  1 15:05 cat
            3937395 -rw-r--r--. 1 root root    29 Jul 23 15:40 codechange

            [root@yangyouwei ~]# mv /tmp/codechange /tmp/code  #改名
            [root@yangyouwei ~]# ll -i /tmp/code 
            3937395 -rw-r--r--. 1 root root 29 Jul 23 15:40 /tmp/code
        文件的inod沒有變化。

    刪除,是刪除文件名,隨之文件的硬鏈接次數發生改變,為0時,inod釋放掉,也就刪除了文件。如果inod不為零,文件(數據)也沒有被刪除,

        cp命令的工作原理:
        先建立一個空文件(新的inod),在將文件讀取到內存中,以數據流的方式填充到新建的空文件里,完成后再刪除原文件。
            [root@yangyouwei ~]# cp /tmp/code ./codecp
            root@yangyouwei ~]# ll -i ./code 
            3937395 -rw-r--r--. 1 root root 29 Jul 23 15:40 /tmp/code
            [root@yangyouwei ~]# ll -i ./codecp 
            1442418 -rw-r--r--. 1 root root 29 Aug  1 16:02 ./codecp

原創文章,作者:yyw,如若轉載,請注明出處:http://www.www58058.com/31873

(1)
yywyyw
上一篇 2016-08-10 10:27
下一篇 2016-08-10 10:27

相關推薦

  • N25期—第一周作業

    1、描述計算機的組成及其功能 計算機五大組成部件:運算器、控制器、存儲器、輸入設備和輸出設備。 運算器和控制器統稱中央處理器(CPU)。  存儲器分成內存儲器和外存儲器兩大類。  外存儲器、輸入設備和輸出設備統稱為外部設備。  中央處理器(CPU)  計算機的中央處理器又稱為CPU,它是計算機的核心部分。主要由運算器和…

    Linux干貨 2016-12-04
  • 文本工具

    本文將介紹Linux下使用Shell處理文本時最常用的工具:find、grep、xargs、sort、uniq、tr、cut、paste、wc、sed、awk;提供的例子和參數都是最常用和最為實用的

    2017-11-25
  • bash腳本編程實例

    bash腳本編程實例 1.寫一個腳本 接受一個以上文件路徑作為參數 顯示每個文件擁有的行數 總結說明本次共為幾個文件統計了其行數 #!/bin/bash # read -p “please input some paths:” paths if [ -z $paths ];then echo “There are not any paths inputtin…

    Linux干貨 2017-08-14
  • 淺談編譯kernel+busybox構建擁有遠程ssh登錄和web功能最小linux系統(一)

    實驗環境win7+VM11.1 大致過程總攬 1,硬件準備以及查看硬件設備型號(不用擔心,這些都是VM虛擬出來的) 2,編譯環境的配置以及下載內核源碼以及編譯內核 3,編譯busybox,以及提供系統正常運行的配置文件,初步運行linux系統 4,編譯安裝dropbear提供ssh服務 5,安裝nginx;提供web服務 一,硬件準備以及查看硬件設備型號 由…

    Linux干貨 2015-09-22
  • week1

    一,計算機的組成 五大基本部件 運算器:  算術運算,邏輯運算等各種各樣的運算的, 控制器:  控制總線的使用權限,內存尋址 控制權限訪問是讀還是寫               寄存器,內部的存儲器,都是用來存儲數據的  加速和提高cpu性能   &…

    Linux干貨 2016-10-28
  • linux時間設置、screen使用、命令分類、hash作用、命令引用及history命令

    一、 生產環境發現一臺服務器系統時間產生偏差,造成服務異常 解決方法             a、 如果服務器硬件時間準備的話,可使用命令:~#] hwclock -s              將硬件時鐘同步到系統 &…

    Linux干貨 2016-08-02
欧美性久久久久