目录
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:中