Linux文件系统【01】文件目录,文件分类,文件权限,自己实现简易chmod命令。

目录

1 ,文件目录:

2, 文件分类:

3, 文件权限:

4, 下面是自己实现的chmod命令的代码:

可执行文件不用./的相关设置


1 ,文件目录:

(1)/bin 存放普通用户指令,例如ls,cp,mkdir等等

(2)/boot Linux内核以及启动系统是需要的文件。当电脑启动时,将进行,引导。

        解释一下引导,引导就是一个复杂的目标,可以通过一个小的动作开始,然后这个小的动

        作引起另一个动作,最后达成目标,完成操作系统的初始化。电脑就是这样,而内核则是

        引导的最后一个动作启动的程序。内核是一直运行的。

(3)/dev 设备文件的存储目录,例如硬盘光驱等等;

(4)/etc 存放系统的配置文件。例如用户的账号密码;

(5)/home 普通用户的主目录。例如在这个主机注册过test101以及test102用户,那么home下将包 涵test101,test102目录文件;

(6)/lib 各种库文件;

(7)/proc 虚拟文件系统,系统运行时才会存在,存放一些命令等等,例如cat,string等等,可以查看系统的状态,配置信息等等;

(8)/root 超级用户root的主目录

(9)/sbin 存放用于管理系统的命令的文件

(10)/tmp 临时文件目录

(11)/usr 用于存放系统应用程序以及相关文件,例如说明文档,帮助文件;

(12)/var 用于存放系统中经常变化的文件

2, 文件分类:

(1)普通文件

(2)目录文件。文件内容:目录下文件以及子目录信息。权限:拥有对于该目录文件读许可权的进程都可以读该目录文件的内容,但是只有内核才有写目录文件的权限

(3)字符特殊文件。表示系统中字符类型的设备,例如键盘鼠标等等;

(4)块特殊文件。表示系统中块类型的设备,例如硬盘光驱等等;对于这些设备上的数据访问通常以块的方式进行,即一次至少读写一个块;

(5)FIFO。用于进程间的通信,也称为命名管道;

(6)套接字。网络通信,也可以用于一台主机进程之间的通信;

(7)符号连接。指向另一个文件,是另一个文件的引用。

3, 文件权限:

ls -l可以看到十位连在一起的字母或者符号;

 第一位是文件类型,d代表文件为目录文件,-代表文件为普普通文件,b代表文件是块特殊文件;后面九位每三位分别表示所有者,所有组,其他人员拥有的权限,rwx分别表示可读可写可执行;3是文件数;之后的两个test101分别是文件所有者,所有者所属的组,文件大小,文件创建时间,以及文件名字;

(以下三个权限说明参考特殊文件权限(setuid、setgid 和 Sticky 位) - eastson - 博客园 (cnblogs.com)

setuid 权限

对可执行文件设置 setuid 权限时,将对运行该文件的进程授予基于文件属主的访问权限。该访问权限不是基于正在运行可执行文件的用户。使用此特殊权限,用户可以访问通常只有属主才可访问的文件和目录。

例如

-r-sr-sr-x   3 root     sys       28144 Jun 17 12:02 /usr/bin/passwd

此特殊权限会带来安全风险。一些确定的用户甚至可以在 setuid 进程执行完毕后,找到保持由该进程授予他们的权限的方法。
分析一下,/etc/passwd的权限为 -rw-r--r-- 也就是说:该文件的所有者拥有读写的权限,而用户组成员和其它成员只有查看的权限。我们知道,在系统中我们要修改一个用户的密码,root用户和普通用户均可以用/usr/bin/passwd someuser这个命令来修改这个/etc/passwd这个文件,root用户本身拥有对/etc/passwd的写权限,无可厚非;那普通用户呢,这里就用到了setuid,setuid的作用是“让执行该命令的用户以该命令拥有者的权限去执行”,就是普通用户执行passwd时会拥有root的权限,这样就可以修改/etc/passwd这个文件了。它的标志为:s,会出现在x的地方,例:-rwsr-xr-x 

setgid 权限

setgid 权限与 setuid 权限类似。可将进程的有效组 ID (group ID, GID) 更改为拥有该文件的组,并基于授予该组的权限对用户授权访问权限

-r-x--s--x   1 root   mail     67504 Jun 17 12:01 /usr/bin/mail

将 setgid 权限应用于目录时,该目录中已创建的文件将属于该目录所属于的组。这些文件不属于创建进程所属于的组。在目录中拥有写和执行权限的任何用户都可以在其中创建文件。但是,文件将属于拥有该目录的组,而不是用户所属于的组。

Sticky 位

sticky 位是保护目录中文件的权限位。如果对目录设置了 sticky 位,则只有文件属主、目录属主或特权用户才可以删除文件。root 用户和主管理员角色即是特权用户。sticky 位禁止用户从公共目录(如 /tmp)中删除其他用户的文件:

drwxrwxrwt 7  root  sys   400 Sep  3 13:37 tmp

在 TMPFS 文件系统中设置公共目录时,务必手动设置 sticky 位。
我们知道/tmp是系统的临时文件目录,所有的用户在该目录下拥有所有的权限,也就是说在该目录下可以任意创建、修改、删除文件,那如果用户A在该目录下创建了一个文件,用户B将该文件删除了,这种情况我们是不能允许的。为了达到该目的,就出现了stick bit(粘滞位)的概念。它是针对目录来说的,如果该目录设置了stick bit(粘滞位),则该目录下的文件除了该文件的文件属主、目录属主或特权用户可以删除和修改/tmp目录下的stuff,别的用户均不能动别人的,这就是粘滞位的作用。 

(1)权限的修改:

(a)shell命令修改:chmod;例如chmod  777  test101.c;意思是修改test.c文件的权限为所有者,所有组,其他人员都为可读可写可执行。其中的7由r=4,w=2,x=1可得;

chmod u+s xxx  # 设置setuid权限 
chmod g+s xxx  # 设置setgid权限 
chmod o+t xxx   # 设置stick bit权限,针对目录 
chmod 4775 xxx # 设置setuid权限 
chmod 2775 xxx # 设置setgid权限 
chmod 1775 xxx # 设置stick bit权限,针对目录

(b)函数修改:chmod/fchmod

#include<sys/types.h>

#include<sys/stat.h>

int chmod(const char *path,mode_t mode);

int fchmod(int fildes,mode_t mode);

chmod用文件名作为第一个参数,fchmod用文件描述符作为第一个参数;

参数mode如下:

 权限修改成功返回0,失败返回-1;

4, 下面是自己实现的chmod命令的代码:

#include<sys/stat.h>
#include<sys/types.h>
#include<stdlib.h>
#include<stdio.h>

int main(int argc,char ** argv)
{
    int mode;     //总权限
    int mode_u;    //所有者权限
    int mode_g;    //所属组权限
    int mode_o;    //其他人权限
    char *path;    //文件路径以及文件名

    //检查参数个数是否合法
    if(argc<3)
    {
        printf("%s<mode num><target file>\n",argv[0]);
        exit(0);
    }

    //将字符串装换成整数,例如atoi(111)返回整数111;
    mode=atoi(argv[1]);

    //整数是否合法
    if(mode>777||mode<0)
    {
        printf("mode num error");
        exit(0);
    }
    
    //十进制转换成八进制
    mode_u=mode/100;
    mode_g=(mode-mode_u*100)/10;
    mode_o=mode-(mode_u*100)-(mode_g*10);
    mode=(mode_u*8*8)+(mode_g*8)+mode_o;    //这部分为什么mode去这个值看本文上面的参数mode八进制代表的意义。

    //路径
    path=argv[2];

    //利用chmod实现
    if(chmod(path,mode)==-1)
    {
        perror("chmod error");
        exit(1);
    }
    return 0;
}

可执行文件不用./的相关设置

 注意,执行my_chmod命令时需要在命令所以在文件目录下,然后./my_chmod。

因为(参考Linux 运行可执行文件为什么要加“./”_devilzcl的博客-CSDN博客

当使用命令行运行可执行文件时:

(1)Windows 会搜索当前目录和 PATH 变量,所以不用加 “./”。

(2)Linux 不会搜索当前目录,它会到 PATH 环境变量的路径去搜索程序文件,所以需要加上 “./” 来指定到当前目录下去查找应用程序,如果不想加 “./” ,可以直接到把点号加到环境变量 PATH 中即可。

或者可以(来自把文件放在哪个文件夹下,Linux执行命令时不需要写路径_百度知道 (baidu.com))(我没试过)

使用 echo $PATH

可以显示 $PATH 变量,输出如下:
/usr/local/sbin: /usr/local/bin : /usr/sbin : /usr/bin: /sbin :/bin:/usr/bin/X11: /usr/games :/usr/X11R6/bin

可以修改 /etc/environment 文件来设定您的命令搜索路径,找到 PATH 起始的行
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin"

在双引号中添加您的自定义路径,并以 : 分隔。
比如说在双引号中最后加入:~/bin 保存
并把你的文件放入你主目录下的bin文件夹中就可以的了

或者放在/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin:/root/bin:中

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值