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 - 從本線程啓動開始計時,所以表示本線程的運行時間
口令文件記錄了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 - 從本線程啓動開始計時,所以表示本線程的運行時間
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.