一 、/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$