Linux系統編程27 系統數據文件和信息 - /etc/passwd 用戶信息文件和函數 getpwuid() getpwnam()

一 、/etc/passwd

我們發現
ls -l 顯示線程的 user名 和 group名
ls -n 顯示線程的 user id 和 group id

mhr@ubuntu:~$ ls -l
total 52
drwxr-xr-x 3 mhr mhr 4096 Sep  2  2019 Desktop
drwxr-xr-x 2 mhr mhr 4096 Sep  2  2019 Documents
drwxr-xr-x 2 mhr mhr 4096 Sep  2  2019 Downloads
-rw-r--r-- 1 mhr mhr 8980 Sep  2  2019 examples.desktop
drwxr-xr-x 2 mhr mhr 4096 Sep  2  2019 Music
drwxr-xr-x 2 mhr mhr 4096 Sep  2  2019 Pictures
drwxr-xr-x 2 mhr mhr 4096 Sep  2  2019 Public
drwxrwxr-x 2 mhr mhr 4096 Nov  9  2019 shiyan
drwxr-xr-x 2 mhr mhr 4096 Sep  2  2019 Templates
drwxr-xr-x 2 mhr mhr 4096 Sep  2  2019 Videos
drwxrwxr-x 8 mhr mhr 4096 Apr 16 08:17 work
mhr@ubuntu:~$ 
mhr@ubuntu:~$ 
mhr@ubuntu:~$ ls -n
total 52
drwxr-xr-x 3 1000 1000 4096 Sep  2  2019 Desktop
drwxr-xr-x 2 1000 1000 4096 Sep  2  2019 Documents
drwxr-xr-x 2 1000 1000 4096 Sep  2  2019 Downloads
-rw-r--r-- 1 1000 1000 8980 Sep  2  2019 examples.desktop
drwxr-xr-x 2 1000 1000 4096 Sep  2  2019 Music
drwxr-xr-x 2 1000 1000 4096 Sep  2  2019 Pictures
drwxr-xr-x 2 1000 1000 4096 Sep  2  2019 Public
drwxrwxr-x 2 1000 1000 4096 Nov  9  2019 shiyan
drwxr-xr-x 2 1000 1000 4096 Sep  2  2019 Templates
drwxr-xr-x 2 1000 1000 4096 Sep  2  2019 Videos
drwxrwxr-x 8 1000 1000 4096 Apr 16 08:17 work
mhr@ubuntu:~$ 

但我們自己實現 ls 系列命令的時候,需要使用 user名 和 group名,user id 和 group id 等信息,那這些信息存儲在什麼位置呢? 在 linux,unix系統中 這些信息存儲在 /etc/passwd 中而在 FreeBSD系統上,這些信息存儲在一個數據庫中。在HPUnix系統中,這些信息存儲在文件系統中。

在這裏插入圖片描述

mhr❌1000:1000:MHR,:/home/mhr:/bin/bash,
所以在 unix,linux 系統中 可以查找 /etc/passwd文件中的對應用戶名或di 等信息。

在這裏插入圖片描述

那麼各個系統 存儲 上述信息的位置不一樣,用戶使用就比較麻煩,所以就有了標準,標準就出來和稀泥了~
標準說:既然你們對這些信息的存儲的實現都不一樣,那麼我就統一一下標準實現吧。

getpwuid()
getpwnam()

NAME
getpwnam, getpwnam_r, getpwuid, getpwuid_r - get password file entry
通過 uid 或者 user name 來查詢用戶信息。
SYNOPSIS
#include <sys/types.h>
#include <pwd.h>

struct passwd *getpwnam(const char *name);
struct passwd *getpwuid(uid_t uid);

   The passwd structure is defined in <pwd.h> as follows:

       struct passwd {
           char   *pw_name;       /* username */
           char   *pw_passwd;     /* user password */
           uid_t   pw_uid;        /* user ID */
           gid_t   pw_gid;        /* group ID */
           char   *pw_gecos;      /* user information */
           char   *pw_dir;        /* home directory */
           char   *pw_shell;      /* shell program */
       };

注意不同系統的 passed 中的字段可能不一樣,具體需要看手冊!

實驗1 :使用 getpwuid() 獲取 passwd相關信息

#include<stdio.h>
#include<stdlib.h>
#include <sys/types.h>
#include <pwd.h>

int main(int argc,char *argv[])
{
	struct passwd *pwdline;
	if(argc < 2)
	{
		fprintf(stderr,"Usage:%s <src_file> <dest_file>\n",argv[0]);
		exit(1);
	}

	//atoi() : string --> int 轉換
	pwdline = getpwuid(atoi(argv[1]));

	//puts string  打印用戶名,打印字符換 直接而用 puts()
	puts(pwdline->pw_name);

	exit(0);
}


mhr@ubuntu:~/work/linux/muluheyonghucaozuo/27$ gcc getpwuid.c 
mhr@ubuntu:~/work/linux/muluheyonghucaozuo/27$ 
mhr@ubuntu:~/work/linux/muluheyonghucaozuo/27$ ./a.out 1000
mhr //我自己
mhr@ubuntu:~/work/linux/muluheyonghucaozuo/27$ 
mhr@ubuntu:~/work/linux/muluheyonghucaozuo/27$ 
mhr@ubuntu:~/work/linux/muluheyonghucaozuo/27$ ./a.out 0
root // uid 爲0  是 root 用戶
mhr@ubuntu:~/work/linux/muluheyonghucaozuo/27$ 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章