linux上每個使用者都擁有乙個唯一的使用者名稱和乙個相對應的使用者id(uid),使用者可以隸屬於乙個或多個組。每個組也擁有乙個唯一的組名和組id(gid)。使用者和組主要是用來控制資源訪問許可權的。
每個使用者都會在此檔案裡有一條記錄,每條記錄包含7個字段。
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
登入名,密碼佔位符(通常為x,密碼加密後實際存在/etc/shadow檔案裡),uid,gid,注釋,登入後的主目錄,登入的shell(登入後便交由這個程式控制/sbin/nologin代表此賬號不能登入)
在密碼檔案中,允許(但不常見)同一使用者id擁有多條記錄,從而使得同一使用者id可以有多個登入名。記錄密碼檔案/etc/shadow
記錄組資訊的檔案:/etc/group
root:x:0:
bin:x:1:
組名,組密碼佔位符(一般為x),組id,組下的使用者列表。
假設u_1,u_2都屬於root組,那麼上面這條記錄應該是這個樣子
root:x:0:u_1,u_2
從/etc/passwd獲取資訊
#include struct passwd
;struct passwd *getpwnam(const char *name);
struct passwd *getpwuid(uid_t uid);
/*成功返回struct passwd指標,返回null代表錯誤或找不到
*/
getpwnam()根據使用者名稱獲取而getpwuid根據uid獲取資訊,返回的指標指向靜態分配的記憶體,任何一次呼叫都會覆蓋之前的內容。
#include #include #include int main(int argc, char **argv)
printf("name: %s\n", pwd->pw_name);
}
從/etc/group獲取資訊
#include struct group;
struct group *getgrnam(const char *name);
struct group *getgrgid(gid_t gid);
//失敗返回null
用法行為跟上兩個函式相同。從/etc/shadow檔案獲取資訊
#include struct spwd;
struct spwd *getspnam(const char *name);
逐行讀取/etc/passwd和/etc/group和/etc/shadow檔案
#include struct passwd *getpwent(void); //會開啟/etc/passwd檔案
void setpwent(void); //游標移動到檔案開始處
void endpwent(void); //關閉/etc/passwd檔案
#include struct group *getgrent(void); //會開啟/etc/group檔案
void setgrent(void); //游標移動到檔案開始處
void endgrent(void); //會關閉/etc/group檔案
#include struct spwd *getspent(void);
void setspent(void);
void endspent(void);
#include #include #include int main(int argc, char **argv)
/*root 0
bin 1
daemon 2
adm 3
lp 4
sync 5
shutdown 6
...*/
校驗使用者密碼
#define _xopen_source
#include char *crypt(const char *key, const char *salt);
/etc/shadow的密碼是用過單項加密的,所以驗證密碼的唯一方法是使用同一演算法對使用者提供的明文密碼進行加密,然後跟/etc/shadow中的密碼進行匹配。salt引數指向乙個2字元的字串用來改變des演算法,為了讓密碼更難以破解。由crypt()所返回的經過加密的密碼中,頭2個字元是對原始salt值得拷貝,也就是說加密密碼時,salt引數可以從/etc/shadow內獲得。
編譯程式需要帶上-lcrypt選項
#define _bsd_source /* get getpass() declaration from */
#define _xopen_source /* get crypt() declaration from */
#include #include #include #include #include #include #include #include typedef unsigned char u_char;
int main(int argc, char *argv)else
//獲取/etc/passwd記錄
pwd = getpwnam(username);
if (pwd == null)
//獲取/etc/shadow記錄
spwd = getspnam(username);
if (spwd == null && errno == eacces)
if (spwd != null) /* if there is a shadow password record */
pwd->pw_passwd = spwd->sp_pwdp; /* use the shadow password */
password = getpass("password: ");
encrypted = crypt(password, pwd->pw_passwd);
for (p = password; *p != '\0'; )
*p++ = '\0';
if (encrypted == null)
return 1;
authok = strcmp(encrypted, pwd->pw_passwd) == 0;
if (!authok)
printf("successfully authenticated: uid=%ld\n", (long) pwd->pw_uid);
return 0;
}//gcc main.c -lcrypt
linux 組和使用者
linux 組 1 新增組 groupadd 選項 使用者組 g gid 指定新使用者組的組標識號 gid o 一般與 g選項同時使用,表示新使用者組的gid可以與系統已有使用者組的gid相同。root localhost groupadd teacher root localhost groupa...
linux使用者和組
使用者建立 useradd useradd options login u uid uid min,uid max 定義在 etc login.defs g gid 指明使用者所屬基本組,可為組名,也可以gid c comment 使用者的注釋資訊 d path to home dir 以指定的路徑...
Linux使用者和組
廣義上講,linux的賬戶包括使用者賬戶和組賬戶2種。使用者賬戶,簡稱使用者,組賬戶簡稱組。組是使用者的集合,在red hat linux中組有私有組和標準租2種型別。在建立乙個新的使用者時,若沒有指定其所屬的組,red hat就建立乙個和該使用者同名的私有組。此私有組這個使用者自己。標準組可容納多...