用户管理
一、用户配置文件说明
在Linux系统中创建、增加,以及删除用户和用户组,实际上都是修改系统中对应的文件
/etc/passwd 用户信息的文件
/etc/shadow 用户密码的文件
/etc/group 组信息的文件
/etc/gshadow 组密码的文件
1、存储用户信息的文件/etc/passwd
/etc/passwd文件是Linux中的重要系统文件之一,主要作用是存储系统用户的信息,文件中的每一行表示一个用户信息,有多少行就表示存在多少个用户信息,仔细观察其中的一行,可以清晰地看出,各内容之间通过“:”号划分成了多个字段,共7部分,这7部分分别定义了用户的不同属性,/etc/passwd文件的实际内容具体如下:
[root@node1 ~]# head -1 /etc/passwd root:x:0:0:root:/root:/bin/bash root : x : 0 : 0 : root : /root : /bin/bash 用户名 密码 UID GID 用户说明 家目录 shell解释器
密码是x原因是为了安全,该密码从passwd文件转移到了/etc/shadow文件中
2.存储用户密码信息的文件/etc/shadow
由于passwd文件必须要被所有的用户读取,所以会带来安全隐患。而shadow文件就是为了解决这个安全隐患而增加的。
/etc/shadow文件的实际内容如下:
[root@node1 ~]# head -1 /etc/shadow root:$6$j6noMmuqQnFWCs4q$eIMtj9ihYA8FwTRbGX/TtBo839skmjkf3m8pt.O44VKVI9WAn3UMQGj14OmV3xvyuJjs0pWHgcQx3sjZakI99/::0:99999:7::: root:$6$j6noMmuqQnFWCs4q$eIMtj9ihYA8FwTRbGX/TtBo839skmjkf3m8pt.O44VKVI9WAn3UMQGj14OmV3xvyuJjs0pWHgcQx3sjZakI 用户名 密码,通过字符串加密 99/: : 0 : 99999 : 7 : : : 最近修改密码的时间 禁止修改密码的时间 用户多少天后必须修改密码 警告修改密码的时间 不活动的时间 失效时间 标志(保留)
1、用户名 用户名称
2、用户密码 通过字符串加密
3、最近修改密码的时间 从1970-1-1到用户最近一次更改密码的天数
4、禁止修改密码的时间 从1970-1-1起到用户可以更改密码的天数
5、用户多少天后必须修改密码 从1970-1-1起到用户必须更改密码的天数
6、警告修改密码的时间 在用户密码过期之前多少天提醒用户更改密码
7、不活动时间 在用户密码过期之后到禁用账户的天数
8、失效时间 从1970-1-1起到用户被禁用的时间
9、标志 保留
使用useradd命令添加用户会更改/etc/passwd、/etc/shadow、/etc/group、/etc/gshadow。 ·使用passwd或chpasswd为用户设置密码会更改/etc/shadow。
/etc/group文件是存储用户组相关信息的文件,内容包括用户组名称、用户组GID等属性。/etc/group文件与/etc/passwd文件的权限相同
[root@node1 ~]# head -1 /etc/group root:x:0: root : x : 0 : 组名称 组密码 GID 用户组成员(使用-G加入) 因为安全原因组密码在group中为x,密码迁移到/etc/gshadow文件中
使用groupadd添加用户组会更改/etc/group、/etc/gshadow。
/etc/gshadow是存储用户组密码信息的文件,比如,用户组管理密码就存放在这个文件中。/etc/gshadow和/etc/group是两个互补的文件;早期对于大型服务器,针对很多用户和用户组,定制一些关系结构比较复杂的权限模型,可以选择设置用户组密码。比如,如果不想让一些非用户组成员永久拥有用户组的权限和特性,那么可以通过密码验证的方式来让某些用户临时拥有一些用户组特性,这时就要用到用户组密码了,在实际运维工作中,一般是用不到这个功能的。
[root@node1 ~]# head -1 /etc/gshadow root::: root : : : 组名称 密码(空或!表示没有密码) 用户组管理员用户 用户组成员
1.useradd命令的工作原理
当不带任何参数使用useradd命令添加用户时,首先会读取配置文件/etc/login.defs和/etc/default/useradd中预先定义的规则,并根据设置的规则添加用户,同时还会向/etc/passwd和/etc/group文件内添加新建的用户和用户组记录。当然,/etc/shadow和/etc/gshadow也会同步生成记录,同时系统还会根据/etc/default/useradd及/etc/login.defs文件中配置的信息建立用户的家目录,并复制/etc/skel中所有隐藏的环境配置文件到新用户的家目录中,以完成对用户环境的初始化设置。
2、/etc/login.defs
/etc/login.defs文件的作用是预先定义创建用户时需要的一些用户默认配置信息。如创建用户时,是否需要家目录,以及UID和GID的取值起始值及取值范围,用户及密码的有效期限等,完整功能请参见下文配置文件中的注释说明。
[root@node1 ~]# vim /etc/login.defs # # Please note that the parameters in this configuration file control the # behavior of the tools from the shadow-utils component. None of these # tools uses the PAM mechanism, and the utilities that use PAM (such as the # passwd command) should therefore be configured elsewhere. Refer to # /etc/pam.d/system-auth for more information. # # *REQUIRED* # Directory where mailboxes reside, _or_ name of file, relative to the # home directory. If you _do_ define both, MAIL_DIR takes precedence. # QMAIL_DIR is for Qmail # #QMAIL_DIR Maildir MAIL_DIR /var/spool/mail #mail的地址 #MAIL_FILE .mail # Password aging controls: # # PASS_MAX_DAYS Maximum number of days a password may be used. # PASS_MIN_DAYS Minimum number of days allowed between password changes. # PASS_MIN_LEN Minimum acceptable password length. # PASS_WARN_AGE Number of days warning given before a password expires. # PASS_MAX_DAYS 99999 #<==密码最长可以使用的天数,99999表示永久。 PASS_MIN_DAYS 0 #<==更换密码的最小天数。 PASS_MIN_LEN 5 #<==密码的最小长度。 PASS_WARN_AGE 7 #<==密码失效之前提前多少天开始警告。 # # Min/max values for automatic uid selection in useradd # UID_MIN 1000 #<==默认最小UID为1000,也就是说添加用户时,UID是从1000开始的。 UID_MAX 60000 #<==默认最大UID为60000。 # System accounts SYS_UID_MIN 201 #<==默认最小系统UID为201,添加系统用户时,UID是从201开始。 SYS_UID_MAX 999 #<==默认最大系统UID为999。 # # Min/max values for automatic gid selection in groupadd # GID_MIN 1000 #<==默认最小GID为1000,也就是说添加用户时,GID是从1000开始的。 GID_MAX 60000 #<==默认最大GID为60000。 # System accounts SYS_GID_MIN 201 #<==默认最小系统GID为201,也就是说添加用户时,系统GID是从201开始的。 SYS_GID_MAX 999 #<==默认最大系统GID为999。 # # If defined, this command is run when removing a user. # It should remove any at/cron/print jobs etc. owned by # the user to be removed (passed as the first argument). # #USERDEL_CMD /usr/sbin/userdel_local #<==删除用户时,删除与用户相关的所有工作,默认关闭。 # # If useradd should create home directories for users by default # On RH systems, we do. This option is overridden with the -m flag on # useradd command line. # CREATE_HOME yes #<==== 创建用户时,默认创建家目录 # The permission mask is initialized to this value. If not specified, # the permission mask will be initialized to 022. UMASK 077 #<==家目录对应umask默认值。 # This enables userdel to remove user groups if no members exist. # USERGROUPS_ENAB yes #<==删除用户同时删除用户组(如果用户组没有其他成员,则删除)。 # Use SHA512 to encrypt password. ENCRYPT_METHOD SHA512 #<===密码的加密算法
/etc/default/useradd文件是在使用useradd添加用户时预先加载的默认用户信息配置文件
[root@node1 ~]# cat /etc/default/useradd # useradd defaults file GROUP=100 #<==依赖于/etc/login.defs的USERGROUPS_ENAB参数,如果为no,则此处控制。 HOME=/home #<==在/home目录下创建用户的家目录。 INACTIVE=-1 #<==是否启用用户过期停权,-1表示不启用。 EXPIRE= #<==用户终止日期,不设置表示不启用。 SHELL=/bin/bash #<==新用户默认使用的Shell解释器类型。 SKEL=/etc/skel #<==配置新用户家目录的默认环境变量文件的存放路径。当我们使用useradd添加用户时,用户家目录下的隐藏环境变量文件,都是从这里配置的/etc/skel目录中复制过去的。 CREATE_MAIL_SPOOL=yes #<==创建mail文件。
4.与创建用户相关的目录/etc/skel
[root@node1 ~]# ls -al /etc/skel/ total 24 drwxr-xr-x. 2 root root 62 Apr 11 2018 . drwxr-xr-x. 83 root root 8192 Sep 29 02:27 .. -rw-r--r--. 1 root root 18 Oct 31 2018 .bash_logout -rw-r--r--. 1 root root 193 Oct 31 2018 .bash_profile -rw-r--r--. 1 root root 231 Oct 31 2018 .bashrc
故障案例
[root@node1 ~]# su - ywx #<==切换到ywx用户下。 Last login: Mon Sep 28 05:17:52 CST 2020 on pts/1 [ywx@node1 ~]$ rm -f .bash* #<==故障原因就是,用户家目录下的环境变量不存在了 [ywx@node1 ~]$ ls -al total 4 drwx------ 2 ywx ywx 22 Sep 29 02:30 . drwxr-xr-x. 5 root root 41 Sep 26 23:29 .. -rw------- 1 ywx ywx 559 Sep 26 22:37 .viminfo [ywx@node1 ~]$ exit #<==可以按快捷键(Ctrl+D),退出当前环境。 logout [root@node1 ~]# su - ywx #<==重新切换到ywx用户下。 Last login: Tue Sep 29 02:29:52 CST 2020 on pts/0 -bash-4.2$ #故障现象
故障恢复
-bash-4.2$ cp /etc/skel/.bash* ~/ #<==从/etc/skel中将所有环境变量文件复制回来,注意当前用户。 -bash-4.1$ logout #<==可以按快捷键(Ctrl+D),退出当前环境。 [root@node1 ~]# su - ywx #<==重新切换到ywx用户下。 [ywx@node1 ~]$ #<==故障排除了。
当不添加任何参数使用useradd添加用户时,默认配置就是读取/etc/default/useradd信息,并根据该文件的信息设定用户。这时,会从/etc/skel中复制用户需要的环境变量文件,同时还会读取/etc/login.defs,并根据该文件设定相关的默认信息。这是一个用户在创建过程中的实现过程,当然了,还可以加上参数选项以改变文件中的默认设定。
1、不加任何参数,添加用户alex。
[root@ywx ~]# useradd alex #<==添加用户alex。 [root@ywx ~]# ls -ld /home/alex/ #<==在/home(在useradd文件中设定的)下,增加了以alex为目录的家目录(在/etc/login.defs中设定的)。 drwx------. 2 alex alex 4096 May 1 11:27 /home/alex/ #<==权限是700,/etc/login.defs中设定的。 [root@ywx ~]# ls -al /home/alex/ total 20 drwx------. 2 alex alex 4096 May 1 11:27 . drwxr-xr-x. 10 root root 4096 May 1 11:27 .. -rw-r--r--. 1 alex alex 18 Mar 23 2017 .bash_logout #<==用户环境变量文件,来自/etc/skel。 -rw-r--r--. 1 alex alex 176 Mar 23 2017 .bash_profile #<==用户环境变量文件,来自/etc/skel。 -rw-r--r--. 1 alex alex 124 Mar 23 2017 .bashrc #<==用户环境变量文件,来自/etc/skel。 [root@ywx ~]# grep -w alex /etc/passwd #<==查看用户生成情况。 alex:x:506:508::/home/alex:/bin/bash 需要提醒的是,在添加用户alex的同时,还会添加与用户名相同的用户组alex。 [root@ywx ~]# tail -1 /etc/group #<==查看用户组的生成情况。 alex:x:508: [root@ywx ~]# tail -1 /etc/shadow #<==同时还会在shadow里记录用户组的信息。 alex:!!:17652:0:99999:7::: [root@ywx ~]# tail -1 /etc/gshadow #<==同时还会在gshadow里记录用户组的信息。 alex:!:: #在这个例子中,我们添加了一个名为alex的系统用户,并且在“/home/”目录下自动生成了名字为alex的家目录,并且权限是700。在/etc/passwd文件里,从对应alex的用户行还可以看到UID和GID以及登录解释器等设置信息,前面已经介绍过这方面的知识了,因此,对于这么多的默认设置,我们并不感到奇怪。 #至此可以得出一个结论,使用useradd添加用户时,涉及的核心文件包括/etc/passwd、/etc/shadow、/etc/group和/etc/gshadow,其他文件还有/etc/login.defs、/etc/default/useradd,涉及的目录包括/etc/skel、/home。
创建用户zuma,属于指定组root,UID为888,
root@ywx ~]# useradd zuma -u 888 -g root #<==创建用户zuma,属于指定组root,UID为888。 [root@ywx ~]# id zuma #<==查看生效信息。 uid=888(zuma)gid=0(root)groups=0(root)
创建一个虚拟用户mysql,禁止其登录,且不创建家目录,实现步骤具体如下:
[root@ywx ~]# useradd mysql -s /sbin/nologin -M [root@ywx ~]# tail -1 /etc/passwd mysql:x:889:889::/home/mysql:/sbin/nologin
4、useradd的-e参数的使用示例
实现添加用户pig的操作,用户有效期1个月,实现步骤具体如下:
[root@ywx ~]# date +%F #<==查看系统当前日期 2020-09-29 [root@ywx ~]# useradd pig -e "2020/10/29" #<==设置用户过期时间,一个月后过期。 [root@ywx ~]# chage -l pig #<==查看过期的设置结果。 Last password change : Sep 28, 2020 Password expires : never Password inactive : never Account expires : Oct 29, 2020 #<==显示2020-10-29过期。 Minimum number of days between password change : 0 Maximum number of days between password change : 99999 Number of days of warning before password expires : 7 #2020-10-29日后pig用户将无法登录
添加用户kaka,并设置其用户注释信息为hello kaka,UID指定为806,分别属于用户组root、sa的成员,其Shell解释器类型为/bin/sh,设置家目录为/home/kaka
[root@ywx ~]#groupadd sa [root@ywx ~]# useradd -c "hellp kaka" -u 806 -G root,sa -s /bin/sh -d /home/kaka kaka [root@node1 ~]# tail -1 /etc/passwd kaka:x:806:1006:hellp kaka:/home/kaka:/bin/sh [root@node1 ~]# id kaka uid=806(kaka) gid=1006(kaka) groups=1006(kaka),0(root),1005(sa) [root@node1 ~]# ls -ald /home/kaka drwx------ 2 kaka kaka 62 Sep 29 02:57 /home/kaka
案例
1、usermod命令-c、-u、-G、-s、-d多参数组合的示例
添加用户kaka,并设置其用户注释信息为hello kaka,UID指定为806,分别属于用户组root、sa的成员,其Shell解释器类型为/bin/sh,设置家目录为/home/kaka。
[root@ywx ~]# useradd -c "hellp kaka" -u 806 -G root,sa -s /bin/sh -d /home/kaka kaka
然后修改kaka用户属性,将注释说明改为good,UID改为888,所属的附加组改为sa,同时禁止其登录,家目录为/home/kaka。
[root@ywx ~]# usermod -c "good" -u 888 -G sa -s /sbin/nologin -d /home/kaka kaka [root@node1 ~]# tail -1 /etc/passwd kaka:x:888:1006:good:/home/kaka:/sbin/nologin [root@node1 ~]# id kaka uid=888(kaka) gid=1006(kaka) groups=1006(kaka),1005(sa) [root@node1 ~]# ls -ld /home/kaka drwx------ 2 kaka kaka 62 Sep 29 02:57 /home/kaka
[root@ywx ~]# usermod -e "2020/11/28" pig [root@node1 ~]# chage -l pid chage: user 'pid' does not exist in /etc/passwd [root@node1 ~]# chage -l pig Last password change : Sep 28, 2020 Password expires : never Password inactive : never Account expires : Nov 28, 2020 #时间改为2020-11-28 Minimum number of days between password change : 0 Maximum number of days between password change : 99999 Number of days of warning before password expires : 7
-r 删除用户的同时,删除与用户相关的所有文件
-f 强制删除用户,及时用户已经登录
在企业场景中,如果不能确认用户相关的目录有没有重要数据,就不要使用-r,建议在/etc/passwd中把用户注释掉,一段时间系统没有问题后再删除。
1、删除用户alex。
[root@ywx ~]# grep alex /etc/passwd alex:x:506:508::/home/alex:/bin/bash [root@ywx ~]# userdel alex #<==该方法仅用于删除用户alex本身,但不删除其家目录及相关文件。 [root@ywx ~]# grep alex /etc/passwd #<==/etc/passwd中已经不存在了。 [root@ywx ~]# ls -ld /home/alex/ #<==但/home/alex家目录仍然存在。 drwx------. 2 506 508 4096 May 1 11:27 /home/alex/ #使用“userdel用户名”这样的方法删除用户时,只会删除用户本身,其家目录及用户的相关文件并不会被删除。一般在生产场景中,如果无法确定被删用户的家目录等是否有用,或者有不规范的用户已在家目录下存在业务脚本或程序的时候,就不要使用“userdel-r用户名”这样危险的命令了,而是直接使用“userdel用户名”命令删除即可。 #当然,我们还可以直接使用vi编辑/etc/passwd,找到要处理的用户,先注释一段时间,确认真的没问题了,然后再清理其家目录,注释的作用与userdel命令删除的效果一样,就是实现了被注释的用户无法登录(注释掉用户当前行即可)的功能,注释的作用有些类似于回收站,一旦发现问题,可以及时进行恢复工作。
如果在userdel命令后加上了参数-r,则表示在删除该用户的同时,将用户的家目录及本地邮件存储的目录和文件一并删除
[root@node1 ~]# userdel -r kaka [root@node1 ~]# id kaka id: kaka: no such user [root@node1 ~]# ls -al /home/kaka ls: cannot access /home/kaka: No such file or directory #处于登录状态中的用户无法被删除。 [root@node1 ~]# su - ywx Last login: Tue Sep 29 02:30:29 CST 2020 on pts/0 [ywx@node1 ~]$ [root@node1 ~]# userdel -r ywx userdel: user ywx is currently used by process 10387
-g gid 指定组的gid
-f 新增一个账户,强制覆盖一个已经存在的组账号
groupdel 组名
#注意:没有用户的空组才能删除
1、root用户可以修改任何用户的密码,普通用户只能修改自身的密码。 2、root用户修改密码时,如果不符合系统密码规则,则会给出警告信息,但密码设置仍然有效。而普通用户修改密码时,如果使用的是弱密码,则会给出告警信息,且修改无效。
案例
1、修改自身用户密码
[root@ywx ~]# passwd #<==修改当前用户,root自身的密码。 Changing password for user root. New password: #<==输入密码123456,系统不会输出用户输入的密码。 BAD PASSWORD: it is too simplistic/systematic #<==如果密码比较简单,则会给出警告信息,但不会阻止。 BAD PASSWORD: is too simple Retype new password: #<==再次输入密码123456。 passwd: all authentication tokens updated successfully. #<==但还是设置成功了。
[root@ywx ~]# useradd kaka #<==添加kaka用户,即使已存在也没关系。 [root@ywx ~]# passwd kaka #<==为kaka用户添加密码。 Changing password for user kaka. New password: #<==输入密码123456。 BAD PASSWORD: The password is shorter than 8 characters Retype new password: #<==再次输入密码123456。 passwd: all authentication tokens updated successfully. #<==设置成功。 [root@ywx ~]# su - kaka #<==su命令可以切换用户身份,后面会讲解。 [kaka@ywx ~]$ whoami #<==当前用户为kaka。 kaka [kaka@ywx ~]$ passwd #<==修改用户自身密码。 Changing password for user kaka. Changing password for kaka. (current)UNIX password: #<==先输入用户当前密码。 New password: #<==输入新密码。 BAD PASSWORD: it is too short #<==如果密码太短则不允许设置(root用户修改密码只是警告) New password: BAD PASSWORD: it is too short New password: #<==必须设置足够复杂的密码。 Retype new password: #<==重复设置。 passwd: all authentication tokens updated successfully.
[root@node1 ~]# passwd -S ywx ywx PS 2020-09-28 0 99999 7 -1 (Password set, SHA512 crypt.)
[root@node1 ~]# passwd -n 7 -x 60 -w 10 -i 30 kaka Adjusting aging data for user kaka. passwd: Success [root@node1 ~]# chage -l kaka Last password change : Sep 28, 2020 Password expires : Nov 27, 2020 Password inactive : Dec 27, 2020 Account expires : never Minimum number of days between password change : 7 #-n选项 Maximum number of days between password change : 60 #-x选项 Number of days of warning before password expires : 10 #-w选项
[root@oldboy ~]# id oldboy #<==确认要修改密码的oldboy用户是否存在。 uid=1002(oldboy)gid=1002(oldboy)groups=1002(oldboy) [root@oldboy ~]# id oldgirl #<==确认要修改密码的oldgirl用户是否存在。 uid=501(oldgirl)gid=502(incahome)groups=502(incahome) 方法1:命令行直接输入并执行。 [root@oldboy ~]# chpasswd #<==在命令行输入chpasswd,回车。 root:123456 #<==格式为“用户名:密码”,用户必须事先真实存在才行。 oldboy:123456 #<==一行一个。 oldgirl:123456 [root@oldboy ~]# #<==在新的空行输入Ctrl+D结束输入。 方法2:将用户和密码字符串放到文件里执行。 [root@oldboy ~]# cat user.txt #<==用户及密码字符串文件,注意格式。 root:123456 #<==格式为“用户名:密码”,用户必须事先真实存在才行,且一行一个。 oldboy:123456 oldgirl:123456 root@oldboy ~]# chpasswd <user.txt #<==利用输入重定向一次性为所有用户设置预先指定的密码。
1、创建新用户range,要求该用户在7天之内不能更改密码,60天以后必须修改密码,过期前10天通知用户,过期30天之后禁止用户登录。
[root@oldboy ~]# useradd range #<==添加新用户range。 [root@oldboy ~]# chage -m7 -M60 -W10 -I30 oldboy #<==使用chage按题意要求进行授权。 [root@oldboy ~]# chage -l range #<==-l参数用于查看账户的信息。 Last password change : May 01, 2018 #<==最后一次密码变化时间为2018-05-01,-d选项可控制该行。 Password expires : Jun 30, 2018 #<==密码过期时间为60天,即从2018-05-01到2018-06-30,该行受-M参数影响。 Password inactive : Jul 30, 2018 #<==密码停权时间,即密码过期30天后停权,-I选项可控制该行。 Account expires : never #<==账号过期时间,-E选项可控制该行。 Minimum number of days between password change : 7 #<==-m选项可控制该行。 Maximum number of days between password change : 60 #<==-M选项可控制该行。 Number of days of warning before password expires : 10 #<==-W选项可控制该行。 下面就来测试-E参数的使用,代码如下: [root@oldboy ~]# chage -E 2018-12-31 range #<==测试-E参数的使用。 [root@oldboy ~]# chage -l range|grep "Account expires" Account expires : Dec 31, 2018 #<==用户有效期变成了设定的日期。 [root@oldboy ~]# usermod -e "2019/12/31" range #<==usermod也可以更改用户有效期。 [root@oldboy ~]# chage -l range|grep "Account expires" Account expires : Dec 31, 2019
十一、用户查询相关命令
id命令通常用来查询用户和组信息以及对应的UID、GID等信息,它的用法非常简单,示例代码如下: [root@oldboy ~]# id oldboy #<==查看oldboy的用户及组相关的信息。 uid=1002(oldboy)gid=1002(oldboy)groups=1002(oldboy)#<==用户和组信息以及对应的UID、GID。 [root@oldboy ~]# id -u oldboy #<==只查看用户UID。 1002 [root@oldboy ~]# id -g oldboy #<==只查看用户组GID。 1002 [root@oldboy ~]# id -un oldboy #<==只查看用户名。 oldboy [root@oldboy ~]# id -gn oldboy #<==只查看用户组名。 oldboy
whoami命令可用于查看当前登录的用户,w命令的作用是显示已经登录的用户,并且展示他都做了什么的信息。而last、lastlog命令可以查看用户更详细的登录信息,不同命令的侧重点略有差别。
[root@oldboy ~]# whoami #<==查看当前登录的用户,比较常用。 root [root@oldboy ~]# w root@oldboy ~]# w #<==显示已经登录的用户,并且展示他都做了什么的信息。查看的信息与/var/run/utmp文件有关,比较常用。 21:34:56 up 5 days, 21:31, 3 users, load average: 0.00, 0.00, 0.00 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root pts/0 10.0.0.1 09:21 0.00s 0.30s 0.07s w root pts/1 10.0.0.1 21:34 8.00s 0.04s 0.00s -bash root pts/2 10.0.0.1 21:34 14.00s 0.04s 0.00s -bash 以下是上述w命令输出结果的格式说明。 ·上面第1行的输出依次显示了当前的系统时间、系统从启动到现在已经运行的时间、登录到系统中的用户数和系统平均负载。平均负载是指在1分钟、5分钟、15分钟之内系统的负载状况。 ·USER:表示登录系统的用户。 ·TTY:表示用户使用的TTY名称。 ·FROM:表示用户从哪里登录进来,一般是显示远程登录主机的IP地址或者主机名。 ·LOGIN@:用户登录的日期和时间。 ·IDLE:显示终端空闲时间。 ·JCPU:表示该终端上的所有进程及子进程使用系统的总时间。 ·PCPU:当前活动进程使用的系统时间。 ·WHAT:当前用户执行的进程名称和选项。 [root@oldboy ~]# who #<==显示哪些用户正在登录,登录的终端及登录时间,来源主机,显示的信息比w少,不常用。 root pts/0 May 1 09:21 (10.0.0.1) root pts/1 May 1 21:34 (10.0.0.1) root pts/2 May 1 21:34 (10.0.0.1) 以下是who命令的输出格式及说明: 名称 [状态] 线路 时间 [活动] [进程标识] (主机名) 其中各项参数的说明具体如下。 ·名称:用户的登录名。 ·状态:表明线路对用户是否都是可写的。 ·线路:类似于pts/1、pts/2等,此线路标识在/dev目录中可以找到。 ·时间:用户登录系统的时间。 ·活动:某个用户在自己的线路上最后一次活动发生以来到现在的时间。如果此项是个“.”,就表示一分钟内的线路活动;如果线路保持静止已经超过24小时,或者自从系统启动以来还没有被使用过,那么此项标记为“old”。 ·进程标识:用户登录Shell的进程id。 ·主机名:登录到Linux系统上的客户端机器标识。 [root@oldboy ~]# last #<==显示已登录的用户列表及登录时间等,查看的信息与/var/log/wtmp及/var/log/btmp两个文件有关。 root pts/2 10.0.0.1 Tue May 1 21:34 still logged in root pts/1 10.0.0.1 Tue May 1 21:34 still logged in ...省略部分信息... root pts/0 10.0.0.1 Sat Mar 31 14:33 - 18:01 (03:28) root tty1 Sat Mar 31 13:17 - 13:17 (00:00) root pts/0 10.0.0.1 Sat Mar 31 13:02 - 14:33 (01:30) reboot system boot 2.6.32-696.el6.x Sat Mar 31 12:36 - 21:36 (31+09:00) root pts/0 10.0.0.1 Wed Mar 14 18:40 - crash (16+17:55) ...省略部分信息... root pts/0 10.0.0.1 Sat Mar 10 12:26 - 12:28 (00:02) reboot system boot 2.6.32-696.el6.x Sat Mar 10 12:26 - 21:36 (52+09:10) root tty1 Thu Mar 8 10:10 - 10:10 (00:00) reboot system boot 2.6.32-696.el6.x Thu Mar 8 10:07 - 21:36 (54+11:29) wtmp begins Thu Mar 8 10:07:21 2018 [root@oldboy ~]# lastlog #<==报告最近的所有系统用户的登录信息,查看的信息与/var/log/lastlog日志有关。 Username Port From Latest root pts/2 10.0.0.1 Tue May 1 21:34:29 +0800 2018 bin **Never logged in** daemon **Never logged in** adm **Never logged in** ...省略部分信息...nobody dbus **Never logged in** vcsa **Never logged in** abrt **Never logged in** haldaemon **Never logged in** ...省略部分信息... oldboy **Never logged in** range **Never logged in**
十二、Linux用户身份切换命令su
su命令就是切换用户身份的命令。比如,以普通用户kaka登录到系统之后,当在系统中执行useradd添加用户时,会发现kaka用户没有这个权限,这个权限只能由root权限来执行。解决办法之一就是退出kaka用户,重新以root用户的身份登录。方法二是直接在kaka用户下,使用su命令来切换到root用户下进行用户添加的工作,等工作完成后再退出root用户。毫无疑问,上面这两个方法比较起来,通过su命令切换是一种比较好的办法。
su命令可以在用户之间进行切换,超级权限用户root向普通用户切换不需要密码验证(这就是超级权限所在),其他普通用户之间或者从普通用户切换到root,都需要切换用户的密码验证。
1)若命令后面的用户名省略了,则默认切换为root用户。
2)从root用户切换到普通用户时,不需要任何密码,从普通用户切换到root用户时,则需要输入root密码。
若不添加任何参数执行su命令,则表示要切换到root用户,但是这样执行,会遇到一些问题。因为虽然是切换到root用户了,但并没有改变root用户登录后的环境,有些登录的环境设置还是登录前的用户的。生产场景规范的操作方法是“su-”
案例:
1、由普通用户oldboy切换到root用户。
[oldboy@oldboy ~]$ whoami #<==当前登录的用户为普通用户oldboy。 oldboy [oldboy@oldboy ~]$ su root #<==切换用户,若切换的用户为root,则可以省略不写。 Password: #<==这里当然就是root用户的密码了。 [root@oldboy oldboy]# env #<==查看当前登录用户root的环境变量。 USER=oldboy MAIL=/var/spool/mail/oldboy PWD=/home/oldboy #<==已经登录到root了,为什么家目录还是/home/oldboy呢? LOGNAME=oldboy ...省略部分无关内容...
[root@oldboy oldboy]# exit [oldboy@oldboy ~]$ su – root #<==第二种切换用户的方式,使用参数“-”,root可省略。 Password: [root@oldboy ~]# env|egrep "USER|MAIL|PWD|LOGNAME" #<==再次查看环境变量。 USER=root MAIL=/var/spool/mail/root PWD=/root LOGNAME=root #这回环境变量的内容都已经切换到root下了
[oldboy@oldboy ~]$ ls -l /root #<==直接在普通用户oldboy下执行命令是不允许的。 ls: /root: Permission denied [oldboy@oldboy ~]$ su - -c "ls -l /root" #<==这是su的参数组合,表示切换到root用户,并且改变到root环境,然后列出root家目录的文件,最后退出root用户。 Password: #<==在这里输入root的密码,注意,这与后文要讲的sudo是有区别的。 total 52 -rw------- 1 root root 899 Oct 22 23:32 anaconda-ks.cfg -rw-r--r-- 1 root root 23789 Oct 22 23:32 install.log -rw-r--r-- 1 root root 3609 Oct 22 23:32 install.log.syslog
[root@oldboy ~]# tail -1 /etc/rc.local #<==在开机启动文件/etc/rc.local中写入启动命令。 su - oldboy -c '/bin/sh /service/scripts/deploy.sh' #<==以普通用户身份执行脚本,但并不是在用户的下面。
通过普通用户运行服务是一个很好的提升系统安全性的办法,在生产环境中,大多数服务都可以通过普通用户启动(不使用特权端口),而不用root用户启动。这样就可以使系统的安全性又提高一个等级,同时使用普通户管理就可以了,管理者不需要具有root权限。
4、su的总结
1、普通用户切换到root用户,可使用su-或su-root,但必须输入root密码才能完成切换。 2、root用户切换到普通用户,可使用“su-普通用户名”的写法。不需要输入任何密码就能完成切换。在CentOS5.X系统中,切换到普通用户后,在执行一些命令如ifconfig时,可能会遭遇环境变量PATH路径问题,也会因此找不到某些系统命令(一般是/sbin,/usr/sbin等下面的命令),这时就需要使用全路径执行或者调整配置普通用户的PATH变量内容,CentOS6和CentOS7不存在这方面的问题。 3、如果仅希望在某用户下执行命令,而不直接切换到该用户下操作,则可以使用su-用户名-c“命令”的方式。
5、su缺点
却换到root用户的时候,需要root的密码。容易造成root密码的泄漏。