1.一切皆文件
linux操作系統的特點就是一切皆文件,所以僅通過操作文件就可以操作linux的所有。
2.口令文件
/etc/passwd
這些字段定義在<pwd.h>中定義的passwd結構中
char *pw_name //用戶名
char *pw_passwd //加密口令
uid_t pw_uid //數值用戶ID
gid_t pw_gid //數值組ID
char *pw_gecos //註釋字段
char *pw_dir //初始工作目錄
char *pw_shell //初始shell(用戶程序)
char *pw_class //用戶訪問類
time_t pw_change //下次更改口令時間
time_t pw_expire //賬戶到期的時間
在linux系統上,該文件中表示如下:
root:x:0:0:/root:/bin/bash
用戶名:加密口令:用戶ID:組ID:工作目錄:shell
獲取口令文件的函數:
#include <pwd.h>
struct passwd *getpwuid(uid_t uid);
struct passwd *getpwnam(const char *name);
//成功返回指針,出錯返回NULL
3.陰影口令
/etc/shadow
陰影口令是經單項加密算法處理過的用戶口令副本。這些字段定義在<shadow.h>中的shadow結構中
char *sp_name //用戶登錄名
char *sp_pwdp //加密口令
int sp_lstchg //上次更改口令以來經過的時間
int sp_min //經過多少天后允許更改
int sp_max //要求更改尚餘天數
int sp_warn //到期警告天數
int sp_inact //賬戶不活動之前尚餘天數
int sp_expire //賬戶到期天數
unsigned int sp_flag //保留
訪問陰影口令文件
#include <shadow.h>
struct spwd *getspnam(const char *name);
struct spwd *getspent(void);
//成功返回指針,失敗返回NULL
void setspent(void);
void endspent(void);
4.組文件
/etc/group
這些文件定義在<grp.h>中所定義的group
char *gr_name //組名
char *gr_passwd //加密口令
int gr_gid //數值組ID
char **gr_mem //指向各用戶名的指針的數組
查看組名或數值組ID
#include <grp.h>
struct group *getgrgid(gid_t gid);
struct group *getgrnam(const char *name);
//成功返回指針,出錯返回NULL
5.附加組ID
我們不僅可以屬於口令文件記錄項中的組ID所對應的組,也可以屬於多達16個另外的組。
爲了獲取和設置附加組ID,有以下函數
#include <unistd.h>
int getgroups(int gidsetsize, gid_t grouplist[]);
//成功則返回附加組ID數,若出錯則返回-1
#include <grp.h>
#include <unistd.h>
int setgroups(int ngroups, const gid_t grouplist[]);
#include <grp.h>
#include <unistd.h>
int initgroups(const char *username, gid_t basegid);
//成功返回0, 錯誤返回-1
6.登錄賬戶記錄結構
struct utmp {
char ut_line[8];
char ut_name[8];
long ut_time;
};
7.時間和日期
time函數返回當前時間和日期
#include <time.h>
time_t time(time_t calptr);
//成功返回時間,失敗返回-1,若參數不爲空,則時間也存放在由calptr所指向的空間裏
下面這個函數將時間精確到最高爲微秒級
#include <sys/time.h>
int gettimeofday(struct timeval *restrict tp, void *restrict tzp);
//總是返回0
timeval{
time_t tv_sec; //秒
long tv_usec; //微秒
};
下面兩個函數將日曆時間轉換到以年月日十分秒結構的時間格式存放在struct tm中
struct tm {
int tm_sec; //秒(0-59)
int tm_min; //分(0-59)
int tm_hour; //時(0-23)
int tm_mday; //月日期(1-31)
int tm_mon; //月,從一月到現在經過的月份(0-11)
int tm_year; //年,從1900年到現在經過的年
int tm_wday; //星期日期(0-6),0代表Sunday
int tm_yday; //年日期(0-365)
int tm_isdst; //夏令時的標識,若實行夏令時該值爲正,若不實行則爲0,不瞭解爲負
};
#include <time.h>
struct tm *gmtime(const time_t *calptr); //轉換成國際標準時間
struct tm *localtime(const time_t *calptr); //轉換成本地時間
//返回指向struct tm結構體的指針
下面的函數將年月日等作爲參數,轉換成time_t類型
#include <time.h>
time_t mktime(struct tm *tmptr);
下面函數將時間轉換成大家熟悉的26的字節的字符串
#include <time.h>
char *asctime(const struct tm *tmptr);
char *ctime(const time_t *calptr);
//指向以null結尾的字符串的指針
下面函數是自定義時間格式:
#include <time.h>
size_t strftime(char *restrict buf, size_t maxsize,
const char *restrict format,
const struct tm *restrict tmptr);
//成功返回存到buf中的字符數,否則返回0
strftime的轉換說明
%a 星期幾的簡寫
%A 星期幾的全稱
%b 月份的簡寫
%B 月份的全稱
%c 標準的日期的時間串
%C 年份的後兩位數字
%d 十進制表示的每月的第幾天
%D 月/天/年
%e 在兩字符域中,十進制表示的每月的第幾天
%F 年-月-日
%g 年份的後兩位數字,使用基於周的年
%G 年份,使用基於周的年
%h 簡寫的月份名
%H 24小時制的小時
%I 12小時制的小時
%j 十進制表示的每年的第幾天
%m 十進制表示的月份
%M 十時製表示的分鐘數
%n 新行符
%p 本地的AM或PM的等價顯示
%r 12小時的時間
%R 顯示小時和分鐘:hh:mm
%S 十進制的秒數
%t 水平製表符
%T 顯示時分秒:hh:mm:ss
%u 每週的第幾天,星期一爲第一天 (值從0到6,星期一爲0)
%U 第年的第幾周,把星期日作爲第一天(值從0到53)
%V 每年的第幾周,使用基於周的年
%w 十進制表示的星期幾(值從0到6,星期天爲0)
%W 每年的第幾周,把星期一做爲第一天(值從0到53)
%x 標準的日期串
%X 標準的時間串
%y 不帶世紀的十進制年份(值從0到99)
%Y 帶世紀部分的十制年份
%z,%Z 時區名稱,如果不能得到時區名稱則返回空字符。
%% 百分號