【Linux】shell命令与文件权限

目录

  • 前言
      • shell命令以及运行原理
      • Linux权限的概念
  • 1、文件访问者的分类(人)
  • 2、文件类型和访问权限(事物属性)
  • 3、文件权限值的表示方法
  • 4、文件访问权限的相关设置方法
    • 4.1、chmod指令
    • 4.2、chown指令
    • 4.3、chgrp指令
  • 5、目录的权限
  • 6、umask权限掩码
  • 7、粘滞位
  • 8、file指令(辨别文件类型)

前言

本篇文章进行Linux权限的学习!!!


shell命令以及运行原理

Linux严格意义上说的是一个操作系统,我们称之为“核心(kernel)“ ,但我们一般用户,不能直接使用kernel。而是通过kernel的“外壳”程序,也就是所谓的shell,来与kernel沟通

从技术角度, Shell的最简单定义:命令行解释器(command Interpreter)主要包含:

  • 将使用者(用户)的命令通过shell外壳翻译给核心(kernel)处理
  • 同时,将核心的处理结果翻译给使用者
  1. 对比windows GUI,我们操作windows 不是直接操作windows内核,而是通过图形接口,点击,从而完成我们的操作(比如进入D盘的操作,我们通常是双击D盘盘符.或者运行起来一个应用程序)

  2. shell 对于Linux,有相同的作用,主要是对我们的指令进行解析,解析指令给Linux内核。反馈结果在通过内核运行出结果,通过shell解析给用户

  • 帮助理解:如果说你是一个害羞的程序员,那shell就像媒婆,操作系统内核就是你们村头漂亮的且有让你心动的MM小花。你看上了小花,但是有不好意思直接表白,那就让你你家人找媒婆帮你提亲,所有的事情你都直接跟媒婆沟通,由媒婆转达你的意思给小花,而我们找到媒婆姓王,所以我们叫它王婆,它对应我们常使用的bash(命令处理器)

外壳存在的意义:

  • 保护OS系统,如果用户输入错误的命令,外壳会将其过滤或拦住,不会交给OS去执行
  • 外壳可以降低操作OS的成本,比如windows GUI(图形化界面)
[lyh_sky@localhost ~]$ shell
bash: shell: 未找到命令...
[lyh_sky@localhost ~]$ abcdef
bash: abcdef: 未找到命令...
[lyh_sky@localhost ~]$ ls
install.sh  Linux_Study  公共  模板  视频  图片  文档  下载  音乐  桌面

总结:windows的外壳就是图形化界面,相当于Linux中的Shell命令解析器,是用来翻译命令交给OS的


Linux权限的概念

1、文件访问者的分类(人)

Linux下分root用户和普通用户

[lyh_sky@localhost ~]$ whoami	 	// 普通用户的命令行提示符是$
lyh_sky
[lyh_sky@localhost ~]$ su root 	 	// 切换到root用户
密码: 							 	// 这里输入的密码是不回显的,实际上已经输入
[root@localhost lyh_sky]# whoami 	// root用户的命令行提示符是#
root
[root@localhost lyh_sky]# su lyh_sky	// 可以随意进入任何用户,且不用输入密码
[lyh_sky@localhost ~]$ whoami
lyh_sky
[lyh_sky@localhost ~]$ ll
总用量 4
-rw-r--r--.  1 root    root    827 91 19:07 install.sh
drwxrwxr-x. 10 lyh_sky lyh_sky 126 1025 15:59 Linux_Study

注意:root和普通用户在Linux下都必须设置密码,最好把root密码设置难一些


Linux中的具体用户分类:

  • 文件和文件目录的所有者: u — User(所属用户)
  • 文件和文件目录的所有者所在的组的用户: g — Group(文件所属组)
  • 其它用户: o — Others (文件其他用户)

root和普通用户可以是文件的所属者或所属组或其他用户


2、文件类型和访问权限(事物属性)

【Linux】shell命令与文件权限_第1张图片

文件的类型:

  • -:普通文件 — 文本、源代码、可执行程序、第三方的静态库等等
  • d:目录文件
  • l:链接文件(类似与Windows上的快捷方式)
  • b:块设备文件 — 硬盘、光驱等等
  • p:管道文件
  • c:字符设备文件 — 屏幕等串口设备
  • s:套接口文件

注意:

  • Linux不是以文件名后缀来区分文件的,而是通过ls-l指令显示的第一个字符区分文件类型的
  • Windows是以文件名后缀来区分文件类型的
[lyh_sky@localhost /]$ pwd
/
[lyh_sky@localhost /]$ ls -l
总用量 40
lrwxrwxrwx.   1 root root     7 820 13:03 bin -> usr/bin
dr-xr-xr-x.   5 root root  4096 92 09:28 boot
drwxr-xr-x.  20 root root  3300 1027 11:47 dev
drwxr-xr-x. 148 root root  8192 911 18:15 etc
drwxr-xr-x.   4 root root    32 98 13:08 home
lrwxrwxrwx.   1 root root     7 820 13:03 lib -> usr/lib
lrwxrwxrwx.   1 root root     9 820 13:03 lib64 -> usr/lib64
drwxr-xr-x.   2 root root     6 411 2018 media
drwxr-xr-x.   3 root root    18 91 15:39 mnt
drwxr-xr-x.   3 root root    16 820 13:08 opt
dr-xr-xr-x. 224 root root     0 1027 11:47 proc
dr-xr-x---.  10 root root  4096 1027 14:04 root
drwxr-xr-x.  45 root root  1300 1027 11:48 run
lrwxrwxrwx.   1 root root     8 820 13:03 sbin -> usr/sbin
drwxr-xr-x.   2 root root     6 411 2018 srv
dr-xr-xr-x.  13 root root     0 1027 11:47 sys
drwxrwxrwt.  70 root root 16384 1027 14:04 tmp
drwxr-xr-x.  13 root root   155 820 13:03 usr
drwxr-xr-x.  21 root root  4096 820 13:15 var

虽然Linux下是以符合来确定文件类型的,但是安装在Linux下的软件是按后缀区分的

[lyh_sky@localhost lesson8]$ ls
test.cpp
[lyh_sky@localhost lesson8]$ cat test.cpp 
#include 
using namespace std;

int main()
{
  cout << "hello world" << endl;
  return 0;
}
[lyh_sky@localhost lesson8]$ mv test.cpp test.txt
[lyh_sky@localhost lesson8]$ ls
test.txt
[lyh_sky@localhost lesson8]$ g++ test.txt -o test
test.txt: file not recognized: 不可识别的文件格式
collect2: 错误:ld 返回 1

文件的基本权限:

  • 读(r/4): Read对文件而言,具有读取文件内容的权限;对目录来说,具有浏览该目录信息的权限

  • 写(w/2):Write对文件而言,具有修改文件内容的权限;对目录来说具有删除移动目录内文件的权限

  • 可执行(x/1):execute对文件而言,具有执行文件的权限;对目录来说,具有进入目录的权限

注意:421对应八进制中的421,二进制中的100(4)、010(2)、001(1)


3、文件权限值的表示方法

  1. 字符表示方法

【Linux】shell命令与文件权限_第2张图片

  1. 八进制表示方法

【Linux】shell命令与文件权限_第3张图片


4、文件访问权限的相关设置方法

4.1、chmod指令

功能: 设置文件的访问权限
格式: chmod [参数] 权限 文件名

常用选项:

  • R -> 递归修改目录文件的权限
  • 说明:只有文件的拥有者和root才可以改变文件的权限

chmod命令权限的格式

用户表示符+/-=权限字符:

  • +:向权限范围增加权限代号所表示的权限
  • -:向权限范围取消权限代号所表示的权限
  • =:向权限范围赋予权限代号所表示的权限

用户符号:

  • u:拥有者
  • g:拥有者同组用
  • o:其它用户
  • a:所有用户

使用权限字符来修改文件权限

[lyh_sky@localhost lesson8]$ touch test.txt
[lyh_sky@localhost lesson8]$ ll
-rw-rw-r--. 1 lyh_sky lyh_sky 0 1027 15:42 test.txt

// 对拥有者去掉读权限
[lyh_sky@localhost lesson8]$ chmod u-r test.txt 
[lyh_sky@localhost lesson8]$ ll
--w-rw-r--. 1 lyh_sky lyh_sky 0 1027 15:42 test.txt

// 对拥有者加上读权限
[lyh_sky@localhost lesson8]$ chmod u+r test.txt 
[lyh_sky@localhost lesson8]$ ll
-rw-rw-r--. 1 lyh_sky lyh_sky 0 1027 15:42 test.txt

// 对Others增加读写权限
[lyh_sky@localhost lesson8]$ chmod o=rw test.txt 
[lyh_sky@localhost lesson8]$ ll
-rw-rw-rw-. 1 lyh_sky lyh_sky 0 1027 15:42 test.txt

// 对所有用户加上读写执行权限
[lyh_sky@localhost lesson8]$ chmod a+rwx test.txt 
[lyh_sky@localhost lesson8]$ ll
-rwxrwxrwx. 1 lyh_sky lyh_sky 0 1027 15:42 test.txt


使用三位8进制数字来修改文件权限:

// 000表示去掉全部用户的读写可执行权限
[lyh_sky@localhost lesson8]$ chmod 000 test.txt 
[lyh_sky@localhost lesson8]$ ll
----------. 1 lyh_sky lyh_sky 0 1027 15:42 test.txt

// 664 --- 表示加上文件拥有者和所属组的和写权限,但是其他用户只加上读权限
[lyh_sky@localhost lesson8]$ chmod 664 test.txt 
[lyh_sky@localhost lesson8]$ ll
-rw-rw-r--. 1 lyh_sky lyh_sky 0 1027 15:42 test.txt

// 777 --- 表示加上全部用户的读写可执行权限
[lyh_sky@localhost lesson8]$ chmod 777 test.txt 
[lyh_sky@localhost lesson8]$ ll
-rwxrwxrwx. 1 lyh_sky lyh_sky 0 1027 15:42 test.txt

注意:

  • 我们可以将八进制转换成二进制,二进制对应的就是权限
  • 权限由0和1表示,0表示没有权限,1表示有权限

4.2、chown指令

功能:修改文件的拥有者
格式: chown [参数] 用户名 文件名

实例:

[lyh_sky@localhost lesson8]$ sudo chown lhx test.txt 
[sudo] lyh_sky 的密码:
[lyh_sky@localhost lesson8]$ ll
-rwxrwxrwx. 1 lhx lyh_sky 0 1027 15:42 test.txt

[lyh_sky@localhost lesson8]$ sudo chown lyh_sky test.txt 
[lyh_sky@localhost lesson8]$ ll
-rwxrwxrwx. 1 lyh_sky lyh_sky 0 1027 15:42 test.txt

可以使用chown [参数] 用户名:用户名 文件/目录名 一键修改用户所属者和所属组

[lyh_sky@localhost lesson8]$ ll
总用量 0
-rwxrwxrwx. 1 lyh_sky lyh_sky 0 1027 15:42 test.txt

// 使用冒号一键修改所属者和所属组
[lyh_sky@localhost lesson8]$ sudo chown lhx:lhx test.txt 
[lyh_sky@localhost lesson8]$ ll
总用量 0
-rwxrwxrwx. 1 lhx lhx 0 1027 15:42 test.txt

注意:

  • 修改文件拥有者需要root用户才能修改,第一种方法:切换到root用户修改文件拥有者
  • 第二种方法:sudo短暂提升普通用户的权限至root

4.3、chgrp指令

功能:修改文件或目录的所属组
格式: chgrp [参数] 用户组名 文件名

常用选项:

  • -R 递归修改文件或目录的所属组
[lyh_sky@localhost lesson8]$ ll
总用量 0
-rwxrwxrwx. 1 lyh_sky lyh_sky 0 1027 15:42 test.txt

// 修改文件所属组为lhx
[lyh_sky@localhost lesson8]$ sudo chgrp lhx test.txt 
[lyh_sky@localhost lesson8]$ ll
总用量 0
-rwxrwxrwx. 1 lyh_sky lhx 0 1027 15:42 test.txt

5、目录的权限

目录的基本权限:

  • 读(r/4): 如果目录没有r权限,允许进入目录,允许在该目录下创建(写入)一个文件,不允许查看文件列表

  • 写(w/2):如果目录没有w权限,允许进入目录,允许在该目录下查看文件列表,但不允许创建和删除目录中文件/目录

  • 可执行(x/1):如果目录没有x权限,不允许进入目录

  • 如果同时没有rw权限,允许进入,但是不允许创建和查看目录下的文件列表(注意:不是文件内容!!!文件的内存是否可以查看,由文件自己的权限决定!!!)

[lyh_sky@localhost lesson8]$ ll
drwxrwxr-x. 2 lyh_sky lyh_sky 6 1027 18:16 dir

// 去掉可执行权限
[lyh_sky@localhost lesson8]$ chmod u-x dir
[lyh_sky@localhost lesson8]$ ll
drw-rwxr-x. 2 lyh_sky lyh_sky 6 1027 18:16 dir
[lyh_sky@localhost lesson8]$ cd dir
bash: cd: dir: 权限不够

// 去掉读权限
[lyh_sky@localhost lesson8]$ chmod u+x,u-r dir
[lyh_sky@localhost lesson8]$ ll
d-wxrwxr-x. 2 lyh_sky lyh_sky 6 1027 18:16 dir
[lyh_sky@localhost lesson8]$ cd dir
[lyh_sky@localhost dir]$ ll
ls: 无法打开目录.: 权限不够

// 去掉写权限
[lyh_sky@localhost lesson8]$ chmod u+rx,u-w dir
[lyh_sky@localhost lesson8]$ ll
dr-xrwxr-x. 2 lyh_sky lyh_sky 6 1027 18:16 dir

// 去掉写权限后不能创建或删除目录中的文件/目录
[lyh_sky@localhost lesson8]$ cd dir
[lyh_sky@localhost dir]$ ll
[lyh_sky@localhost dir]$ touch file.txt
touch: 无法创建"file.txt": 权限不够

6、umask权限掩码

为什么我们刚创建的目录权限默认是775,文件权限默认是664呢?(不同的系统可能有差异)

[lyh_sky@localhost lesson8]$ mkdir dir
[lyh_sky@localhost lesson8]$ touch file
[lyh_sky@localhost lesson8]$ ll
总用量 0
drwxrwxr-x. 2 lyh_sky lyh_sky 6 1027 19:27 dir
-rw-rw-r--. 1 lyh_sky lyh_sky 0 1027 19:27 file

因为我们创建的文件和目录都会受到umask(权限掩码)的影响:

  • 新建文件夹默认权限是:0666
  • 新建目录的默认权限是:0777
  • 但实际上你所创建的文件和目录,看到的权限往往不是上面这个值。原因就是创建文件或目录的时候还要受到umask权限掩码的影响
  • 假设默认权限是mask,则实际创建的出来的文件权限是:mask & (~umask)

默认权限 != 最终权限

格式: umask 权限值

说明:

  • 将现有的存取权限减去权限掩码后,即可产生建立文件时预设权限
  • 超级用户默认掩码值0022,普通用户默认为0002

【Linux】shell命令与文件权限_第4张图片


umask的使用:

[lyh_sky@localhost lesson8]$ whoami
lyh_sky
[lyh_sky@localhost lesson8]$ umask		// 查看权限掩码
0002

[lyh_sky@localhost lesson8]$ umask 003	// 设置权限掩码
[lyh_sky@localhost lesson8]$ umask
0003

7、粘滞位

当我们在公司多个小组进行协作开发时,就需要一个临时目录(/tmp)来保存文件

但是有一个问题:如果不小心删了文件怎么办?

// 保存临时文件的目录
[lyh_sky@localhost home]$ cd /tmp
[lyh_sky@localhost tmp]$ ls all -dl
drwxr-xrwx. 2 root root 21 91 10:32 all

[lyh_sky@localhost tmp]$ cd all
[lyh_sky@localhost all]$ ll
-rwxrwxrwx. 1 lhx lhx 12 91 00:08 lhx.txt    // 别人的文件

// 删除其他组成员的文件
[lyh_sky@localhost all]$ rm -rf lhx.txt
rm:是否删除有写保护的普通空文件 "/tmp/all/lhx.txt"? y
[lyh_sky@localhost all]$ ls

为了解决这个不科学的问题, Linux引入了粘滞位的概念

[root@localhost tmp]# pwd
/tmp
[root@localhost tmp]# ls all -dl
drwxr-xrwx. 2 root root 21 91 10:32 all
[root@localhost tmp]# chmod +t all			// 加上粘滞位
[root@localhost tmp]# ls all -dl
drwxr-xrwt. 2 root root 21 91 10:32 all // 目录中other的x权限变成了t

// 进入普通用户,删除该文件失败
[root@localhost tmp]# su lyh_sky
[lyh_sky@localhost tmp]$ cd all
[lyh_sky@localhost all]$ ls
lhx.txt
[lyh_sky@localhost all]$ rm lhx.txt 
rm: 无法删除"lhx.txt": 不允许的操作

当一个目录被设置为"粘滞位"(用chmod +t),则该目录下的文件只能由:

  • 超级管理员删除
  • 该目录的所有者删除
  • 该文件的所有者删除

8、file指令(辨别文件类型)

功能说明:辨识文件类型。
语法: file [选项] 文件或目录…

常用选项:

  • -c:详细显示指令执行过程,便于排错或分析程序执行的情形
  • -z:尝试去解读压缩文件的内容
[lyh_sky@localhost lesson7]$ ll
总用量 36
-rw-rw-r--. 1 lyh_sky lyh_sky    71 1022 16:11 makefile
-rwxrwxr-x. 1 lyh_sky lyh_sky 27072 1022 16:11 test
-rw-rw-r--. 1 lyh_sky lyh_sky  1561 1021 21:36 test.cpp

// C++源文件
[lyh_sky@localhost lesson7]$ file test.cpp 
test.cpp: C++ source, ASCII text

// 可执行文件
[lyh_sky@localhost lesson7]$ file test
test: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=a6a53d8a2d82b42768a1fe832e971613d2a09cfd, not stripped

你可能感兴趣的:(Linux,linux)