Linux操作系统文件访问权限详解

发布网友 发布时间:2022-03-21 03:29

我来回答

5个回答

懂视网 时间:2022-03-21 07:50

产品型号:Thinkpad E15

系统版本:centos8

linux文件权限详解

[root@xuegod63 ~]# ll /etc/passwd

-rw-r--r--. 1 root root 2053 9月  19 2017 /etc/passwd

文件权限基本解释:

-        rw-        r--       r--.     1 root root 2053 9月  19 2017 /etc/passwd

 其中:文件类型,可以为p、d、l、s、c、b和 –

p表示命名管道文件

d表示目录文件

l表示符号连接文件

-表示普通文件

s表示socket套接口文件,比如我们启用mysql时,会产生一个mysql.sock文件

c表示字符设备文件,例: 虚拟控制台 或tty0

b表示块设备文件   例: sda, cdrom

例:

[root@xuegod63 ~]# ll /dev/sda /dev/cdrom  /etc/passwd /dev/tty0

lrwxrwxrwx  1 root root    3 9月  19 2017 /dev/cdrom -> sr0

brw-rw----  1 root disk 8, 0 9月  19 2017 /dev/sda

crw--w----  1 root tty  4, 0 9月  19 2017 /dev/tty0

-rw-r--r--. 1 root root 2053 9月  19 2017 /etc/passwd   如下效果图:

 权限说明

对于文件来说:

r:读 cat

w:写 vim echo

x:执行 运行命名或者脚本

对于目录来说:

r:读(看到目录里面有什么)   ls

w:在目录里面建文件,删除,移动  touch mkdir  rm  mv cp

x:进入 cd 

文件拥有者

UGO:所有者--用户组--其它用户

所有者: 就是创建文件的用户,这个用户拥有对它所创建的文件的一切权限,所有者可以允许其所在的用户组可以访问所有者的文件。

用户组: 用户组是具有相同特征用户的逻辑集合,有时我们需要让多个用户具有相同的权限,比如查看、修改某一个文件的权限,一种方法是分别对多个用户进行文件访问授权,如果有10个用户的话,就需要授权10次,显然这种方法不太合理;另一种方法是建立一个组,让这个组具有查看、修改此文件的权限,然后将所有需要访问此文件的用户放入这个组中,那么所有用户就具有了和组一样的权限。这就是用户组。

其它用户:系统内的其他所有者用户就是other用户类

常见几种文件权限组成

- rwx --- ---:文件所有者对文件具有读取、写入和执行的权限。

- rwx r-- r--: 文件所有者具有读、写与执行的权限,用户组里用户及其他用户则具有读取的权限

- rw- rw- r-x:文件所有者与同组用户对文件具有读写的权限,而其他用户仅具有读取和执行的权限。

drwx--x—x: 目录所有者具有读写与进入目录的权限,其他用户近能进入该目录,却无法读取任何数据。

drwx------: 除了目录所有者具有完整的权限之外,其他用户对该目录完全没有任何权限。

举例如下:

每个用户都拥有自己的专属目录,通常放置/home下

[root@xuegod63 home]# ll /home/

总用量 0

drwx------. 3 user1 user1 78 9月  19 2017 user1

注: [rwx------]表示目录所有者本身拥有的权限,其它用户是无法进入的。 root可以。

例2: 你以什么用户身份登录,那么你创建的文件或目录,自动成为该文件的所属主和组

[root@xuegod63 home]# su -user1

上一次登录:二 9月 19 12:57:21 CST 2017:0 上

[user1@xuegod63 ~]$ 

[user1@xuegod63 ~]$ touch a.txt

[user1@xuegod63 ~]$ ll a.txt 

-rw-rw-r-- 1 user1 user1 0 5月   8 20:58 a.txt

总结:

文件权限基本解释:

-        rw-        r--       r--.     1 root root 2053 9月  19 2017 /etc/passwd

 其中:文件类型,可以为p、d、l、s、c、b和 –

p表示命名管道文件

d表示目录文件

l表示符号连接文件

-表示普通文件

s表示socket套接口文件,比如我们启用mysql时,会产生一个mysql.sock文件

c表示字符设备文件,例: 虚拟控制台 或tty0

b表示块设备文件   例: sda, cdrom

热心网友 时间:2022-03-21 04:58

一直以root登陆使用linux的人来说很少有权限被拒这种概念,但某些时候又深受权限拒绝困扰。
  知道为什么很多程序中需要使用getuid(),setuid()?为什么以普通权限登陆的用户不能进入/root,为什么在/目录下执行ls -l后可以显示root的信息,但ls /root -al却是权限不够?为什么有些文件夹可以继续创建文件,但就是不能ls?等等,相信看了此文就能明白。
  主要是学习笔记,不足之处请指正。
  CentOS 5.4 [testc@xxx 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 #include #include
  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中,可以通过adser 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 #include
  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,提升到读、写、执行权限。
  5,组权限操作实例此节演示相同组的成员之间共享资源,即不同uid但相同gid的用户共享同一组的资源。
  为了方便起见,我同时开了两个终端。
  "sh-3.2#"以root权限登陆的shell /bin/sh "[testa@xxx root]"以testa用户登陆的shell
  注:下文提到的“用户”是指/etc/passwd里定义的通过终端登陆的用户(此文即以下增加的三个账号名)。
  sh-3.2# useradd testa sh-3.2# useradd testb sh-3.2# useradd testc
  sh-3.2# tail -f /etc/passwd -n 4 sabayon:x:86:86:Sabayon user:/home/sabayon:/sbin/nologin testa:x:500:500::/home/testa:/bin/bash testb:x:501:501::/home/testb:/bin/bash testc:x:502:502::/home/testc:/bin/bash
  再开一个终端登陆testa,之前那个终端保持。
  sh-3.2# su testa [testa@xxx root]$ id uid=500(testa) gid=500(testa) groups=500(testa)
  [testa@xxx home]$ ls -al总计 28 drwxr-xr-x 5 root root 4096 02-21 22:52 . drwxr-xr-x 32 root root 4096 02-21 21:15 ……
  drwx—— 3 testa testa 4096 02-21 22:56 testa drwx—— 3 testb testb 4096 02-21 22:48 testb drwx—— 3 testc testc 4096 02-21 22:52 testc
  [testa@xxx home]$ cd testb bash: cd: testb: 权限不够
  通过root修改testb目录权限为770,即当前uid或者gid相同的用户均有读写执行权限。
  sh-3.2# cd /home/ sh-3.2# chmod 770 testb
  [testa@xxx home]$ ls -al总计 28 drwxr-xr-x 5 root root 4096 02-21 22:52 . drwxr-xr-x 32 root root 4096 02-21 21:15 ……
  drwx—— 3 testa testa 4096 02-21 22:56 testa drwxrwx—— 3 testb testb 4096 02-21 22:48 testb (here modify)
  drwx—— 3 testc testc 4096 02-21 22:52 testc
  [testa@xxx home]$ cd testb bash: cd: testb: 权限不够[testa@xxx root]$ id uid=500(testa) gid=500(testa) groups=500(testa)
  此时虽然开放了testb的所属组权限,但用户testa的gid=500(testa) groups=500(testa),它还不属于testb组。
  下面修改testa的gid为testb(或者增加其附属组groups值为testb)
  sh-3.2# usermod -G testb testa (增加用户testa的附属组testb)
  sh-3.2# id testa uid=500(testa) gid=500(testa) groups=500(testa),501(testb)
  此时testa终端需要重新登下,使刚才更改生效[testa@xxx root]$ exit exit [root@xxx ~]# su testa [testa@xxx root]$ id uid=500(testa) gid=500(testa) groups=500(testa),501(testb)
  [testa@xxx root]$ cd /home/ [testa@xxx home]$ ls -al总计 28 drwxr-xr-x 5 root root 4096 02-21 22:52 . drwxr-xr-x 32 root root 4096 02-21 21:15 ……
  drwx—— 3 testa testa 4096 02-21 22:56 testa drwxrwx—— 3 testb testb 4096 02-21 22:48 testb drwx—— 3 testc testc 4096 02-21 22:52 testc [testa@xxx home]$ cd testb [testa@xxx testb]$ pwd /home/testb
  以上是增加了用户testa的附属组testb,使其对于属于testb组的资源有了访问权限。
  下面再使用newgrp切换用户testa的gid.
  [testa@xxx testb]$ id uid=500(testa) gid=500(testa) groups=500(testa),501(testb)
  [testa@xxx testb]$ newgrp testb [testa@xxx testb]$ id uid=500(testa) gid=501(testb) groups=500(testa),501(testb)
  此时testa用户的gid已改为501(testb)。
  组之前的关系在文件/etc/group sh-3.2# tail -f /etc/group -n 4 sabayon:x:86:testa:x:500:testb:x:501:testa (最后一列:组内用户列表。即组testb里包含testa,testa属于testb组,大概就这意思吧……)
  testc:x:502:
  虽然知道控制组关系的文件,但不能直接修改些文件,否则执行newgrp时会出现"抱歉"错误提示。
  当然root用户权限是无*的,它访问文件时不需要进行权限检查。
  三、相关系统调用getuid();getgid();int setuid(uid_t uid);int setgid(gid_t gid);
  只有超级用户或者需要设置的uid和当前用户的uid一致才可以设置,否则返回-1,置errno = EPERM, errno可以通过strerror()翻译。
  其它:[testa@xxx home]$ su testa [testa@xxx home]$ sudo touch aa
  testa is not in the sudoers file. This incident will be reported.
  以root权限vim /etc/sudoers增加testa ALL=(ALL) ALL
  参考:APUE2E,1.8, 4.4, 8.11

热心网友 时间:2022-03-21 06:16

linux下文件权限分为四段:drwxrwxrwx
d表示这是一个目录,是一段,有时第一段也可能是l(l表示软连接)也可能没有,就用“-”表示
第二段是所属主权限,r:4(读取);w:2(写入);x:1(执行),rwx表示所属主用于所有权限,第三段和第四段也是一个意思,但第三段表示的是所属组,第四段表示的是其他人,懂了么?

热心网友 时间:2022-03-21 07:51

楼上说的很详细。

热心网友 时间:2022-03-21 09:42

rwx 421
声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。
E-MAIL:11247931@qq.com