Shell外壳程序

在了解权限(Permission)之前,先感性地了解一下 shell 外壳程序。

操作系统的主要功能都是由 内核程序(Kernel) 来完成的,而用户直接操作内核是存在风险的,因此我们并非直接与内核打交道,而是通过一层外壳程序间接与 Kernel 交互。

在 Linux 中,Shell就是命令行的形式,在 Windows 中,就是以 图形化界面(GUI) 的形式。

Shell程序的意义:

  • 将用户命令翻译给 Kernel,将 Kernel 的处理结果翻译给用户,就像一个翻译官一样;
  • 设置权限,阻拦一般用户的非法操作,保护操作系统。

为什么 yarn 没有权限 为啥没有权限_bash

Linux下的shell程序其实就是一个文件:

[xyl@VM-8-5-centos ~]$ ls /usr/bin/bash -al
-rwxr-xr-x 1 root root 964536 Apr  1  2020 /usr/bin/bash

tips:

bash:全称Bourne-Again SHell,是shell程序的一种,是大多数类Unix操作系统的默认shell。

Bash_百度百科 (baidu.com)

权限Permission

所谓权限,就是用来限制普通人的。计算机来源于生活。在生活中我们知道,普通人在这个世界上处处受限,比如说没有vip就看不了很多电影、未成年就不能长时间肝原神(doge),等等。

一件事物,面对不同的对象,有不同的权限,所以权限需要从两方面看待:人 + 事物属性。例如对于公司的大楼,如果你是员工,就可以进去,如果你是闲杂人等,那么对不起禁止入内。

那么,在Linux中,权限 = 用户 + 文件属性

用户:

  • 普通用户
  • 超级用户root

文件属性:

  • 是否可读( r)
  • 是否可写(w)
  • 是否可执行(x)

我们看一下Linux下的 ls - l 操作:

[xyl@VM-8-5-centos ~]$ mkdir test
[xyl@VM-8-5-centos ~]$ cd test
[xyl@VM-8-5-centos test]$ touch test.c
[xyl@VM-8-5-centos test]$ touch test.txt
[xyl@VM-8-5-centos test]$ touch test.py
[xyl@VM-8-5-centos test]$ touch test.java
[xyl@VM-8-5-centos test]$ touch test.md
[xyl@VM-8-5-centos test]$ echo "helloWorld" > test.txt
[xyl@VM-8-5-centos test]$ ll
total 4
-rw-rw-r-- 1 xyl xyl  0 Nov 23 08:56 test.c
-rw-rw-r-- 1 xyl xyl  0 Nov 23 08:56 test.java
-rw-rw-r-- 1 xyl xyl  0 Nov 23 08:56 test.md
-rw-rw-r-- 1 xyl xyl  0 Nov 23 08:56 test.py
-rw-rw-r-- 1 xyl xyl 11 Nov 23 08:56 test.txt
[xyl@VM-8-5-centos test]$

其中,ll的第 [2,10] 列就描述的文件的权限问题,第 [2,4] 列表示该文件的拥有者的权限,第 [5,7] 列表示该文件的所属组的权限,第 [8,10]列表示该文件的other的权限。

tips:

  1. -表示的是没有该位置对应的权限,例如 rw-rw-r--表示:该文件的拥有者对该文件具有读、写权限,没有执行权限,以此类推。
  2. 如何理解拥有者、所属组、other?
  1. 答:其实就是一种角色身份的表示。例如生活中,我们每个人都是普通人(用户),但会有不同的角色身份,会由于处于不同的身份而对某件事情具有不同的权限和责任。
  2. 所属组:顾名思义,就是用来分组管理的,group里可以有多个用户,那么这些组内的用户对于这个文件就具有相同的权限。
  3. other:如果一个当前用户对于一个文件来说既不是拥有者,又不是所属组,那么就是other。
  1. ll命令的第3、4个内容分别指明了文件的拥有者、所属组。

su - 切换用户

[xyl@VM-8-5-centos test]$ man su
NAME
       su - run a command with substitute user and group ID

SYNOPSIS
       su [options...] [-] [user [args...]]

DESCRIPTION
       su allows to run commands with substitute user and group ID.

       When called without arguments su defaults to running an interactive shell as root.
       
       For  backward  compatibility  su defaults to not change the current directory and to only set the environment variables HOME and 	   SHELL(plus USER and LOGNAME if the target user is not root).  It is recommended to always use the --login option (instead it's 		 shortcut  -) to avoid side effects caused by mixing environments.
  • 不带任何选项默认切换为root;
  • 不带上-表示切换为新用户时不改变当前所处路径;
  • 带上-表示重新登录,进入新用户的家目录~
  • 切换用户需要输入对应用户的密码;
  • XShell软件热键:Ctrl + d退出当前用户至上一用户

sudo - 给单条命令提权

[xyl@VM-8-5-centos test]$ man sudo
NAME
     sudo, sudoedit — execute a command as another user

在命令前加上sudo,代表以super user(root)的身份执行该命令。

tips:用户必须要有sudo的许可才可以使用sudo,具体如何配置,后面会补充。

chmod - 更改文件权限

[xyl@VM-8-5-centos test]$ man chmod
NAME
       chmod - change file mode bits

使用方法:

  1. chmod u/g/o/a ± rwx FileName
  2. chmod 777 FileName

细节:

1.给文件拥有者添加执行权限:

[xyl@VM-8-5-centos test]$ ll
total 4
-rw-rw-r-- 1 xyl xyl  0 Nov 23 08:56 test.c
-rw-rw-r-- 1 xyl xyl  0 Nov 23 08:56 test.java
-rw-rw-r-- 1 xyl xyl  0 Nov 23 08:56 test.md
-rw-rw-r-- 1 xyl xyl  0 Nov 23 08:56 test.py
-rw-rw-r-- 1 xyl xyl 11 Nov 23 08:56 test.txt
[xyl@VM-8-5-centos test]$ chmod u+x test.c
[xyl@VM-8-5-centos test]$ ll
total 4
-rwxrw-r-- 1 xyl xyl  0 Nov 23 08:56 test.c
-rw-rw-r-- 1 xyl xyl  0 Nov 23 08:56 test.java
-rw-rw-r-- 1 xyl xyl  0 Nov 23 08:56 test.md
-rw-rw-r-- 1 xyl xyl  0 Nov 23 08:56 test.py
-rw-rw-r-- 1 xyl xyl 11 Nov 23 08:56 test.txt
[xyl@VM-8-5-centos test]$

其他的以此类推。u/g/o表示给文件拥有者/文件所属组/other加减权限,a表示的是同时给三种身份加减权限。

2.chmod 777 FileName

[xyl@VM-8-5-centos test]$ ll
total 4
-rwxrw-r-- 1 xyl xyl  0 Nov 23 08:56 test.c
-rw-rw-r-- 1 xyl xyl  0 Nov 23 08:56 test.java
-rw-rw-r-- 1 xyl xyl  0 Nov 23 08:56 test.md
-rw-rw-r-- 1 xyl xyl  0 Nov 23 08:56 test.py
-rw-rw-r-- 1 xyl xyl 11 Nov 23 08:56 test.txt
[xyl@VM-8-5-centos test]$ chmod 777 test.c
[xyl@VM-8-5-centos test]$ ll
total 4
-rwxrwxrwx 1 xyl xyl  0 Nov 23 08:56 test.c
-rw-rw-r-- 1 xyl xyl  0 Nov 23 08:56 test.java
-rw-rw-r-- 1 xyl xyl  0 Nov 23 08:56 test.md
-rw-rw-r-- 1 xyl xyl  0 Nov 23 08:56 test.py
-rw-rw-r-- 1 xyl xyl 11 Nov 23 08:56 test.txt
[xyl@VM-8-5-centos test]$

777是8进制数,翻译成二进制就是:111 111 111,表示9个权限位都有权限,即rwxrwxrwx

其他的以此类推。0表示无权限-

chown && chgrp - 更改文件所有者/所属组

更改文件的拥有者、所属组,都需要有更高级的权限。

其实很好理解,毕竟给别人东西,是需要征得对方的同意的,万一你给的是黑锅呢!但是我root无所不能,想要给谁就给谁,谁都无法拒绝!

[xyl@VM-8-5-centos test]$ su
Password: 
[root@VM-8-5-centos test]# chown xyl2 test.c
[root@VM-8-5-centos test]# ll
total 4
-rwxrwxrwx 1 xyl2 xyl  0 Nov 23 08:56 test.c
-rw-rw-r-- 1 xyl  xyl  0 Nov 23 08:56 test.java
-rw-rw-r-- 1 xyl  xyl  0 Nov 23 08:56 test.md
-rw-rw-r-- 1 xyl  xyl  0 Nov 23 08:56 test.py
-rw-rw-r-- 1 xyl  xyl 11 Nov 23 08:56 test.txt
[root@VM-8-5-centos test]#
[root@VM-8-5-centos test]# ll
total 4
-rwxrwxrwx 1 xyl2 xyl  0 Nov 23 08:56 test.c
-rw-rw-r-- 1 xyl  xyl  0 Nov 23 08:56 test.java
-rw-rw-r-- 1 xyl  xyl  0 Nov 23 08:56 test.md
-rw-rw-r-- 1 xyl  xyl  0 Nov 23 08:56 test.py
-rw-rw-r-- 1 xyl  xyl 11 Nov 23 08:56 test.txt
[root@VM-8-5-centos test]# chgrp root test.c
[root@VM-8-5-centos test]# ll
total 4
-rwxrwxrwx 1 xyl2 root  0 Nov 23 08:56 test.c
-rw-rw-r-- 1 xyl  xyl   0 Nov 23 08:56 test.java
-rw-rw-r-- 1 xyl  xyl   0 Nov 23 08:56 test.md
-rw-rw-r-- 1 xyl  xyl   0 Nov 23 08:56 test.py
-rw-rw-r-- 1 xyl  xyl  11 Nov 23 08:56 test.txt
[root@VM-8-5-centos test]#

补充

Linux file type

因为这里提到了ll命令,第1列表示的是文件的类型,就顺便来谈一谈Linux下的文件类型。

与Windows操作系统不同的是,Linux操作系统,不以文件后缀名区分文件类型,而是用文件属性来区分!

ll出来的第1列表示文件类型,有以下分类:

  • -表示普通文件:例如文本文件、可执行文件、归档文件等;
  • d表示目录;
  • b块设备(block):例如磁盘;
  • c字符设备:例如键盘、显示器;(Linux下一切皆文件,磁盘、键盘、显示器都看作文件)
  • p管道文件;
  • s网络套接字文件(socket);
  • l链接文件(link);

现阶段看得懂-d就行了,其他的以后慢慢了解。

Tips

但是虽然 Linux OS 不通过后缀名区分文件类型,不代表运行在Linux下的软件不这么做。

例如 gcc,就不可以编译.txt为后缀的文件。

因此,创建文件时建议还是带上后缀,此时 Linux OS 会把你的后缀看成FileName的一部分。