path_resolution() - Unix、Linux 系統呼叫
廣告
名稱Unix/Linux 路徑解析 - 查詢檔名所引用的檔案描述一些 Unix/Linux 系統呼叫以一個或多個檔名作為引數。檔名(或路徑名)解析如下。
步驟 1:解析過程的開始如果路徑名以“/”字元開頭,則起始查詢目錄為當前程序的根目錄。(程序從其父程序繼承其根目錄。通常這將是檔案層次結構的根目錄。程序可以透過使用chroot(2)系統呼叫獲得不同的根目錄。如果程序(或其祖先之一)是由clone(2)系統呼叫的呼叫啟動的,並且設定了 CLONE_NEWNS 標誌,則程序可能會獲得一個完全私有的名稱空間。)這處理路徑名的“/”部分。如果路徑名不以“/”字元開頭,則解析過程的起始查詢目錄是程序的當前工作目錄。(這也從父程序繼承而來。可以透過使用chdir(2)系統呼叫來更改它。) 以“/”字元開頭的路徑名稱為絕對路徑名。不以“/”開頭的路徑名稱為相對路徑名。
步驟 2:沿著路徑行走將當前查詢目錄設定為起始查詢目錄。現在,對於路徑名的每個非最終元件(其中元件是由“/”字元分隔的子字串),將在當前查詢目錄中查詢此元件。如果程序在當前查詢目錄上沒有搜尋許可權,則返回 EACCES 錯誤(“許可權被拒絕”)。 如果找不到該元件,則返回 ENOENT 錯誤(“沒有這樣的檔案或目錄”)。 如果找到該元件,但它既不是目錄也不是符號連結,則返回 ENOTDIR 錯誤(“不是目錄”)。 如果找到該元件並且是目錄,我們將當前查詢目錄設定為該目錄,然後轉到下一個元件。 如果找到該元件並且是符號連結(符號連結),我們首先解析此符號連結(以當前查詢目錄作為起始查詢目錄)。發生錯誤時,將返回該錯誤。如果結果不是目錄,則返回 ENOTDIR 錯誤。如果符號連結的解析成功並返回一個目錄,我們將當前查詢目錄設定為該目錄,然後轉到下一個元件。請注意,此處的解析過程涉及遞迴。為了保護核心免受堆疊溢位的影響,以及為了防止拒絕服務,對最大遞迴深度和跟隨的最大符號連結數有限制。當超過最大值時,將返回 ELOOP 錯誤(“符號連結級別過多”)。
步驟 3:查詢最終條目路徑名的最終元件的查詢與前一步中描述的所有其他元件的查詢相同,有兩個區別:(i)最終元件不必是目錄(至少就路徑解析過程而言 - 它可能必須是目錄或非目錄,因為特定系統呼叫的要求),以及(ii)如果找不到該元件,則不一定是錯誤 - 也許我們只是在建立它。特定系統呼叫的手冊頁中描述了對最終條目的處理細節。
。和 ..按照慣例,每個目錄都有條目“.”和“..”,它們分別指代目錄本身及其父目錄。路徑解析過程將假定這些條目具有其常規含義,無論它們是否實際存在於物理檔案系統中。 無法向下遍歷根目錄:“/..”與“/”相同。
掛載點在執行“mount dev path”命令後,路徑名“path”將引用裝置“dev”上的檔案系統層次結構的根目錄,而不是它之前引用的任何內容。可以從已掛載的檔案系統中退出:“path/..”引用“path”的父目錄,位於“dev”上的檔案系統層次結構之外。
尾部斜槓如果路徑名以“/”結尾,則強制解析前面的元件,如步驟 2 中所述:它必須存在並解析為目錄。否則將忽略尾隨“/”。(或者,等效地,以“/”結尾的路徑名等效於透過在其後附加“.”獲得的路徑名。)
最終符號連結如果路徑名的最後一個元件是符號連結,則取決於系統呼叫引用的檔案是符號連結還是其內容上的路徑解析結果。例如,系統呼叫lstat(2)將對符號連結進行操作,而stat(2)將對符號連結指向的檔案進行操作。
長度限制路徑名有最大長度。如果路徑名(或在解析符號連結時獲得的一些中間路徑名)過長,則返回 ENAMETOOLONG 錯誤(“檔名過長”)。
空路徑名在原始 Unix 中,空路徑名引用當前目錄。現在 POSIX 規定不得成功解析空路徑名。Linux 在這種情況下返回 ENOENT。
許可權檔案的許可權位由三組三個位組成,參見chmod(1)和stat(2)。噹噹前程序的有效使用者 ID 等於檔案的擁有者 ID 時,使用前三組。當檔案的組 ID 等於當前程序的有效組 ID 或當前程序的補充組 ID 之一時(由setgroups(2)設定),使用第二組三個。當兩者都不成立時,使用第三組。在使用的三個位中,第一個位確定讀取許可權,第二個位確定寫入許可權,最後一個位確定普通檔案的情況下的執行許可權或目錄的情況下的搜尋許可權。 Linux 使用 fsuid 而不是有效使用者 ID 進行許可權檢查。通常,fsuid 將等於有效使用者 ID,但可以透過系統呼叫setfsuid(2)更改 fsuid。 (此處“fsuid”代表類似“檔案系統使用者 ID”的東西。該概念是在使用者空間 NFS 伺服器實現中所需的,當時程序可以向具有相同有效使用者 ID 的程序傳送訊號。它現在已過時。沒有人應該使用setfsuid(2)。) 類似地,Linux 使用 fsgid(“檔案系統組 ID”)而不是有效組 ID。請參閱setfsgid(2)。
繞過許可權檢查:超級使用者和功能在傳統的 Unix 系統上,超級使用者(root,使用者 ID 0)擁有至高無上的權力,並在訪問檔案時繞過所有許可權限制。在 Linux 上,超級使用者許可權被劃分為功能(請參閱capabilities(7))。兩個功能與檔案許可權檢查相關:CAP_DAC_OVERRIDE 和 CAP_DAC_READ_SEARCH。(如果程序的 fsuid 為 0,則該程序具有這些功能。) CAP_DAC_OVERRIDE 功能覆蓋所有許可權檢查,但僅在檔案的三個執行許可權位中至少設定了一個時才授予執行許可權。 CAP_DAC_READ_SEARCH 功能授予對目錄的讀取和搜尋許可權,以及對普通檔案的讀取許可權。
另請參閱
廣告
|