一直以root登陆使用linux的人来说很少有权限被拒这种概念,但某些时候又深受权限拒绝困扰。
知道为什么很多程序中需要使用getuid(),setuid()?为什么以普通权限登陆的用户不能进入/root,为什么在/目录下执行ls -l后可以显示root的信息,但ls /root -al却是权限不够?为什么有些文件夹可以继续创建文件,但就是不能ls?等等,相信看了此文就能明白。
主要是学习笔记,不足之处请指正。
CentOS 5.4
[@linuxidc opt]$ uname -a
Linux xxx 2.6.18-164.el5xen #1 SMP Thu Sep 3 04:47:32 EDT 2009 i686 i686 i386 GNU/Linux
一、口令文件
1,格式
存储文件/etc/passwd,格式如下:
root:x:0:0:root:/root:/bin/bash
aaa:x:501:501:bj, bj, 8111111,136000111:/home/aaa:/bin/bash
用户名:加密密码:用户ID:组ID:注释:工作目录:shell:
默认情况是第一行的格式;注释字段可以自行修改,用逗号隔开,如第二行格式,这主要是给finger命令使用时可解析。
可以vi /etc/passwd修改,但为了保证其格式的正确性,请用vipw命令编译此文件。
sh-3.2# finger aaa
Login: aaa Name: bj
Directory: /home/aaa Shell: /bin/bash
Office: bj, 8111111 Home Phone: 136000111
Never logged in.
No mail.
No Plan.
2,编程实例
/*getpwnam_pwuid.c*/
#include <pwd.h>
#include <stdlib.h>
#include <stdio.h>
int main(void)
{
//struct passwd *pwd = getpwnam("aaa");
struct passwd *pwd = getpwuid(501);
if(pwd == NULL)
{
printf("err.\n");
return 1;
}
printf("name:%s\n", pwd->pw_name);
printf("passwd:%s\n", pwd->pw_passwd);
printf("description:%s\n", pwd->pw_gecos);
printf("uid:%d\n", pwd->pw_uid);
printf("gid:%d\n", pwd->pw_gid);
printf("dir:%s\n", pwd->pw_dir);
printf("shell:%s\n", pwd->pw_shell);
return 0;
}
sh-3.2# gcc getpwnam_pwuid.c -o app
sh-3.2# ./app
name:aaa
passwd:x
description:bj, bj, 8111111,136000111
uid:501
gid:501
dir:/home/aaa
shell:/bin/bash
二、组文件
1,格式
存储文件/etc/group,格式如下
root:x:0:root
bin:x:1:root,bin,daemon
aaa:x:501:
组名:加密密码:组ID:指向的各用户名
2,改变文件uid和gid.
sh-3.2# pwd
/root/study
sh-3.2# ls -al
-rw-r--r-- 1 root root 397 10-11 03:23 test.c
chgrp 改变所属组ID,当然只有root权限才可以修改。
sh-3.2# chgrp aaa test.c
sh-3.2# ls -al
-rw-r--r-- 1 root aaa 397 10-11 03:23 test.c
这个aaa就是新组名,其在/etc/group中,可以通过adduser aaa自行添加
sh-3.2# cat /etc/group
root:x:0:root
bin:x:1:root,bin,daemon
daemon:x:2:root,bin,daemon
.
.
.
gdm:x:42:
sabayon:x:86:
plmtest:x:500:
aaa:x:501:
chown 改变用户ID或组ID
sh-3.2# chown aaa:aaa test.c
sh-3.2# ls -al
-rw-r--r-- 1 aaa aaa 397 10-11 03:23 test.c
3,编程实例
/*getgrnam.c*/
#include <grp.h>
#include <stdio.h>
int main(int argc, char *argv[])
{
if(argv[1] == NULL)
{
printf("input error.\n");
return 1;
}
struct group *gp = getgrnam(argv[1]);
if(gp == NULL)
{
printf("err.\n");
return 1;
}
printf("name:%s\n", gp->gr_name);
printf("psswd:%s\n", gp->gr_passwd);
printf("gid:%d\n", gp->gr_gid);
int i;
for(i = 0; gp->gr_mem[i] != NULL; i++)
{
printf("group name:%s\n", gp->gr_mem[i]);
}
return 0;
}
sh-3.2# gcc getgrnam.c -o app
sh-3.2# ./app bin
name:bin
psswd:x
gid:1
group name:root
group name:bin
group name:daemon