第十四篇:獲取系統資料檔案資訊

穆晨發表於2017-01-28

前言

       在 Linux 中,系統資料檔案大都不能直接用編輯的方式讀取。如此設計一方面是從安全性考慮,另一方面則是從檔案檢索效率考慮。

       本文將以口令檔案 passwd 為例講解讀取 Linux 中系統資料檔案的方法。

基本步驟

       1. 包含讀寫該系統資料檔案的專用標頭檔案 ( 如讀寫口令檔案要包含 pwd.h 組檔案則是 grp.h )

       2. 使用 set 函式開啟檔案

       3. 使用 get 函式讀取下一個記錄

       4. 使用 end 函式關閉此檔案

       另,如果資料檔案支援某種形式的關鍵字搜尋,則會提供搜尋具有指定關鍵字記錄的例程。如口令檔案提供了 getpwnam 函式尋找具有指定使用者名稱的記錄;getpwuid 函式尋找具有指定使用者ID的記錄。

       幾個主要系統資料檔案的例程資訊可參考下表:

       

程式碼實現

       下程式列印口令檔案中的所有使用者名稱:

 1 #include <stdio.h>
 2 #include <unistd.h>
 3 #include <pwd.h>
 4 
 5 int main (void) {
 6     // 開啟口令檔案
 7     setpwent();
 8 
 9     // 設立指向口令結構體的指標
10     struct passwd *p = NULL;
11 
12     // 遍歷口令檔案
13     while (p = getpwent()) {
14         printf ("%s, ", p->pw_name);
15     }
16     printf("\n");
17 
18     // 關閉口令檔案
19     endpwent();
20 
21     return 0;
22 }

       附 passwd 結構體:

 1 struct passwd
 2 {
 3     char * pw_name; /* Username, POSIX.1 */
 4     char * pw_passwd; /* Password */
 5     __uid_t pw_uid; /* User ID, POSIX.1 */
 6     __gid_t pw_gid; /* Group ID, POSIX.1 */
 7     char * pw_gecos; /* Real Name or Comment field */
 8     char * pw_dir; /* Home directory, POSIX.1 */
 9     char * pw_shell; /* Shell Program, POSIX.1 */
10     char *pw_class;
11     time_t pw_change;
12     time_t pw_expire;
13 };

執行測試

       

小結

       1. 除了順序遍歷的方法讀取系統資料檔案( 如本文程式 ),還可以根據某些欄位資訊檢索檔案。

       2. 注意到,程式並沒有指定口令檔案的路徑。

相關文章