暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Linux用户和权限之二

oracleace 2022-09-01
763


01

文件和目录权限


权限对文件的影响对目录的影响
r(读取)可读取文件内容可列出目录内容
w(写入)可修改文件内容可在目录中创建删除内容
x(执行)可作为命令执行可访问目录内容
    root@yaoyuan ~# ll -d var/lib/
    drwxr-xr-x. 62 root root 4096 Jun 21 17:20 var/lib/
    root@yaoyuan ~# ll -d var/lib/mysql
    drwxr-x--x. 7 mysql mysql 4096 Jul 19 14:30 var/lib/mysql
    root@yaoyuan hr# ll var/lib|grep ^d|wc
    60 540 421
    root@yaoyuan hr# ll var/lib/mysql|grep ^d|wc
    5 45 285

    d表示目录 62和7为该目录下子目录的数量

    chmod

    修改某个用户、组对文件夹的权限,用命令chmod实现,其中用户以augo代指,+、-、=代表加入、删除和等于对应权限,具体案例如下

    取消用户对dir1目录的进入权限:chmod    u-x  dir1

    授予同组用户对dir1目录的写权限:chmod   g+w  dir1

    递归授予其他人对dir1目录的写权限:chmod  -R  o+w  dir1

    对所用户赋予文件的执行权限:chmod a+x testfile  常用于shell程序

    Linux 系统还为每种权限(r、w 和 x)分配了对应的数字:

    权限数字
    r4
    w2
    x1

    如果我们要合并这些权限,就需要做简单的加法了:将对应的数字相加。假如我们要分配读、写权限,那么我们就要用 4+2,就等于 6。数字 6 表示具有读和写权限。以下是可能的组合形式:

    权限数字计算
    - - -00 + 0 + 0
    r- -44 + 0 + 0
    -w-20 + 2 + 0
    - -x10 + 0 + 1
    rw-64 + 2 + 0
    -wx30 + 2 + 1
    r-x54 + 0 + 1
    rwx74 + 2 + 1

    所以,对于访问权限的三组(所有者的权限、群组用户的权限、其他用户的权限),我们只要分别做加法就可以了,然后把三个和连起来。

    例如,chmod 640  file1表示:

    文件的所有者有读和写的权限;文件所在群组的其他用户具有读的权限;除此之外的其他用户没有任何权限。因此,我们可以给的最宽泛的权限就是 777:所有者,群组用户,其他用户都有读、写和运行的权限(chmod 777 filename)。这样,所有人就都可以对此文件“为所欲为”了。

    注意:进入某个目录的前提是能进入它的上级的所有目录(这一点特别容易被忽略)

      root@yaoyuan ~# chmod o-x var/lib
      root@yaoyuan ~# ls -ld var/lib
      drwxr-xr--. 62 root root 4096 Jun 21 17:20 var/lib
      root@yaoyuan ~# service mysqld start
      Redirecting to bin/systemctl start mysqld.service
      Job for mysqld.service failed because the control process exited with error code. See "systemctl status mysqld.service" and "journalctl -xe" for details.
      root@yaoyuan ~# tail var/log/mysqld.log
      ...
      2022-07-28T02:58:08.568048Z 0 [ERROR] [MY-010095] [Server] Failed to access directory for --secure-file-priv. Please make sure that directory exists and is accessible by MySQL Server. Supplied value : var/lib/mysql-files
      2022-07-28T02:58:08.568288Z 0 [ERROR] [MY-010119] [Server] Aborting
      root@yaoyuan ~# chmod o+x var/lib
      root@yaoyuan ~# service mysqld start
      Redirecting to bin/systemctl start mysqld.service

      umask

      通过使用 umask 默认权限来给所有新建的文件和目录赋予初始权限的。文件(或目录)的初始权限 = 文件(或目录)的最大默认权限 - umask权限 umask的默认值是0022,第 1 个数代表的是文件所具有的特殊权限,后面3位分别对应 3 种用户身份用户、组、其它。

      对文件来讲,其可拥有的最大默认权限是 666,即 rw-rw-rw-,减去0022是644。对目录来讲,其可拥有的最大默认权限是 777,即 rwxrwxrwx,减去0022是755。

        oracle@yaoyuan tmp$ umask
        0022
        oracle@yaoyuan tmp$ mkdir p
        oracle@yaoyuan tmp$ touch a
        oracle@yaoyuan tmp$ ll -ld a p
        -rw-r--r--. 1 oracle oinstall 0 Jul 28 15:08 a
        drwxr-xr-x. 2 oracle oinstall 6 Jul 28 15:08 p
        oracle@yaoyuan tmp$ umask -S 0002
        u=rwx,g=rwx,o=rx
        oracle@yaoyuan tmp$ touch b
        oracle@yaoyuan tmp$ ll b
        -rw-rw-r--. 1 oracle oinstall 0 Jul 28 15:10 b

        文件和目录的三种特殊权限

        三个特殊的权限是:setuid、setgid和粘滞位

        setuid的作用是让执行该命令的用户以该命令拥有者的权限去执行,比如普通用户执行passwd时(修改自己的密码)会拥有root的权限,这样就可以修改/etc/passwd这个文件了。它的标志为:s,会出现在x的地方,例:-rwsr-xr-x  。而setgid的意思和它是一样的,即让执行文件的用户以该文件所属组的权限去执行。

          oracle@yaoyuan ~$ ll usr/bin/passwd
          -rwsr-xr-x. 1 root root 27856 Nov 22 2019 usr/bin/passwd
          另外一个例子是oracle执行程序
            oracle@yaoyuan ~$ ll $ORACLE_HOME/bin/oracle -h
            -rwsr-s--x. 1 oracle oinstall 421M Mar 20 11:11 u01/app/oracle/product/19.3.0/db_1/bin/oracle
            因此运行oracle程序都是oracle用户和oinstall组。

            这三种特殊权限的设置方法

            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权限,针对目录

            粘滞位最常用是应用于路径。当路径被设置粘滞位后,路径下的文件只有文件的owner,路径的owner, 或者root 才能够重命名、删除文件。如果没有粘滞位,任何用户,不管是不是owner, 只要有路径的写/执行权限就可以重命名、删除文件。典型的应用就是/tmp路径,粘滞位可以阻止一般用户删除/重命名其他用户的文件

            “o+t”、 “o-t”权限模式可分别用于添加、移除粘滞位权限。

            设置了粘滞位权限的目录,使用ls命令查看其属性时,其他用户权限处的“x”将变为“t”。

              oracle@yaoyuan tmp$ mkdir dir1
              oracle@yaoyuan tmp$ touch dir1/file1
              oracle@yaoyuan tmp$ chmod o+w dir1


              # 对目录有写的权限删除可以成功
              [zhangsan@yuan tmp]$ rm dir1/file1
              rm: remove write-protected regular empty file ‘dir1/file1’? y


              # 对dir1目录加上粘滞位
              oracle@yaoyuan tmp$ chmod o+t dir1
              oracle@yaoyuan tmp$ touch dir1/file1




              # 有粘滞位后删除不能成功
              [zhangsan@yuan dir1]$ rm file1
              rm: remove write-protected regular empty file ‘file1’? y
              rm: cannot remove ‘file1’: Operation not permitted
              [zhangsan@yuan dir1]$ whoami
              zhangsan



              02


              切换用户


              su

              su 命令可以用来切换用户身份,除 root 外,其他用户切换身份时,需输入密码该命令的使用方式如下:

              su [选项] user

              su --help

              没有user项默认为root。

              -, -l, --login 像登录一样启动shell,配置环境变量。

              sudo

              sudo 命令用来以root的身份执行指令,该命令的使用方式如下:

              sudo [选项] 命令

              sudo用户的配置在/etc/sudoers文件中:

                oracle ALL=(ALL) NOPASSWD:ALL
                这一行的意思是oracle用户可以运行任何超级用户的命令,而且不需要输入密码。

                以mysql用户运行这个命令。

                  oracle@yaoyuan ~$ sudo -u mysql ls
                  ls: cannot open directory .: Permission denied
                  oracle@yaoyuan ~$ sudo -u mysql ls /var/lib/mysql
                  sudo -i 切换到root,在Ubuntu和Debian上很有用。

                  02


                  登录信息

                  who查询当前谁登录。

                  whoami查询当前登录的信息,类似id。

                    oracle@yaoyuan ~$ who
                    oracle pts/0 2022-07-28 15:22 (yao)
                    oracle pts/1 2022-07-28 15:25 (yao)
                    oracle@yaoyuan ~$ whoami
                    oracle

                    last查询过去登录过的用户,信息保存在/var/log/wtmp :

                      oracle@yaoyuan ~$ last oracle
                      oracle pts/1 yao Thu Jul 28 15:25 still logged in
                      oracle pts/0 yao Thu Jul 28 15:22 still logged in
                      oracle pts/2 yao Thu Jul 28 11:30 - 13:57 (02:26)
                      oracle pts/0 yao Wed Jul 27 11:48 - 17:48 (06:00)
                      oracle pts/2 yao Mon Jul 25 14:22 - 19:57 (05:34)
                      oracle pts/0 yao Mon Jul 25 14:07 - 19:57 (05:49)
                      oracle pts/2 ubuntu-route Sun Jul 24 09:32 - 13:31 (03:59)
                      oracle   pts/0        ubuntu-route     Sun Jul 24 09:29 - 13:31  (04:01)

                      不接用户显示所有用户的登录信息,reboot是个伪用户,显示系统启动的动作。



                      作者介绍

                      姚远:Oracle ACE(Oracle和MySQL数据库方向),华为云MVP。拥有包括 Oracle 10g和12c OCM在内的20+数据库相关认证。曾任IBM公司数据库部门经理,现在一家第三方公司任首席数据库专家,服务2万+客户,《MySQL 8.0运维与优化》的作者。


                      需要全套《Linux系统管理》pdf文档请加姚远老师微信👇

                      近期热文


                      MySQL 8.0 25

                      BMySQL程。

                      文章转载自oracleace,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                      评论