Linux系统用户及用户组管理

认识/etc/passwd和/etc/shadwo:

这两个文件可以说是linux系统中最重要的文件之一。如果没有这两个文件或者这两个文件出问题,则是无法正常登录linux系统的。

/etc/passwd:

passwd

图:passwd前10行内容示例

‘/etc/passwd’ 由 ‘:’ 分割成7个字段,每个字段的具体含义是:

  1. 用户名(如第一行中的root就是用户名),代表用户账号的字符串。用户名字符可以是大小写字母、数字、减号(不能出现在首位)、点以及下划线,其他字符不合法。虽然用户名中可以出现点,但不建议使用,尤其是首位为点时,另外减号也不建议使用,因为容易造成混淆。

  2. 存放的就是该账号的口令,为什么是 ‘x’ 呢?早期的unix系统口令确实是存放在这里,但基于安全因素,后来就将其存放到 ‘/etc/shadow’ 中了,在这里只用一个 ‘x’ 代替。

  3. 这个数字代表用户标识号,也叫做uid。系统识别用户身份就是通过这个数字来的,0就是root,也就是说可以修改test用户的uid为0,那么系统会认为root和test为同一个账户。通常uid的取值范围是0 ~ 65535(但实际上已经可以支持到4294967294),0是超级用户(root)的标识号,1~499由系统保留,作为管理账号,普通用户的标识号从500开始,如果我们自定义建立一个普通用户,您会看到该账户的标识号是大于或等于500的。

  4. 表示组标识号,也叫做gid。这个字段对应着/etc/group 中的一条记录,其实/etc/group和/etc/passwd基本上类似。

  5. 注释说明,该字段没有实际意义,通常记录该用户的一些属性,例如姓名、电话、地址等等。使用finger的功能时就会显示这些信息的。

  6. 用户的家目录,当用户登录时就处在这个目录下。root的家目录是/root,普通用户的家目录则为/home/username,这个字段是可以自定义的,比如您建立一个普通用户test1,要想让test1的家目录在/data目录下,只要修改/etc/passwd文件中test1那行中的该字段为/data即可。

  7. shell,用户登录后要启动一个进程,用来将用户下达的指令传给内核,这就是shell。Linux的shell有很多种sh, csh, ksh, tcsh, bash等,而Redhat/CentOS的shell就是bash。查看/etc/passwd文件,该字段中除了/bin/bash外还有/sbin/nologin比较多,它表示不允许该账号登录。如果您想建立一个账号不让他登录,那么就可以把该字段改成/sbin/nologin,默认是/bin/bash.

  8. hadoop

    例如:此时登录的hadoop用户,uid=1000,gid=1000,注释:hadoop,家目录:/home/hadoop/,shell:/bin/bash

/etc/shadow:

shadow

图:shadow文件示例

这个文件总共被’:’分割成9个字段,具体意思如下:

  1. 用户名,和/etc/passwd对应。

  2. 用户密码:这是账号真正的密码,不过是被加密后的。该文件属性为000,但是root账户可以访问和更改。

    /etc/passwd不安全。有些黑客可破解。

  3. 上次更改密码的日期。这个数字是这样计算得来的,距离1970年1月1日到上次更改密码的日期。例如上次更改密码的日期为2012年1月1日,则这个值就是 ‘365 x (2012-1970) + (2012-1970)/4 + 1 = 15341’. 因为如果是闰年,则有366天。

  4. 要过多少天才可以更改密码,默认是0,即不限制。

  5. 密码多少天后到期。即在多少天内必须更改密码,例如这里设置成30,则30天内必须更改一次密码,否则将不能登录系统,默认是99999,可以理解为永远不需要改。

  6. 密码到期前的警告期限,若这个值设置成7,则表示当7天后密码过期时,系统就发出警告告诉用户,提醒用户他的密码将在7天后到期。

  7. 账号失效期限。如果设置这个值为3,则表示:密码已经到期,然而用户并没有在到期前修改密码,那么再过3天,则这个账号就失效了,即锁定了。

  8. 账号的生命周期,跟第三段一样,是按距离1970年1月1日多少天算的。它表示的含义是,账号在这个日期前可以使用,到期后账号作废。

  9. 作为保留用的,没有什么意义。

新增和删除用户和用户组:

  1. 新增一个组:groupadd

    语法 : groupadd [-g GID] groupname

    “-g” 选项可以自定义gid。不加 “-g” 选项则按照系统默认的gid创建组,跟用户一样,gid也是从500开始的。

  2. 新增一个用户:useradd

    语法 : useradd [-u UID] [-g GID] \[ -d HOME \][-s]

    ‘-u’ 自定义UID

    ‘-g’ 使其属于已经存在的某个组,后面可以跟组id, 也可以跟组名

    ‘-d’ 自定义用户的家目录

    ‘-M’ 不建立家目录

    ‘-s’ 自定义shell

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

    ‘-g’ 选项后面跟一个不存在的gid会报错,提示该组不存在。 ‘-M’ 选项加上后则不建立用户家目录,但是在/etc/passwd文件中仍然有这个字段。但是使用 ls /home/user 查看一下会提示该目录不存在。所以 ‘-M’ 选项的作用只是不创建那个目录。

  3. 删除一个用户:userdel

    语法 : userdel [-r] username

    ‘-r’ 选项的作用只有一个,就是删除账户的时候连带账户的家目录一起删除。

  4. 删除一个组:groupdel
    语法 : gropudel groupname

    有一种情况下不能删除组,当组下有用户是必须先删除用户才能删除组。

用户管理

用户和用户组操作示例

chfn更改用户finger(不常用):

chfn,即change finger information,是用来改变 finger 指令显示的信息。
chfn 指令可用来更改执行 finger 指令时所显示的信息,这些信息都存放在/etc 目录里的 passwd 文件里。若不指定任何参数,则 chfn 指令会进入问答式界面。

用法:
chfn 选项 [用户名]

选项:
-f, –full-name <全名> 真实姓名
-o, –office <办公> 办公号码
-p, –office-phone <电话> 办公电话
-h, –home-phone <电话> 住宅电话

-u, –help 显示此帮助并退出
-v, –version 输出版本信息并退出

更改用户信息

chfn命令示例

顺便看下finger的用法:

finger命令用来查找并显示用户信息,系统管理员通过使用该命令可以知道某个时候到底有多少用户在使用这台Linux主机。

语法: finger [-lmps] [login ...]

命令中各选项的含义如下:

-l :列出该用户的帐号名称,真实姓名,用户专属目录,登入所用的 Shell,登入时间,转信地址,电子邮件状态,还有计划文件和方案文件内容。
-m :排除查找用户的真实姓名。
-s :列出该用户的帐号名称,真实姓名,登入终端机,闲置时间,登入时间以及地址和电话。
-p: 列出该用户的帐号名称,真实姓名,用户专属目录,登入所用的 Shell,登入时间,转信地址,电子邮件状态,但不显示该用户的计划文件和方案文件内容。

finger

图:finger命令示例

创建和修改一个用户的密码:

设置密码:passwd

等创建完账户后,默认是没有设置密码的,虽然没有密码,但该账户同样登录不了系统。只有设置好密码后方可登录系统。

passwd的用法如下:

passwd帮助

图:passwd的用法

“passwd” 后面不加username则是修改当前账户的密码。如果登陆的是root账户,后面可以跟普通账户的名字,意思是修改指定账户的密码。

只有root才可以修该其他账户的密码,普通账户只能修改自己的密码,其他账户的密码是不可以修改的。

更改密码

图:更改密码示例

mkpasswd:用来生成密码的一个工具

默认linux是没有这个密码的,需要安装一个包“expect”。在CentOS上可以通过命令yum install -y expect 安装。

mkpasswd使用示例如下:

1
2
3
4
5
6
[root@localhost hadoop]# mkpasswd
lc2Sv2Ww_
[root@localhost hadoop]# mkpasswd
>3WciqcW6
[root@localhost hadoop]# mkpasswd
VwnY}hy62

用户身份切换:


命令su:切换用户

su的用法如下:

su

图:su的用法

语法:su - username

后面可以跟 ‘-‘ 也可以不跟,普通用户su不加username时就是切换到root用户,当然root用户同样可以su到普通用户。 ‘-‘
这个字符的作用是,加上后会初始化当前用户的各种环境变量。

如果不加 ‘-‘ 切换到root账户下时,当前目录没有变化,而加上 ‘-‘ 切换到root账户后,当前目录为root账户的家目录,这跟直接登陆root账户是一样的。当用root切换普通用户时,是不需要输入密码的。这也体现了root用户至高无上的权利。

切化用户


命令sudo:(很重要命令)

用su是可以切换用户身份,如果每个普通用户都能切换到root身份,如果某个用户不小心泄漏了root的密码,那岂不是系统非常的不安全?没有错,为了改进这个问题,产生了sudo这个命令。使用sudo执行一个root才能执行的命令是可以办到的,但是需要输入密码,这个密码并不是root的密码而是用户自己的密码。默认只有root用户能使用sudo命令,普通用户想要使用sudo,是需要root预先设定的,即,使用 visudo 命令去编辑相关的配置文件/etc/sudoers. 如果没有visudo这个命令,请使用 yum install -y sudo 安装。

默认root能够sudo是因为这个文件中有一行 “root ALL=(ALL) ALL” 在该行下面加入 “hadoop ALL=(ALL) ALL” 就可以让hadoop用户拥有了sudo的权利。使用 “visudo” 命令编辑/etc/sudoers配置文件,其实它的操作方法和前面阿铭介绍的 “vi” 命令使用方法是一样的,按 ‘i’ 进入编辑模式,编辑完成后,按 “Esc” ,再输入 ”:wq” 完成保存。

visudo 里面有“# %wheel ALL=(ALL) ALL”,把#去掉,让这一行生效。它的意思是,wheel这个组的所有用户都拥有了sudo的权利。接下来就需要您把想让有sudo权利的所有用户加入到wheel这个组中即可。CentOS7默认生效。

有一个很实用的案例:

需求是把Linux服务器设置成:只允许使用普通账户登陆,而普通账户登录后,可以不输入密码就能sudo切换到root账户。

可以这样设置:

进入visduo,在文件后面加入三行:

1
2
3
4
> User_Alias USER_SU = test
> Cmnd_Alias SU = /bin/su
> USER_SU ALL=(ALL) NOPASSWD: SU
>

保存配置文件后,使用test,账户登陆Linux后,执行命令 sudo su - 切换到root账户,获取root账户的所有权利。

而不让root直接登陆,这个简单,设置一个非常复杂连自己都记不住的密码。不过这样也有一个问题,就是普通用户可以su到root,然后他再自己修改简单的密码就能直接root登陆。

推荐一个很好的管理账号密码的工具:keeppass

它是免费的、开源的、重量轻且易于使用的密码管理器。

这是它的官网:https://keepass.info/

KeepPass的介绍:

KeePass是一个免费的开源密码管理器,它可以帮助您以安全的方式管理密码。您可以将所有密码放在一个数据库中,数据库用一个主密钥或一个密钥文件锁定。因此,您只需记住一个主密码或选择密钥文件来解锁整个数据库。数据库是使用目前已知的最好和最安全的加密算法(AES和Twofish)加密的。

官网下载的软件是英语的,可以在官网翻译一栏,下载中文插件。按要求放在安装文件的language目录下即可。然后更改语言。

软考截图

图:软件截图

建议下载:免安装版的(zip),可以放在任何移动存储介质上。

坚持原创技术分享,您的支持将鼓励我继续创作!