用户登录及权限设置

如何处理用户登录及权限设置?

struct passwd *pw; // used for /etc/passwd

struct spwd *spw; // used for /etc/shadow

char *username = "Pacific"; //用户名

char *input_passwd = "123456"; // 输入的密码

char *passwd;

char tmp[13];

 

if (getuid() != 0) { /* 只有root有权作此操作 */

printf("Login incorrect.\n");

return;

};

/* 取得/etc/passwd中间对应于本用户的数据结构 */

if ((pw = getpwnam(username)) == NULL) {

printf("Login incorrect.\n");

return;

};

/* 取得/etc/shadow中被隐藏的密码 */

spw = getspnam(username);

if (spw == NULL || (passwd = spw->sp_pwdp) == NULL) {

printf("Login incorrect.\n");

return;

};

 

/* 取得passwd的前12个字节作为种子 */

strncpy(tmp, passwd, 12);

/* 判断输入的密码加密后是否与原密码相同 */

if (strcmp(passwd, crypt(input_passwd, tmp)) != 0) {

/* 密码错误 */

printf("Login incorrect.\n");

return;

};

/* 密码正确,改变程序权限 */

setuid(pw->pw_uid);

 

/* 获得并进入用户根目录 */

if (pw->pw_dir) strncpy(path, pw->pw_dir, PATH_MAX);

else strcpy(path, "/");

chdir(path);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值