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
下一篇 2016-08-10

相關推薦

  • Code Review中的幾個提示

    Code Review應該是軟件工程最最有價值的一個活動,之前,本站發表過《簡單實用的Code Review工具》,那些工具主要是用來幫助更有效地進行這個活動,這里的這篇文章,我們主要想和大家分享一下Code Review代碼審查的一些心得。 首先,我們先來看看Code Reivew的用處: Code reviews 中,可以通過大家的建議增進代碼的質量。 …

    Linux干貨 2015-04-03
  • 8.5-文本處理工具(命令篇)

     1、文件查看命令: cat, tac,rev cat [OPTION]… [FILE]…     -E: 顯示行結束符$     -n: 對顯示出的每一行進行編號     -A:顯…

    Linux干貨 2016-08-07
  • linux入門基礎命令總結

    命令基礎

    2017-09-18
  • 關于shell腳本編程基礎第三篇

                          關于shell腳本編程基礎第三篇   本章主要內容:循環的特殊用法;while;for;select 循環與菜單       &nbsp…

    系統運維 2016-08-21
  • 一些鮮為人知的編程事實

    我的程序員經歷讓我明白了一些關于軟件開發的事情。下面是一些在編程中可能會讓人感到詫異的事情: 一個程序員用了大約只用了10%-20%的時間來編碼,而且大多數程序員,無論他的水平如何,其平均每天只有10-12行的代碼最終會進入最終的軟件產品中。這是因為,優秀的程序員會花費90%的時間來思考、調查、研究最佳的設計。而糟糕的程序員則會花費90%的時間來調試代碼,并…

    Linux干貨 2016-07-11
  • M20 – 1- 第三周博客:Linux中的權限以及特殊權限

    上一篇講到了用戶與用戶組,相信大家都明白了Linux中用戶與用戶組的含義和用處,那接下來講的就是Linux中設置用戶與用戶組有使用權限。 Linux用戶權限 何為權限,權限(privilege)是指某個特定的用戶具有特定的系統資源使用權力,而權限又有哪幾種呢。 Linux用戶中主要針對三類著三種權限:讀、寫、執行,而Linux中存在著目錄與文件,而目錄的權限…

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