歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux 文件訪問權限詳解

Linux 文件訪問權限詳解

日期:2017/2/28 15:55:11   编辑:Linux教程

一直以root登陸使用linux的人來說很少有權限被拒這種概念,但某些時候又深受權限拒絕困擾。
知道為什麼很多程序中需要使用getuid(),setuid()?為什麼以普通權限登陸的用戶不能進入/root,為什麼在/目錄下執行ls -l後可以顯示root的信息,但ls /root -al卻是權限不夠?為什麼有些文件夾可以繼續創建文件,但就是不能ls?等等,相信看了此文就能明白。

主要是學習筆記,不足之處請指正。

CentOS 5.4
[www.linuxidc.com@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


4,文件權限
不細講了
sh-3.2# ls -al
總計 483984
drwxr-x--- 13 root root 4096 02-22 00:01 .
drwxr-xr-x 32 root root 4096 02-21 21:15 ..
-rw-r--r-- 1 root root 464023491 10-25 22:33 3.3.005-080425.tgz
-rw------- 1 root root 9346 02-21 23:16 .bash_history
-rw-r--r-- 1 root root 24 2007-01-06 .bash_logout
-rw-r--r-- 1 root root 191 2007-01-06 .bash_profile
-rw-r--r-- 1 root root 176 2007-01-06 .bashrc
drwxrwxrwx 10 1000 users 4096 08-23 20:16 cflow-1.3
-rw-r--r-- 1 root root 759691 08-23 20:13 cflow.tar.gz
-rw-r--r-- 1 root root 100 2007-01-06 .cshrc
-rwxr-xr-x 1 root root 582 11-11 21:48 delete_M.sh
-rw-r--r-- 1 root root 2518 11-11 20:25 .dir_colors

主要是最左邊一列:drwxr-x---
10個字符,最左邊是文件類型,-默認為普通文件;d:目錄文件;l符號鏈接……
後面9個,3個一組共三組,分別表示所屬用戶uid的權限;所屬組或者附屬組gid的權限;其它權限。
三個字符分別是讀、寫、執行權限
讀4,寫2, 執行1

所以chmod 777 test.c,提升到讀、寫、執行權限。

Copyright © Linux教程網 All Rights Reserved