更深入地了解 Linux 許可權

2021-09-24 08:21:36 字數 3856 閱讀 6552

在 linux 上檢視檔案許可權時,有時你會看到的不僅僅是普通的 r、w、x 和 -。如何更清晰地了解這些字元試圖告訴你什麼以及這些許可權如何工作?

在 linux 上檢視檔案許可權時,有時你會看到的不僅僅是普通的rwx-。除了在所有者、組和其他中看到rwx之外,你可能會看到s或者t,如下例所示:

drwxrwsrwt

複製**

要進一步明確的方法之一是使用stat命令檢視許可權。stat的第四行輸出以八進位制和字串格式顯示檔案許可權:

$ stat /var/mail

file: /var/mail

size: 4096 blocks: 8 io block: 4096 directory

device: 801h/2049d inode: 1048833 links: 2

access: (3777/drwxrwsrwt) uid: ( 0/ root) gid: ( 8/ mail)

access: 2019-05-21 19:23:15.769746004 -0400

modify: 2019-05-21 19:03:48.226656344 -0400

change: 2019-05-21 19:03:48.226656344 -0400

birth: -

複製**

這個輸出提示我們,分配給檔案許可權的位數超過 9 位。事實上,有 12 位。這些額外的三位提供了一種分配超出通常的讀、寫和執行許可權的方法 - 例如,3777(二進位制011111111111)表示使用了兩個額外的設定。

該值的第乙個1(第二位)表示 sgid(設定 gid),為執行檔案而賦予臨時許可權,或以該關聯組的許可權來使用目錄。

011111111111

^複製**

sgid 將正在使用該檔案的使用者作為該組成員之一而分配臨時許可權。

第二個1(第三位)是「粘連」位。它確保只有檔案的所有者能夠刪除或重新命名該檔案或目錄。

011111111111

^複製**

如果許可權是7777而不是3777,我們知道 suid(設定 uid)欄位也已設定。

111111111111

^複製**

suid 將正在使用該檔案的使用者作為檔案擁有者分配臨時許可權。

至於我們上面看到的/var/mail目錄,所有使用者都需要訪問,因此需要一些特殊值來提供它。

但現在讓我們更進一步。

特殊許可權位的乙個常見用法是使用passwd之類的命令。如果檢視/usr/bin/passwd檔案,你會注意到 suid 位已設定,它允許你更改密碼(以及/etc/shadow檔案的內容),即使你是以普通(非特權)使用者身份執行,並且對此檔案沒有讀取或寫入許可權。當然,passwd命令很聰明,不允許你更改其他人的密碼,除非你是以 root 身份執行或使用sudo

$ ls -l /usr/bin/passwd

-rwsr-xr-x 1 root root 63736 mar 22 14:32 /usr/bin/passwd

$ ls -l /etc/shadow

-rw-r----- 1 root shadow 2195 apr 22 10:46 /etc/shadow

複製**

現在,讓我們看一下使用這些特殊許可權可以做些什麼。

與 linux 命令列中的許多東西一樣,你可以有不同的方法設定。chmod命令允許你以數字方式或使用字元表示式更改許可權。

要以數字方式更改檔案許可權,你可以使用這樣的命令來設定 suid 和 sgid 位:

$ chmod 6775 tryme

複製**

或者你可以使用這樣的命令:

$ chmod ug+s tryme <== 用於 suid 和 sgid 許可權

複製**

如果你要新增特殊許可權的檔案是指令碼,你可能會對它不符合你的期望感到驚訝。這是乙個非常簡單的例子:

$ cat tryme

#!/bin/bash

echo i am $user

複製**

即使設定了 suid 和 sgid 位,並且 root 是檔案所有者,執行指令碼也不會產生你可能期望的 「i am root」。為什麼?因為 linux 會忽略指令碼的 suid 和 sgid 位。

$ ls -l tryme

-rwsrwsrwt 1 root root 29 may 26 12:22 tryme

$ ./tryme

i am jdoe

複製**

另一方面,如果你對乙個編譯的程式之類進行類似的嘗試,就像下面這個簡單的 c 程式一樣,你會看到不同的效果。在此示例程式中,我們提示使用者輸入檔名並建立它,並給檔案寫入許可權。

#include 

int main

() printf("file created successfully\n");

return 0;

}複製**

編譯程式並執行該命令以使 root 使用者成為所有者並設定所需許可權後,你將看到它以預期的 root 許可權執行 - 留下新建立的 root 為所有者的檔案。當然,你必須具有sudo許可權才能執行一些需要的命令。

$ cc -o mkfile mkfile.c            <== 編譯程式

$ sudo chown root:root mkfile <== 更改所有者和組為 「root」

$ sudo chmod ug+s mkfile <== 新增 suid and sgid 許可權

$ ./mkfile <== 執行程式

enter name of file to be create: empty

file created successfully

$ ls -l empty

-rw-rw-r-- 1 root root 0 may 26 13:15 empty

複製**

請注意,檔案所有者是 root - 如果程式未以 root 許可權執行,則不會發生這種情況。

許可權字串中不常見設定的位置(例如,rwsrwsrwt)可以幫助提醒我們每個位的含義。至少第乙個 「s」(suid) 位於所有者許可權區域中,第二個 (sgid) 位於組許可權區域中。為什麼粘連位是 「t」 而不是 「s」 超出了我的理解。也許創造者想把它稱為 「tacky bit」,但由於這個詞的不太令人喜歡的第二個定義而改變了他們的想法。無論如何,額外的許可權設定為 linux 和其他 unix 系統提供了許多額外的功能。

本文由 lctt 原創編譯,linux中國 榮譽推出

如何更深入地掌握研發專案的物理效能?

uwa 問答社群 answer.uwa4d.com uwa qq群 465082844 僅限技術交流 q1 如何提高unity物理引擎physx的效能?我在場景中加入100個具有物理剛體的小人,並充分碰撞,發現低端機的幀率只能跑到10幀以下。uwa 如果需要充分進行物理計算,這些擁擠在一起的小人很可...

linux許可權的深入討論

1 掌握使用ls l命令檢視檔案上所設定的許可權。drwxr xr x.2 root root 6 may 26 2017 binfmt.d 許可權資訊 硬鏈結數 屬主 屬組 檔案大小 檔案建立時間 檔名 2 掌握ls l命令的顯示結果中的第一列分成4組,其中 d rwx r x r x.a 第1個...

mysql許可權管理 帶您深入了解MySQL許可權管理

不同的許可權在mysql資料庫上能進行的操作是不同的,下面就為您介紹mysql許可權管理的一些知識,如果您對mysql許可權管理方面感興趣的話,不妨一看。對於root使用者的密碼操作 更改使用者密碼 剛剛安裝完的mysql,mysql許可權管理上只一有個root使用者,密碼為空,而且只能在本機登入!...