sudo 原始碼樹將前端程式、外掛程式實作、可重用函式庫、產生的語言剖析器與可攜性支援分開。請從可執行檔的進入點開始,再追蹤外掛程式介面;單純依目錄名稱閱讀會模糊政策邊界。
前端與命令流程 #
src/sudo.c 是 sudo 前端。其早期路徑會建立呼叫詳細資料、剖析命令列選項、初始化設定與記錄,並將授權與執行決策交給設定的外掛程式。前端刻意與政策分離:政策外掛程式決定命令是否允許,而 I/O 外掛程式可以記錄或調節執行。
其他進入點包括 visudo、cvtsudoers、sudoreplay 與 testsudoers。其來源與共用前端程式碼放在一起,而不是隔離的程式目錄中。在追蹤呼叫前,請先於本機 Makefile.in 找出可執行檔目標,因為 src/ 中的檔案不一定會連結至每個二進位檔。
include/sudo_plugin.h 定義前端與外掛程式的邊界。預設政策實作位於 plugins/sudoers/;該樹包含 sudoers 剖析、匹配、政策決策、記錄與相關外掛程式掛鉤。I/O 記錄與重播程式碼也屬於外掛程式導向的關注事項。移植或政策工作應從這些介面開始,而不是變更前端權限處理。
佇列巨集 #
include/sudo_queue.h 包含 BSD 風格的侵入式佇列巨集。節點嵌入項目連結,而標頭儲存第一個元素,尾端佇列還會儲存尾端參照。主要系列依連結方式與標頭是否追蹤尾端而異:
| 節點連結 | 標頭配置 | 巨集系列 |
|---|---|---|
| next | head | SLIST_* |
| next | head and tail | STAILQ_* |
| next and previous | head | LIST_* |
| next and previous | head and tail | TAILQ_* |
巨集不會產生配置、鎖定、生命週期管理或型別安全的迭代器物件。使用佇列的程式碼必須讓嵌入元素保持存活,並保護並行變更。相較於主機的 <sys/queue.h>,請優先使用本機標頭的巨集與語意,因為 BSD 衍生標頭已經分歧。
函式庫與可攜性 #
lib/ 包含前端與外掛程式共用的元件,而 lib/util/ 提供低階工具與相容性例程。後者包括包裝器、有界字串與路徑處理、配置輔助程式、記錄支援、參照計數字串,以及目標平台缺少介面的後備實作。include/ 中的公開宣告使重用邊界可見;sudo_ 前綴通常識別專案擁有的包裝器:
# define getdelim(_a, _b, _c, _d) sudo_getdelim((_a), (_b), (_c), (_d))不要假設每個 sudo_ 函式都是簡單別名。包裝器可以提供後備語意、輸入驗證或平台解決方案。在替換為原生 libc 呼叫前,請追蹤其宣告與實作。
configure.ac 與 m4/ 中的 Autoconf 探測會選取可用的平台功能。這是標頭檔、函式、權限與作業系統行為的可攜性邊界;呼叫端的 #ifdef 分支通常是那些產生的設定結果的後果。
產生的剖析器與設定資料 #
sudoers 外掛程式會提交產生的輸出,因此發行建置不需要剖析器產生器。請追蹤來源到輸出的關係,而不是編輯產生的檔案:
| 產生的檔案 | 權威輸入 |
|---|---|
plugins/sudoers/gram.c、gram.h | plugins/sudoers/gram.y |
plugins/sudoers/toke.c | plugins/sudoers/toke.l |
plugins/sudoers/getdate.c | plugins/sudoers/getdate.y |
plugins/sudoers/def_data.c、def_data.h | plugins/sudoers/def_data.in |
建置的開發者或重新產生規則會執行設定的剖析器、詞法分析器與資料產生工具。變更 .y、.l 或 .in 輸入後,請透過這些規則重新產生;否則原始碼簽出可能包含互不一致的輸入與輸出。剖析器符號前綴與重新產生先決條件是建置設定細節,因此請檢查相關 Makefile.in 與 configure 輸出,而不要使用猜測的旗標呼叫產生器。
導覽策略 #
針對政策問題,從 plugins/sudoers/ 開始,並追蹤 include/sudo_plugin.h 宣告的外掛程式回呼。針對命令啟動或選項處理,從適當的 src/ 進入點開始。針對 I/O 記錄,追蹤 I/O 外掛程式介面與 sudoreplay 讀取器路徑。針對作業系統差異,搜尋 lib/util/、m4/、configure.ac 與產生的設定標頭。
上游 sudo 原始碼樹 與其已提交的建置檔案是權威地圖,因為產生的名稱與外掛程式組合會在不同發行版本間變更。
評論
在 GitHub 上閱讀或評論(發表評論需要登入)