APUE筆記之系統數據文件

1. 口令文件(/etc/passwd 644)
    口令文件記錄了linux用戶賬戶以及相關信息(密碼除外),每一行中各字段定義如下:
    <pwd.h>
    struct passwd {
        char *pw_name;  // 用戶名
        char *pw_passwd;// 加密口令
        __uid_t pw_uid; // 用戶ID
        __git_t pw_gid; // 組ID
        char *pw_gecos; // 註釋字段
        char *pw_dir;   // home目錄
        char *pw_shell; // 該用戶的登陸shell
    }
    備註:通常有一個用戶名爲root的登陸項,其用戶ID是0,也就是超級用戶;通常還有一個用戶名爲nobody的登陸項,其用戶ID是65534,一般對該用戶不提供任何特權,只能訪問人人都可讀寫的文件
          加密口令字段在這裏就是個佔位符"x",實際的加密口令放到了/etc/shadow中
          用戶ID和組ID應該就是當前進程的實際用戶ID和實際組ID
          某些字段可以爲空,註釋字段爲空不產生任何影響
          home目錄字段記錄的就是該用戶的家目錄
          shell字段一般指定了一個shell程序用來登陸系統,這裏有多種方法來組織一個特定用戶登陸系統,常見的有/dev/null、/bin/false、/bin/true、/usr/sbin/nologin等

2. 陰影口令(/etc/shadow 640)
    陰影口令文件主要記錄了用戶賬戶對應的加密口令,每一行中各字段定義見<shadow.h>,這裏不再展開

    備註:除了root用戶,其他用戶對陰影口令文件沒有訪問權限,從而確保了加密口令不會被泄漏,而普通口令文件是可以被各用戶自由讀取的
    
3. 組文件(/etc/group 644)
    組文件記錄了linux用戶組以及相關信息,每一行中個字段定義見<grp.h>,這裏不在展開
    備註:組文件的權限以及訪問的C接口風格跟口令文件基本相同

4. 賬戶添加/刪除命令
    只有root權限才能添加/刪除賬戶。
    [1]. "# useradd 用戶名"     - 這條命令只是創建了一個用戶,它並沒有在/home目錄下創建同名文件夾,也沒有創建密碼,所以使用該用戶名是無法登錄系統的
    [2]. "# useradd -m 用戶名"  - 這條命令不但創建了一個用戶,還會在/home目錄下創建同名文件夾
    [3]. "# passwd 用戶名"      - 這條命令用於對已經創建的用戶設置密碼,如果是針對本用戶操作則不需要root權限
    [4]. "# adduser 用戶名"     - 這條perl命令是對useradd、passwd等命令的封裝,所以簡單的使用該條命令就可以完成賬戶創建和密碼設置等
    [5]. "# userdel -r 用戶名"  - 這條命令用於刪除一個已經創建的用戶,其中-r表示同時刪除該用戶的home目錄等相關文件
    
5. 其他系統數據文件
    /etc/hosts      - 主機名配置文件
    /etc/networks   - 用來記錄網絡信息
    /etc/protocols  - 用來記錄協議信息
    /etc/services   - 用來記錄各網絡服務器所提供的服務
    備註:這些文件對具體linux系統來說不一定是必需的

6. utmp和wtmp文件
    /var/run/utmp文件記錄了當前登錄到系統的各個用戶;/var/log/wtmp文件記錄了每一次登錄和註銷事件
    who命令的實現就是基於utmp文件,只是在內容的展現上根據登錄終端進行了細分
    last命令的實現基於wtmp文件

7. 時間信息總結
    linux採用日曆時間(計算從1970年1月1日00:00:00以來經過的秒數,數據類型 time_t)來提供基本的時間服務
    [1]. time_t time(time_t *time)      -- <time.h>
        最基本的時間獲取函數,時間值既可以通過入參獲取,也可以通過返回值獲取

    [2]. struct tm *localtime(const time_t *time)   -- <time.h>
         struct tm *gmtime(const time_t *time)
         time_t mktime(struct tm *time)
        localtime是將日曆時間轉換爲年月日時分秒格式的本地時間,要注意的是,轉換出來的年份值tm_year + 1900等於當前年份,月份值tm_mon + 1 等於當前月份;
        gmtime也是將日曆時間轉換爲年月日時分秒格式,但是沒有經過時區變換
        mktime則是將年月日時分秒格式時間轉換爲日曆時間

    [3]. char *asctime(const struct tm *time)   -- <time.h>
         char *ctime(const time_t *time)
        asctime將struct tm格式的日期時間轉換成格式化的字符串形式真實日期,轉換中自動處理了年份和月份的偏移量
        ctime將time_t格式的秒數轉換爲格式化的字符串形式真實日期

    [4]. int gettimeofday(struct timeval *tv,void *tz)  -- <sys/time.h>
        gettimeofday將日曆時間精確到微秒級別
        tz唯一的合法值是NULL,其他值將產生不確定的結果
        POSIX.1-2008指定該函數已經廢棄,由clock_gettime代替

    [5]. int clock_gettime(clockid_t clock_id,struct timespec *time)   -- <sys/time.h>
        clock_gettime將獲取的時間進一步精確到納秒級別
        clock_id用來選擇不同的時鐘基準,從而使該函數可以獲取不同的系統時間
                CLOCK_REALTIME  - 從1970-1-1 0:0:0開始計時,所以獲取的時間表示精確到納秒級別的日曆時間
                CLOCK_MONOTONIC - 從系統啓動開始計時,所以獲取的時間表示系統運行時間
                CLOCK_PROCESS_CPUTIME_ID    - 從本進程啓動開始計時,所以表示本進程的運行時間
                CLOCK_THREAD_CPUTIME_ID     - 從本線程啓動開始計時,所以表示本線程的運行時間





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章