zoukankan      html  css  js  c++  java
  • Linux 笔记

    博客地址:http://www.moonxy.com

    Linux 是一个多用户的操作系统,在日常的使用中,从安全角度考虑,应该尽量避免直接使用 root 用户登录,而使用普通用户。

    1. 关于用户 user 的两个重要的文件: /etc/passwd(存储用户信息) 和 /etc/shadow(存储用户对应的密码信息)

    [root@ryan ~]# cat /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    adm:x:3:4:adm:/var/adm:/sbin/nologin
    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    sync:x:5:0:sync:/sbin:/bin/sync
    shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    ……

    /etc/passwd 由 ":" 分割成7个字段:

    第一个字段是用户名。

    第二个字段是密码的占位符"x"。

    第三个字段是用户标识号,也被称为 uid,系统通过这个数字来识别用户身份,此处的"0"就是root,是超级用户的标识号,1~499由系统保留,作为管理账号,普通用户的标识号从500开始,自己定义的普通用户,标识号都是大于或等于500的。

    第四个字段是组标识号,也被称为 gid,对应着 /etc/passwd 中的一条记录。

    第五个字段是注释说明,没有实际意义。

    第六个字段是用户的家目录,root 的家目录是 /root,普通用户的家目录是 /home/[username],也可以自定义用户家目录。

    第七个字段是用户的 shell,用户登录后需要启动一个进程,用来将用户输入的命令传送给系统内核,这就是 shell,RedHad/CentOS 的 shell 默认是bash。若想要更改系统创建用户时的默认shell,可以在修改此文件中 /etc/default/useradd 中 SHELL 一行,比如:SHELL=/bin/bash,修改此处。

    /etc/shadow 由 ":" 分割成9个字段:

    root:$6$zmDSSdDBtTzEFjX1$U65Mlsw17RNnZ06UTtySSvOk725oFk7JEnWj3PjPZdnnVVKlDTYSD34ggqwFp.53E9MoAvfZlsr6DahX6jPsN0:17481:0:99999:7:::
    bin:*:15980:0:99999:7:::
    daemon:*:15980:0:99999:7:::
    adm:*:15980:0:99999:7:::
    lp:*:15980:0:99999:7:::
    sync:*:15980:0:99999:7:::
    shutdown:*:15980:0:99999:7:::
    ……

    第一个字段是用户名,与 /etc/passwd 对应。

    第二个字段是用户密码,并且已经加密,如果该用户没有设置密码时,此处将显示两个感叹号"!!"。

    第三个字段是上次更改密码的日期,单位为天,从1970年1月1日起到上次更改密码的日期之差,计算天数得到。

    第四个字段是要过多少天才可以更改密码,默认是 0,表示不受限制。

    第五个字段是密码多少天后到期,即在多少天内必须更改密码,默认是99999,可以理解为不受限制。

    第六个字段是密码到期前的警告期限。

    第七个字段是账号失效期限,失效后账号会被锁定。

    第八个字段是账号的生命周期,到期后账号会作废。

    第九个字段是保留字段,目前还没有具体意义。

    2. 关于组 group 的两个重要的文件: /etc/group(存储组信息) 和 /etc/gshadow(存储组对应的密码信息,一般组很少设置密码,故很少用)

    [root@ryan ~]# cat /etc/group
    root:x:0:
    bin:x:1:bin,daemon
    daemon:x:2:bin,daemon
    sys:x:3:bin,adm
    adm:x:4:adm,daemon
    tty:x:5:
    disk:x:6:
    lp:x:7:daemon
    ……

    以上格式为:组名:口令:组标识号:组内用户列表。

    具体解释:

    组名:组名是用户组的名称,由字母或数字构成。与 /etc/passwd 中的登录名一样,组名不应重复。

    口令:口令字段存放的是用户组加密后的口令字。一般 Linux 系统的用户组都没有口令,即这个字段一般为空,或者是*。

    组标识号:组标识号与用户标识号类似,也是一个整数,被系统内部用来标识组,即 GID。

    组内用户列表:是属于这个组的所有用户的列表,不同用户之间用逗号(,)分隔。这个用户组可能是用户的主组,也可能是附加组。

    [root@ryan ~]# cat /etc/gshadow
    root:::
    bin:::bin,daemon
    daemon:::bin,daemon
    sys:::bin,adm
    adm:::adm,daemon
    tty:::
    disk:::
    lp:::daemon
    ……

    3. 命令 id

    id - print real and effective user and group IDs,打印用户和组信息,包括  uid,gid 和所属 groups。

    [root@ryan ~]# id root
    uid=0(root) gid=0(root) groups=0(root)

    注意:

    Linux 系统以组 Group 方式管理用户,用户和组的对应关系为多对多,即某个用户可加入/属于一个或多个组,某个组可以有0个、1个或多个用户。从用户的角度,组可以分为主组和附属组。

    主组:也被称为 Primary group、first group 或 initial login group,用户的默认组,用户的 gid 所标识的组。

    附属组:也被称为 Secondary group或 supplementary group,用户的附加组。

    可以通过 id 命令可查看当前用户的主组和附属组,比如:

    [root@ryan ~]# id root
    uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel)

    [root@ryan ~]# id gg
    uid=503(gg) gid=503(gg) groups=503(gg)

    [root@ryan ~]# id mm
    uid=502(mm) gid=500(jww) groups=500(jww)

    其中,gid 标识主组,groups 表示用户所属的全部组(主组和附属组),用户必须有且只能有一个主组,可以有0个、1个或多个附属组。

    用户和用户组管理

    4. 命令 groupadd

    groupadd - create a new group,新增用户组,格式为"groupadd [-g GID] groupname",不加参数 -g 选项,则系统会按照默认的 gid 创建组,和 uid 一样,gid 也是从500开始的。

    [root@ryan ~]# groupadd pbwm

    [root@ryan ~]# cat /etc/group
    root:x:0:
    bin:x:1:bin,daemon
    daemon:x:2:bin,daemon
    sys:x:3:bin,adm
    adm:x:4:adm,daemon
    slocate:x:21:
    pbwm:x:500:
    ……

    5. 命令 groupdel

    groupdel - delete a group,用于删除用户组,只有当用户组中不再包含具体的用户时,才可以删除此空组,否则会提示由于包含某个用户而无法删除。

    [root@ryan ~]# groupdel pbwm
    groupdel: cannot remove the primary group of user 'adam'

    6. 命令 groupmod

    groupmod - modify a group definition on the system,用于修改用户组,格式为:"groupmod [-g GID] [-o] [-n] groupname"。

    7. 命令 useradd

    useradd - create a new user or update default new user information,用于新增一个用户,也可使用 adduser,功能相同,命令的格式为:"useradd [-u UID] [-g GID] [-d HOME] [-M] [-s]",其中:

    -u:表示自定义UID。

    -g:表示新增用户时指定用户属于哪个组,后面可以跟组 id,也可以跟组名,-G 表示添加附属组。

    -d:表示自定义用户的家目录。

    -M:表示不建立家目录。

    -s:表示自定义 shell 。

    [root@ryan ~]# useradd -g pbwm adam

    [root@ryan ~]# cat /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    ……
    adam:x:500:500::/home/adam:/bin/bash

    如果 useradd 不加任何选项,直接跟用户名,则会创建一个跟用户名同名的用户组。

    [root@ryan ~]# useradd bob

    [root@ryan ~]# cat /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    ……
    adam:x:500:500::/home/adam:/bin/bash
    bob:x:501:501::/home/bob:/bin/bash

    [root@ryan ~]# cat /etc/group
    root:x:0:
    bin:x:1:bin,daemon
    ……
    pbwm:x:500:
    bob:x:501:

    8. 命令 userdel

    userdel - delete a user account and related files,用于删除一个用户,命令格式为:"userdel [-r] username",其中 -r 选项表示,当删除用户时一并删除该用户的家目录。

    [root@ryan ~]# userdel -r bob

    [root@ryan ~]# ll /home
    total 4
    drwx------. 4 adam pbwm 4096 Dec 17 20:51 adam

    9. 命令 usermod

    usermod - modify a user account,用于修改一个用户账户信息。

    比如修改一个用户的所属组:

    # usermod -g 513 user3

    比如修改一个用户的附属组,将 username 添加到名称为 secondarygroup 的附属组中:

    # usermod -G secondarygroup username

    比如修改一个用户的 shell:

    # usermod -s /bin/bash user3

    10. 命令 chfn

    chfn - change your finger information,修改用户的基本信息 finger,finger 其实就是在 /etc/passwd 文件第5个字段中所显示的信息。

    [root@ryan ~]# chfn bob
    Changing finger information for bob.
    Name []: bob-xu
    Office []: hsbc
    Office Phone []: 1008611
    Home Phone []: 1008612

    Finger information changed.
    [root@ryan ~]# grep bob /etc/passwd
    bob:x:501:501:bob-xu,hsbc,1008611,1008612:/home/bob:/bin/bash

    用户密码管理

    11. 命令 passwd

    passwd - update user’s authentication tokens,修改用户的登录密码,格式为 "passwd [username]"。该命令后面若不加用户名字,则是为自己设定密码。如果登录的是 root 账户,后面可以跟普通账户的名字,意思是修改指定账户的密码,只有 root 才可以修改其他账户的密码,普通用户只能修改自己的密码。双敲复合之后令牌被成功更新。

    [root@ryan ~]# passwd bob
    Changing password for user bob.
    New password:
    BAD PASSWORD: it is too simplistic/systematic
    BAD PASSWORD: is too simple
    Retype new password:
    passwd: all authentication tokens updated successfully.

    12. 命令 mkpasswd

    mkpasswd - generate new password, optionally apply it to a user,用于生成密码,包含大小写字母,数字和特殊符。

    [root@ryan ~]# mkpasswd
    aMg09i(fY
    [root@ryan ~]# mkpasswd
    j0xRJn5a=

    用户身份切换

    root 账户提示符是"#",普通用户是"$"。

    13. 命令 su

    su - run a shell with substitute user and group IDs,命令格式为:"su [-] username",普通用户的 su 命令不加 username 时就是切换到 root 用户,需要输入 root 的密码,root 用户同样可以使用 su 命令切换到普通用户,但不需要输入密码。当不加 [-] 时,当前目录没有变化,加上 [-] 时,当前目录为家目录,区别在于是否初始化当前用户的各种环境变量。

    [root@ryan ~]# su bob
    [bob@ryan root]$ pwd
    /root
    [bob@ryan root]$ echo $PATH
    /usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
    [bob@ryan root]$ whoami
    bob

    [root@ryan ~]# su - bob
    [bob@ryan ~]$ pwd
    /home/bob
    [bob@ryan ~]$ echo $PATH
    /usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/bob/bin
    [bob@ryan ~]$ whoami
    bob

    14. 命令 sudo

    sudo, sudoedit - execute a command as another user,执行 root 才能执行的命令,sudo命令用来以其他身份来执行命令,预设的身份为root。在/etc/sudoers 中设置了可执行sudo指令的用户。若其未经授权的用户企图使用sudo,则会发出警告的邮件给管理员。用户使用sudo时,必须先输入密码,之后有5分钟的有效期限,超过期限则必须重新输入密码。配置sudo必须通过编辑/etc/sudoers文件,而且只有超级用户才可以修改它,还必须使用visudo编辑。之所以使用visudo有两个原因,一是它能够防止两个用户同时修改它;二是它也能进行有限的语法检查。所以,即使只有你一个超级用户,你也最好用visudo来检查一下语法。visudo默认的是在vi里打开配置文件,用vi来修改文件。

    [root@ryan ~]# su bob
    [bob@ryan root]$ pwd
    /root
    [bob@ryan root]$ ls
    ls: cannot open directory .: Permission denied
    [bob@ryan root]$ echo $PATH
    /usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
    [bob@ryan root]$ sudo ls

    We trust you have received the usual lecture from the local System
    Administrator. It usually boils down to these three things:

    #1) Respect the privacy of others.
    #2) Think before you type.
    #3) With great power comes great responsibility.

    [sudo] password for bob:
    bob is not in the sudoers file. This incident will be reported.

    ## Allow root to run any commands anywhere
    root ALL=(ALL) ALL
    bob ALL=(ALL) ALL

    [root@ryan ~]# su bob
    [bob@ryan root]$ pwd
    /root
    [bob@ryan root]$ ls
    ls: cannot open directory .: Permission denied
    [bob@ryan root]$ sudo ls
    [sudo] password for bob:
    anaconda-ks.cfg Documents install.log linux Pictures Templates
    Desktop Downloads install.log.syslog Music Public Videos

    扩展权限 ACL

    以上属于基本权限的范畴,此外还有扩展权限 ACL(Access Control List),ACL 权限是为了防止权限不够用的情况,一般的权限有所有者、所属组、其他人这三种,当这三种满足不了我们的需求的时候就可以使用ACL权限。

    比如:一个网络老师,给一个班的学员上课,他在linux的根目录下面建立了一个文件,只允许本班级的学员对该目录进行上传下载,其他人都不行,这时该目录的权限一般是770(一般我们设置权限都是所有者的权限大于所属组的权限,所属组的权限大于其他人的权限,依次往下),此时有个同学想试听我们的课程,该怎么给他分配权限呢?此时的所属组、所有者、其他人都不满足,这时就要用到 ACL 权限,ACL 权限的原理类似 Windows 给一个文件添加用户(这个用户对该文件具有的权限)。

    设置 ACL 权限:

    设置用户:setfacl -m u:user1:rx test [u表示设置用户的 ACL,user1为具体的用户,rx 为要设置的权限,test 为目录或者文件]

    设置组:setfacl -m g:group1:rx test [g表示设置组的 ACL,group1为具体的组,rx 为要设置的权限,test 为目录或者文件]

    其中的选项 -m 表示修改ACL,你可以增加新的,或修改存在的ACL。

    查看 ACL 权限:

    getfacl test,用于显示分配完的 ACL 权限。

    [root@ryan linux]# getfacl test
    # file: test
    # owner: root
    # group: root
    user::rwx
    group::r-x
    other::r-x
    
    [root@ryan linux]# setfacl -m u:adam:rx test
    [root@ryan linux]# setfacl -m g:pbwm:rx test
    [root@ryan linux]# getfacl test
    # file: test
    # owner: root
    # group: root
    user::rwx
    user:adam:r-x
    group::r-x
    group:pbwm:r-x
    mask::r-x
    other::r-x

    可以看到添加了一个 adam 用户和一个 pbwm 组,这两个就是通过设置 ACL 权限做到的。

    [root@ryan linux]# ll -d test
    drwxr-xr-x+ 2 root root 4096 Dec  3 13:35 test

    如上,设置 ACL 权限后,权限后会多一个 + 标记,这表示ACL已经设置成功。

    删除 ACL 权限:

    删除ACL用户权限:setfacl -x u:user1 test

    删除ACL组权限:setfacl -x g:group1 test

    删除整个ACL权限:setfacl -b test

    附录

    linux添加超级管理员用户,修改,删除用户

  • 相关阅读:
    面经
    Onedrive云盘程序——OneManager小白设置指南
    Docker 命令
    Linux 命令
    Spring boot 返回参数移除null属性
    Springboot
    正则
    JVM内存模型
    缓冲和缓存的区别
    SpringBoot如何优雅的将静态资源配置注入到工具类中
  • 原文地址:https://www.cnblogs.com/cnjavahome/p/8018564.html
Copyright © 2011-2022 走看看