UNIX系統的口令文件(POSIX.1則將其稱為用戶數據庫)包含了表6-1中所示的各字段,這些字段包含在<pwd.h>中定義的passwd結構中。
注意,POSIX.1只指定了passwd結構包含的10個字段中的5個。大多數平臺至少支持其中7個字段。
表6-1 /etc/passwd文件中的字段
由于歷史原因,口令文件存儲在/etc/passwd中,而且是一個ASCII文件。每一行包含6-1中所示的各字段,字段之間用冒號分隔。例如,在linux上,該文件中可能有下列四行:
root:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologinadm:x:3:4:adm:/var/adm:/sbin/nologin
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
關于這些登錄項請注意下列各點:
即使你所使用的系統并不支持finger命令,這些信息仍可存放在注釋字段中,該字段只是一個注釋,并不由系統使用程序解釋。
某些系統提供了vipw命令,允許管理員使用該命令編輯口令文件。vipw命令串行化對口令文件所作的更改,并且確保所作的更改與其他相關文件保持一致。系統也常常經由圖形用戶界面(GUI)提供類似的功能。
POSIX.1只定義了兩個獲取口令文件項的函數。在給出用戶登錄名或數值用戶ID后,這兩個函數就能查詢相關項。
#include <pwd.h>struct passwd *getpwuid( uid_t uid );struct passwd *getpwnam( const char *name );兩個函數返回值:若成功則返回指針,若出錯則返回NULL
getpwuid函數由ls(1)程序使用,它將i節點中的數值用戶ID映射為用戶登錄名。在鍵入登錄名時,getpwnam函數由login(1)程序使用。
這兩個函數都返回一個指向passwd結構的指針,該結構已由這兩個函數在執行時填入信息。passwd結構通常是相關函數內的靜態變量,只要調用相關函數,其內容就會被重寫。
如果要查看的只是指定的某個登錄名或用戶ID所對應的passwd記錄項,那么這兩個函數能滿足要求,但是也有些程序要查看整個口令文件。下列三個函數則可用于此種目的。
#include <pwd.h>struct passwd *getpwent( void );返回值:若成功則返回指針,若出錯或到達文件結尾則返回NULLvoid setpwent( void );void endpwent( void );
調用getpwent時,它返回口令文件中的下一個記錄項。如果上面所述的兩個POSIX.1函數一樣,它返回一個由它填寫好的passwd結構的指針。每次調用此函數時都重寫該結構。在第一次調用該函數時,它打開它所使用的各個文件。在使用本函數時,對口令文件中各個記錄項的安排順序并無要求。某些系統采用散列算法對/etc/passwd文件中的各項排序。
函數setpwent反繞它所使用的文件(rewinds to the beginning of the passWord database),endpwent則關閉這些文件(close the password database after all PRocessing has been performed)。在使用getpwent查看完口令文件后,一定要調用endpwent關閉這些文件。getpwent知道什么時間它應當打開它所使用的文件(第一次被調用時),但是它并不知道何時關閉這些文件。
程序清單6-1 getpwnam函數的一個實現
[root@localhost apue]# cat prog6-1.c#include <pwd.h>#include <stddef.h>#include <string.h>struct passwd *getpwnam( const char *name ){ struct passwd *ptr; setpwent(); while((ptr = getpwent()) != NULL) if(strcmp(name, ptr->pw_name) == 0) break; /* found a match */ endpwent(); return(ptr); /* ptr is NULL if no match found */}
在程序開始處調用setpwent是自我保護性的措施,以便在調用者在此之前已經調用getpwent打開了有關文件情況下,反繞有關文件使它們定位到文件開始處。getpwent和getpwuid調用完成后不應使有關文件仍處于打開狀態,所以應調用endpwent關閉它們。
本篇博文內容摘自《UNIX環境高級編程》(第二版)。關于本書的更多內容可參考:http://www.apuebook.com/。
新聞熱點
疑難解答