Linux管理用户及登录信息
2017-10-10 14:47:56 阿炯

Linux系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统。用户的账号一方面可以帮助系统管理员对使用系统的用户进行跟踪,并控制他们对系统资源的访问;另一方面也可以帮助用户组织文件,并为用户提供安全性保护。

每个用户账号都拥有一个唯一的用户名和各自的口令。用户在登录时键入正确的用户名和口令后,就能够进入系统和自己的主目录。实现用户账号的管理,要完成的工作主要有如下几个方面:
1.账号的添加、删除与修改。
2.口令的管理。
3.用户组的管理。

想要在 Linux 中添加用户,可以使用 useradd 工具,如果希望修改一个现有用户账户的属性,就可使用下面的指南中所提到的 usermod 命令,使用 chage 可以对用户及密码过期进行设置,使用 userdel 删除系统中的用户。下面是此类指令的使用不常见方法,还有其它一些不常见的用户管理和信息查询。在开始添加用户或组时有必要先了解一下相关的文件的说明。Linux用户只有两个等级:root及非root,系统中还有一部分用户如:apache、mysql、nobody、nginx等,这些也都是非root用户,即普通用户。用户还要涉及到另外一个概念:用户组。用户组存在的原因主要还是方便分配权限;而用户本身和权限的差别不是很大,各个用户之间主要的不同是:
是否拥有密码
home目录(普通用户可以有一个以自己用户名命名的home目录,存放的地址是/home/username,root用户的home目录是:/root)
shell


/etc/passwd是用户配置文件,每创建一个用户,该配置文件相应增加一行。每个用户一行,用':'分为七段,首行是root用户,其它都是系统自带的用户。各段含义:
用户名,用来对应UID,即用户ID,用来标识用户的唯一标识符
用户的密码
用户的ID
用户的组ID,用来标识用户组的唯一标识符
用户的注释信息,没实质作用
用户的家目录
用户的shell,/bin/bash表示这个用户是可以登录的,/sbin/nologin表示不能登录的。


/etc/shadow是密码配置文件,存放用户密码。每一行与用户配置文件/etc/passwd每一行是一一对应的:
用户名
用户的密码,密码是加密的,而且无法编译。
一个数字,表示天数。距离1970年1月1号到密码更改的时候经过了多少天。
表示密码有多少天之前不能更改,要过多少天才可以更改密码,默认为0,0表示不受限制。
意思是密码多少天后到期及在多少天内必须要更改密码。
密码到期前的期限,系统会有一个提醒。比如期限设置为七天,当七天后密码过期时,系统就是发出警告,提醒用户密码将在七天后到期。
表示账户失效期限,比如期限设置为3天,密码到期后还没有更改密码,三天后这个用户将被锁定。
表示一个账号的生命周期,与第三段差不多,距离19700101账有多少天,账号号在这个日期前可以使用,到期后密码会被锁定,就不能使用。
保留字段,没有实际意义。


/etc/group是用户组的配置文件,类似passwd文件。带-的文件,是系统自动备份的文件,还有passwd- 和shadow- 等。


像nobody这样可用来执行Nginx的工作进程的用户,一般不分配密码和shell,甚至连home目录都没有。如果设置了密码,程序无法自动使用。由于不会有人使用这个用户登录系统,所以就没有必要分配shell(备注:其实严格上说是有分配shell,只是分配的shell是/sbin/nologin这个特殊的shell,没有任何其他功能,主要功能是防止登录)


用户和组数据文件

用户和组信息的主要存储库是/etc中的4个文件:
/etc/passwd 是包含用户的基本信息的密码 文件。
/etc/shadow 是包含已加密的密码的影子密码 文件。
/etc/group 是组文件,包含组的基本信息和哪些用户属于它们。
/etc/gshadow 是包含已加密的组密码的影子组 文件。

出于安全原因,密码 (/etc/passwd) 和组 (/etc/group) 文件都添加了影子文件。passwd 和 group 文件本身必须是所有用户可读的,但加密的密码不应是所有用户可读的。因此影子文件包含加密的密码,而且这些文件仅能由 root 读取。suid 程序提供了必要的验证访问权,该程序具有根权限但可由任何用户运行。

所有用户都可以通过查看/etc/passwd查看。文件的每一行代表着一个用户,每一行由冒号“:”分割成7个字段,其结构如下:
用户名:密码:UID:GID:用户全名:home目录:shell


UID:

UID 0 root用户
UID 1~999 是系统中常用默认用户,即一些无法登录的用户(之前是系统是1~499)
UID 1000 以上是正常的可登录用户

GID:前面说了一个用户可以属于多个用户组,但这里只有一个,表示的是专职用户组,即一个用户只有一个专职用户组,其属于其他用户组的关联关系存储在/etc/group 文件中。其中比较特殊的是密码字段,统一由x代替了,看/etc/passwd就知道一开始Linux是将密码存在这个文件里的,由于考虑到/etc/passwd可以被所有人查看,所以将统一存储到/etc/shadow文件(只有root权限可以访问)中。


其结构如下:

登录名:加密过的密码(*代表此用户不能用来登录):密码最近更改日期(linux时间戳):最少密码天数(0代表随时可更改):最多密码天数:过期前几天提醒用户:密码不可用期限:账户过期日期:保留位


name

登录名称,必须是有效用户名

password

已加密密码,分为三个部分用$分隔,第一部分表示用哪种哈希算法;第二部分是用于加密哈希的salt;第三部分是已加密的哈希。哈希算法有:1表示MD5;6表示SHA-512;5表示SHA-256

注意:在密码前一个感叹号(!)代表该用户被锁定,可以在机器上转到改用户,但无法远程

注意:密码是两个感叹号(!),表示没有设置密码

lastchanage

最近一次更改密码的日期,以距离1970/1/1的天数表示

min-age

密码更改后多少天内不能再次更改。0表示可以随时更改

max-age

密码过期时间,必须在期限内修改密码

warning

警告期,警告用户再过多少天密码将过期。0表示不提供警告

inactive

宽限期,密码过期多少天仍然可以使用

expire

帐号过期时间,以距离1970/1/1的天数表示。0或空字符表示永不过期

blank

预留字段



再来看看/etc/group文件:


其结构如下:

组名:用户组密码:GID:用户组内的用户名

正常的使用中很少会用到用户组密码,其存储在/etc/gshadow中。

用户组文件比较特殊的是“用户组内的用户名”,其实就是这个组下的用户列表,每个用户之间用逗号“,”分割;本字段可以为空;如果字段为空表示用户组为GID的用户名。



用户与组常用操作


添加用户

useradd命令用于linux中创建的新的系统用户。帐号建好之后,再用passwd设定帐号的密码,另外可以用userdel删除帐号。使用useradd指令所建立的帐号,实际上是保存在/etc/passwd文本文件中。

语法:useradd(选项)(参数)
选项:
-c<备注>:加上备注文字。备注文字会保存在passwd的备注栏位中
-d<登入目录>:指定用户登入时的启始目录
-D:变更预设值
-e<有效期限>:指定帐号的有效期限
-f<缓冲天数>:指定在密码过期后多少天即关闭该帐号
-g<群组>:指定用户所属的群组
-G<群组>:指定用户所属的附加群组
-m:自动建立用户的登入目录
-M:不要自动建立用户的登入目录
-n:取消建立以用户名称为名的群组
-r:建立系统帐号
-s:指定用户登入后所使用的shell
-u:指定用户id

用户密码修改

passwd命令用于设置用户的认证信息,包括用户密码、密码过期时间等。系统管理者则能用它管理系统用户的密码。只有管理者可以指定用户名称,一般用户只能变更自己的密码。

passwd [-k] [-l] [-u [-f]] [-d] [-e] [-n mindays] [-x maxdays] [-w warndays] [-i inactivedays] [-S] [--stdin] [username]

passwd程序用于更新用户的身份验证令牌(口令/密码),是通过调用Linux-PAM和Libuser API实现的。实际上它将自身初始化为Linux-PAM的passwd服务,并利用配置的密码模块进行身份验证,然后更新用户的密码。


语法:passwd(选项)(参数)

常用选项
-d:删除密码,仅有系统管理者才能使用;
-f:强制执行;
-k:设置只有在密码过期失效后,方能更新;
-l:锁住密码;
-s:列出密码的相关信息,仅有系统管理者才能使用;
-u:解开已上锁的帐号。

普通用户如果想更改自己的密码,直接运行passwd即可。如果新建用户后,要为新用户创建密码,则用passwd用户名,注意要以root用户的权限来创建。

全部选项
-k,--keep 此选项仅用于更新过期的身份验证令牌(口令/密码);用户希望保留没有过期的身份验证令牌(口令/密码)
-l,--lock 此选项用于锁定指定账户的密码,仅适用于root用户。通过将加密密码呈现为无效字符串(通过在加密字符串前加上!)来执行锁定。
注意:该账户未完全锁定--用户仍可通过其他身份验证方式登录,例如ssh公钥身份验证。使用”chage –E 0 user(这里面是零)”命令代替完全账户锁定
--stdin 此选项用于指示passwd应从标准输入读取新密码,标准输入可以是管道(|)
-u,--unlock 这与-l选项相反--它通过删除字首!来解锁账户密码。一样仅适应于root用户。默认情况下,passwd将拒绝创建无密码账户(它不会解锁只有!作为密码的账户)。强制选项-f将废除此保护。
-d,--delete 这是删除账户密码的快捷方式。它将指定账户设置为无密码,仅适用于root用户。
-e,--expire 这是一个过期账户密码的快捷方式。在下次尝试登录期间,用户将被迫更改密码。仅适用于root用户。
-f,--force 强制指定的操作。
-n,--minimum DAYS 如果用户的账户支持密码生存期,这将设置最小密码生存期(单位天),仅适用于root用户。
-x,--maximum DAYS 如果用户的账户支持密码生存期,这将设置最长密码生存期(单位天),仅适用于root用户。
-w,--warning DAYS 如果用户的账户支持密码生存期,这将设置用户其密码将过期前DAYS天开始警告,仅适用于root用户。
-i,--inactive DAYS如果用户的账户支持密码生存期,这将设置此账户密码过期前经过的天数,这意味着账户将被视为不活动且应禁用,仅适用于root用户。
-S,--status 这将输出有关于给定账户的密码状态的简短信息,仅适用于root用户。


chpasswd命令用批量修改用户密码。从系统的标准输入读入用户的名称和口令,并利用这些信息来更新系统上已存在的用户的口令。

注意:命令内没有用户名和密码,回车后以"用户名:密码"的格式输入(密码一般为明文),chpasswd根据选项加密。

常用选项
-c,--crypt-method METHOD 使用指定的方法加密。加密方法有DES,MD5,NONE,SHA256,SHA512
-e,--encrypted 提供的密码已经加密
-h,--help 帮助
-m.--md5

语法:
# echo username:password | chpasswd
# chpasswd < userandpwd.list

参数:
-e :如果使用了-e选项,口令将只能以加密的方式传递;如果未使用-e选项,口令将按明文的形式传递。

实例:非交互式修改密码
echo c12Xp56d | passwd --stdin user02
echo "user03:weGH6puh" | chpasswd

注意事项:
1)、用户名必须是系统上已存在的用户
2)、普通用户没有使用这个指令的权限
3)、如果输入文件是按非加密方式传递的话,请对该文件进行适当的加密。
4)、指令文件不能有空行

普通用户默认是没有chpasswd的权限,但是可以通过修改命令文件权限来修改:
# chmod 4755 /usr/sbin/chpasswd

这样普通用户就可以使用chpasswd来修改密码。


用户信息修改

usermod命令用于修改用户的基本信息。usermod命令不允许你改变正在线上的使用者帐号名称。当usermod命令用来改变user id,必须确认这名user没在电脑上执行任何程序。你需手动更改使用者的crontab档。也需手动更改使用者的at工作档。采用NIS server须在server上更动相关的NIS设定。

语法:usermod(选项)(参数)
选项
-c<备注>:修改用户帐号的备注文字;
-d<登入目录>:修改用户登入时的目录;
-e<有效期限>:修改帐号的有效期限;
-f<缓冲天数>:修改在密码过期后多少天即关闭该帐号;
-g<群组>:修改用户所属的群组;
-G<群组>;修改用户所属的附加群组;
-l<帐号名称>:修改用户帐号名称;
-L:锁定用户密码,使密码无效;
-s<shell>:修改用户登入后所使用的shell;
-u<uid>:修改用户ID;
-U:解除密码锁定。


下面再附带一些英文参考与操作实例(可能有重复)。


使用useradd添加用户

Create a User with Specific Group ID
add a user ‘tarunika‘ with a specific UID and GID simultaneously with the help of ‘-u‘ and ‘-g‘ options.
# useradd -u 1000 -g 500 tarunika

Add a User to Multiple Groups
The ‘-G‘ option is used to add a user to additional groups. Each group name is separated by a comma, with no intervening spaces,we are adding a user ‘freeoa‘ into multiple groups like admins, webadmin and developer.
# useradd -G admins,webadmin,developers freeoa

Add a User without Home Directory
To create user’s without their home directories, ‘-M‘ is used. For example, the following command will create a user ‘shilpi‘ without a home directory.
# useradd -M shilpi

Add a User without Home Directory, No Shell, No Group and Custom Comment
This following command is very different than the other commands explained above. Here we used ‘-M‘ option to create user without user’s home directory and ‘-N‘ argument is used that tells the system to only create username (without group). The ‘-r‘ arguments is for creating a system user.
# useradd -M -N -r -s /bin/false -c "Disabled freeoa Member" clayton

使用usermod修改用户属性

After creating user accounts, in some scenarios where we need to change the attributes of an existing user such as, change user’s home directory, login name, login shell, password expiry date, etc, where in such case ‘usermod’ command is used.When we execute ‘usermod‘ command in terminal, the following files are used and affected.
/etc/passwd – User account information.
/etc/shadow – Secure account information.
/etc/group – Group account information.
/etc/gshadow – Secure group account information.
/etc/login.defs – Shadow password suite configuration..

Basic syntax of command is:
usermod [options] username

Requirements

We must have existing user accounts to execute usermod command.
Only superuser (root) is allowed to execute usermod command.
The usermod command can be executed on any Linux distribution.
Must have basic knowledge of usermod command with options

Options of Usermod

The ‘usermod‘ command is simple to use with lots of options to make changes to an existing user. Let us see how to use usermod command by modifying some existing users in Linux box with the help of following options.

-c = We can add comment field for the useraccount.
-d = To modify the directory for any existing user account.
-e = Using this option we can make the account expiry in specific period.
-g = Change the primary group for a User.
-G = To add a supplementary groups.
-a = To add anyone of the group to a secondary group.
-l = To change the login name from freeoa to freeoa_admin.
-L = To lock the user account. This will lock the password so we can’t use the account.
-m = moving the contents of the home directory from existing home dir to new dir.
-p = To Use un-encrypted password for the new password. (NOT Secured).
-s = Create a Specified shell for new accounts.
-u = Used to Assigned UID for the user account between 0 to 999.
-U = To unlock the user accounts. This will remove the password lock and allow us to use the user account.

Change User Primary Group
# usermod -g babin freeoa_test

Adding Group to an Existing User
If you want to add a new group called ‘freeoa_test0‘ to ‘freeoa‘ user, you can use option ‘-G‘ with usermod command as shown below.
# usermod -G freeoa_test0 freeoa

Adding Supplementary and Primary Group to User
If you need to add a user to any one of the supplementary group, you can use the options ‘-a‘ and ‘-G‘. For example, here we going to add a user account freeoa_test0 with the wheel user.
# usermod -a -G wheel freeoa_test0

Change User Login Name
To change any existing user login name, we can use ‘-l‘ (new login) option. In the example below, we changing login name freeoa to freeoa_admin. So the username freeoa has been renamed with the new name freeoa_admin.
# usermod -l freeoa_admin freeoa

Lock User Account
To Lock any system user account, we can use ‘-L‘ (lock) option, After the account is locked we can’t login by using the password and you will see a ! added before the encrypted password in /etc/shadow file, means password disabled.
# usermod -L babin

会在/etc/shadow该用户所在行的密码字符前加上'!'。

Using passwd command including the –lock option can help you achieve this:
# passwd --lock freeoa

Unlock User Account
The ‘-U‘ option is used to unlock any locked user, this will remove the ! before the encrypted password.
# usermod -U babin

Move User Home Directory to New location
Let’s say you’ve a user account as ‘pinky‘ with home directory ‘/home/pinky‘, you want to move to new location say ‘/var/pinky‘. You can use the options ‘-d‘ and ‘-m‘ to move the existing user files from current home directory to a new home directory.Now we have to move the home directory from /home/pinky to /var/pinky.
# usermod -d /var/pinky/ -m pinky

Create Un-encrypted Password for User
To create an un-encrypted password, we use option ‘-p‘ (password). For demonstration purpose, I’m setting a new password say ‘redhat’ on a user pinky.
# usermod -p redhat pinky

After setting password, now check the shadow file to see whether its in encrypted format or un-encrypted.

Change User ID (UID)
In the example below, you can see that my user account ‘babin‘ holds the UID of 502, now I want to change it to 888 as my UID. We can assign UID between 0 to 999.Now, let’s change the UID for user babin using ‘-u‘ (uid) option and verify the changes.
# usermod -u 888 babin

Change UID and GID of a User
We can change UID and GID of a current user. For changing to a New GID we need an existing group. Here already there is an account named as orange with GID of 777.Now my jack user account want to be assigned with UID of 666 and GID of Orange (777).Check for the current UID and GID before modifying.
# id jack

Modify the UID and GID.
# usermod -u 666 -g 777 jack

修改用户的默认shell

使用usermod修改
usermod --shell /bin/bash freeoa

使用chsh修改
chsh --shell /bin/sh freeoa

修改/etc/passwd中对应的shell字段,下次登录后就生效。

禁止正常用户登录
Block or Disable Normal User Logins

Using /etc/nologin File

The primary function of /etc/nologin file is to display a message (stored in the file) to users attempting to log on to a system during the process of shutdown.

Once the message has been displayed to the user, the login procedure terminates, preventing the user from logging onto the system.This can be used to block user login by manually creating the file as follows.
# vi /etc/nologin

在文件中写入如下的提示,用户在登录时就能看到:
The Server is down for a routine maintenance. We apologize for any inconvenience caused, the system will be up and running in 1 hours time. For more information, contact the system admin.

Block User Logins Using nologin Shell

This method works a little differently: it only blocks a user from accessing a shell. But he or she can log on to the system via programs such as ftp that do not necessarily require a shell for the user to connect to a system.

Simply use chsh (change shell) command to change the users shell in /etc/passwd file from something like /bin/bash or /bin/sh to /sbin/nologin meaning refuse a login.

# chsh -s /bin/nologin freeoa

查看用户信息

id 命令
id 是用来展示当前一个活动用户以及组 ID 的命令行工具,后跟其它用户名可查看其用户基本信息。

groups 命令
groups 命令可以被用来展示一个用户所归属的所有组的信息。

finger 命令
finger 命令可以被用来查找 Linux 上的一个用户的信息。在许多 Linux 系统上,它并没被预装,因为它可能会导致用户信息泄露的安全问题。

它会显示出一个用户的真实名称、主目录、shell,登录的名称以及时间,还有如下所示的许多信息:

$ finger freeoaLogin: freeoa                    Name: freeoa
Directory: /home/freeoa                Shell: /bin/bash
On since Fri Sep 22 10:39 (IST) on tty8 from :0
2 hours 1 minute idle
No mail.
No Plan.

getent 命令
getent 是一个可以从特定系统数据库的 Name Service Switch(NSS 名字服务交换器) 库获取到信息的命令行工具。要获取一个用户账户的详细信息,可以像下面这样使用 passwd 数据库和 username 来做到。

$ getent passwd freeoa

lslogins 命令
lslogins 命令会展示出系统中现有用户的相关信息,-u 标记可用来标识只展示用户的账户。

users 命令
users 命令会展示当前已经登录系统的所有用户的用户名。

who 命令
who 命令可以用来展示那些登录了系统的用户,包括了它们是从哪里连接到系统上来的终端信息。

w 命令
w 命令会展示出所有登录了系统的用户,还有它们都正在做些什么事情。

last 或者 lastb 命令
last/lastb 命令会展示一个最近登录系统的用户列表。

lastlog 命令
lastlog 命令可以用来查找最近登录那些或者某个特定用户的详细信息。

彻底删除用户及其目录

you can safely remove user together with his/her home directory, to remove all user files on the system use the --remove-all-files option in the command below:
# deluser --remove-home freeoa      [On Debian and its derivatives]
# userdel --remove freeoa           [On RedHat/CentOS based systems]


关于/etc/securetty

该文件可控制根用户登录的设备,该文件里记录的是可以作为根用户登录的设备名,如tty1、tty2等,用户是不能从不存在于该文件里的设备登录为根用户的。这种情况用户只能以普通用户登录进来,再用su命令转为根用户。/etc/securetty文件的格式如下:
# /etc/securetty: list of terminals on which root is allowed to login.
# See securetty(5) and login(1).
console
# for people with serial port consoles
ttyS0
# for devfs
tts/0
# Standard consoles
tty1
tty2
tty3
...

1)当根用户试图登陆时,login程序首先查阅/etc/securetty, 看看其中是否列出了当前字符终端设备。
1>如果没有找到, login会认为它不安全,而提示口令,而后报告Login  incorrect错误;
2>如果没有/etc/securetty文件,根用户可以从任何一台字符终端上登陆,从而造成安全问题;
3>如果/etc/securetty是一个空文件,则根用户就不能从任务的设备登录系统。只能以普通用户登录,再用su命令转成根用户;
4>/etc/securetty的权限应是600或400。

另注:TTY 控制终端包括
(1)tty 从虚拟控制台登陆
(2)pts 在x下开的shell窗口则显示为pts

1、tty 有 rs232、rs422、vcon三种设备,平常主要使用rs232接口的串行端口作心跳或者连接串行设备;
2、pts 每一个远程连接都会产生一个pts设备;
3、console 当系统安装时,可以直接选择串口终端或者连接显卡。


sudo权限

普通用户的权限非常的低,就连在系统里安装软件的权限都没有,很多时候可以临时给普通用户以特权,就是sudo(在命令前添加sudo)。比如:
sudo cat /etc/shadow

完成后需要您输入root的密码,这样就可以假借root身份了,centos默认普通用户是没有sudo权限的,这与主要以桌面版为主的Ubuntu和Fedora不同,如需给予用户root特权,就需要更改/etc/sudoers文件。

给没有用户添加sudo特权,只需参照:
## Allow root to run any commands anywhere
rootALL=(ALL) ALL

添加如下:
## Allow root to run any commands anywhere
root    ALL=(ALL) ALL
qw    ALL=(ALL) ALL

如果要给某个用户组添加sudo特权则为:(与给用户不同的是多了一个%)
## Allows people in group wheel to run all commands
%wheel ALL=(ALL)    ALL

另外一种方式是添加不需要输入root密码即有root权限的用户,添加方法如下:
qw    ALL=(ALL) NOPASSWD:ALL

另外还可以设定到底有哪些执行权限,具体的规则如下:
授权用户 主机=[(切换到哪些用户或用户组)] [是否需要密码验证] 命令1,[(切换到哪些用户或用户组)] [是否需要密码验证] [命令2],[(切换到哪些用户或用户组)] [是否需要密码验证] [命令3]……

默认情况下第一次使用sudo时,需要输入root密码,如果5分钟内再次执行sudo则无需再输入密码,超过5分钟则要重新输入。这个时间也是可以进行配置的,在sudoers中添加如下内容即可:
Defaults:用户名 timestamp_timeout=20

其中单位是分钟,如果设为0,则表示每次都要输入密码。


配置文件/etc/login.defs


egrep是grep的高级用法等同于grep -e,-v选项表示取反值,"^$|^#"中^表示以什么开头,$表示空行,完整意思表示以空行或#开头。
# egrep -v "^$|^#" /etc/login.defs
MAIL_DIR        /var/spool/mail
PASS_MAX_DAYS   99999
PASS_MIN_DAYS   0
PASS_MIN_LEN    5
PASS_WARN_AGE   7
UID_MIN                  1000
UID_MAX                 60000
SYS_UID_MIN               201
SYS_UID_MAX               999
GID_MIN                  1000
GID_MAX                 60000
SYS_GID_MIN               201
SYS_GID_MAX               999
CREATE_HOME     yes
UMASK           077
USERGROUPS_ENAB yes
ENCRYPT_METHOD SHA512

详细说明:
CREATE_HOME(boolean) 指示是否应该为新用户默认创建主目录。此设置并不应用到系统用户,并且可以使用命令行覆盖。

GID_MAX(number),GID_MIN(number) useradd,groupadd或newusers创建的常规组的组ID范围。GID_MIN默认值1000(CentOS6为500),GID_MAX默认值60000。

MAIL_DIR(string)邮箱目录。修改或删除用户账户时需要处理邮箱,如果没有指定,将使用编译时指定的默认值。

MAIL_FILE(string) 定义用户邮箱文件的位置(相对于主目录)。

注意:MAIL_DIR和MAIL_FILE变量由useradd,usermod和userdel用于创建、移动或删除用户邮箱。如果MAIL_CHECK_ENAB设置为yes,它们也被用于定义MAIL环境变量。

MAX_MEMBERS_PER_GROUP(number) 每个组条目的最大成员数。达到最大值时,在/etc/group开始一个新条目(行)(使用同样的名称,同样的密码,同样的GID)。默认值是0,意味着组中的成员数没有限制。此功能(分割组)允许限制组文件中的行长度。这对于确保NIS组的行比长于1024字符。如果要强制这个限制,可以使用25。

注意:分割组可能不受所有工具的支持(甚至在Shadow工具集中)。如果没有必要你不应该使用这个变量。

PASS_MAX_DAYS(number) 一个密码可以使用的最大天数。如果密码比这个旧,将会强迫更改密码。如果不指定,就假定为-1,这会禁用此限制。

PASS_MIN_DAYS(number) 两次更改密码时间最小间隔。将会拒绝任何早于此的更改密码的尝试。如果不指定就假定为-1,将会禁用此限制。

PASS_WARN_AGE(number) 密码过期之前鬼畜警告的天数。0表示在过期当天警告,负值表示不警告。如果没有指定,不会给出警告。

SYS_GID_MAX(number),SYS_GID_MIN(number) useradd、groupadd或newusers创建的系统组的组ID范围。SYS_GID_MIN默认101(CentOS6为201),SYS_GID_MAX默认GID_MIN-1。

SYS_UID_MAX(number),SYS_UID_MIN(number) useradd或newusers创建的系统用户的用户ID的范围。SYS_UID_MIN默认101(CentOS6为201),SYS_UID_MAX默认UID_MIN-1。

UID_MAX(number),UID_MIN(number) useradd或newusers创建的普通用户的用户ID的范围。UID_MIN默认1000(CentOS6为500),UID_MAX默认60000。

UMASK(number) 文件模式创建掩码初始化为此值。如果没有指定,掩码初始化为022。Useradd和newusers使用此掩码设置它们创建的用户主目录的模式。也被login用于指定用户的初始umask。注意,此掩码可以被用户的GECOS行覆盖(当设置了QUOTAS_ENAB时),也可以被带K指示符的limits(5)定义的限制值覆盖。

USERGROUPS_ENAB(boolean) 如果uid和gid相同,用户名和主用户名也相同,使非root组的组掩码位和属主位相同(如:022->002,077->007)。如果设置为yes,组中也没有成员了,userdel将移除此用户组,useradd创建用户时,也会创建一个同名的默认组。


小结

添加用户账号就是在系统中创建一个新账号,然后为新账号分配用户号、用户组、主目录和登录Shell等资源。刚添加的账号是被锁定的,无法使用,useradd命令语法如下:
useradd 选项 用户名

参数选项说明:
-c comment 指定一段注释性描述。
-d 目录 指定用户主目录,如果此目录不存在,则同时使用-m选项,可以创建主目录。
-g 用户组 指定用户所属的用户组。
-G 用户组,用户组 指定用户所属的附加组。
-s Shell文件 指定用户的登录Shell。
-u 用户号 指定用户的用户号,如果同时有-o选项,则可以重复使用其他用户的标识号。

用户名:指定新账号的登录名。

增加用户账号就是在/etc/passwd文件中为新用户增加一条记录,同时更新其他系统文件如/etc/shadow, /etc/group等。

删除用户账号就是要将/etc/passwd等系统文件中的该用户记录删除,必要时还删除用户的主目录。

删除一个已有的用户账号使用userdel命令,其格式如下:
userdel 选项 用户名

常用的选项是 -r,其作用是把用户的主目录一起删除。

此命令删除用户在系统文件中(主要是/etc/passwd, /etc/shadow, /etc/group等)的记录,同时删除用户的主目录。

修改用户账号就是根据实际情况更改用户的有关属性,如用户号、主目录、用户组、登录Shell等。修改已有用户的信息使用usermod命令,其格式如下:
usermod 选项 用户名

常用的选项包括-c, -d, -m, -g, -G, -s, -u以及-o等,这些选项的意义与useradd命令中的选项一样,可以为用户指定新的资源值。另外有些系统可以使用选项:-l 新用户名;该选项指定一个新的账号,即将原来的用户名改为新的用户名。

用户管理的一项重要内容是用户口令的管理。用户账号刚创建时没有口令,但是被系统锁定,无法使用,必须为其指定口令后才可以使用,即使是指定空口令。指定和修改用户口令的Shell命令是passwd。超级用户可以为自己和其他用户指定口令,普通用户只能用它修改自己的口令。命令的格式为:
passwd 选项 用户名

可使用的选项:
-l 锁定口令,即禁用账号。
-u 口令解锁。
-d 使账号无口令。
-f 强迫用户下次登录时修改口令。

如果默认用户名,则修改当前用户的口令。

每个用户都有一个用户组,系统可以对一个用户组中的所有用户进行集中管理。不同Linux系统对用户组的规定有所不同,如其下的用户属于与它同名的用户组,这个用户组在创建用户时同时创建。用户组的管理涉及用户组的添加、删除和修改。组的增加、删除和修改实际上就是对/etc/group文件的更新。

增加一个新的用户组使用groupadd命令,其格式如下:
groupadd 选项 用户组

可以使用的选项有:
-g GID 指定新用户组的组标识号(GID)。
-o 一般与-g选项同时使用,表示新用户组的GID可以与系统已有用户组的GID相同。

删除一个已有的用户组,使用groupdel命令,其格式如下:
groupdel 用户组

修改用户组的属性使用groupmod命令,其语法如下:
groupmod 选项 用户组

常用的选项有:
-g GID 为用户组指定新的组标识号。
-o 与-g选项同时使用,用户组的新GID可以与系统已有用户组的GID相同。
-n新用户组 将用户组的名字改为新名字

一个用户同时属于多个用户组,那么用户可以在用户组之间切换,以便具有其他用户组的权限。用户可以在登录后,使用命令newgrp切换到其他用户组,这个命令的参数就是目的用户组。例如:
$ newgrp root

这条命令将当前用户切换到root用户组,前提条件是root用户组确实是该用户的主组或附加组。类似于用户账号的管理,用户组的管理也可以通过系统管理工具来完成。

用户账号相关的系统文件

与用户和用户组相关的信息都存放在一些系统文件中,这些文件包括/etc/passwd, /etc/shadow, /etc/group等。下面分别介绍这些文件的内容:

/etc/passwd

passwd是用户管理工作涉及的最重要的一个文件,该文件对所有用户都是可读的。Linux系统中的每个用户都在该文件中有一个对应的记录行,记录了这个用户的一些基本属性。
每行记录又被冒号(:)分隔为7个字段,其格式和具体含义如下:
用户名:口令:用户标识号:组标识号:注释性描述:主目录:登录Shell

1)、“用户名”是代表用户账号的字符串。
通常长度不超过8个字符,并且由大小写字母和/或数字组成。登录名中不能有冒号(:),因为冒号在这里是分隔符。为了兼容起见,登录名中最好不要包含点字符(.),并且不使用连字符(-)和加号(+)打头。

2)、“口令”一些系统中,存放着加密后的用户口令字。
虽然这个字段存放的只是用户口令的加密串,不是明文,但是由于/etc/passwd文件对所有用户都可读,所以这仍是一个安全隐患。因此现在许多Linux 系统(如SVR4)都使用了shadow技术,把真正的加密后的用户口令字存放到/etc/shadow文件中,而在/etc/passwd文件的口令字段中只存放一个特殊的字符,例如“x”或者“*”。

3)、“用户标识号”是一个整数,系统内部用它来标识用户。
一般情况下它与用户名是一一对应的。如果几个用户名对应的用户标识号是一样的,系统内部将把它们视为同一个用户,但是它们可以有不同的口令、不同的主目录以及不同的登录Shell等。通常用户标识号的取值范围是0~65 535。0是超级用户root的标识号,1~99由系统保留,作为管理账号,普通用户的标识号从100开始。在Linux系统中,这个界限是500。

4)、“组标识号”字段记录的是用户所属的用户组。它对应着/etc/group文件中的一条记录。

5)、“注释性描述”字段记录着用户的一些个人情况。
例如用户的真实姓名、电话、地址等,这个字段并没有什么实际的用途。在不同的Linux 系统中,这个字段的格式并没有统一。在许多Linux系统中,这个字段存放的是一段任意的注释性描述文字,用做finger命令的输出。

6)、“主目录”,也就是用户的起始工作目录。
它是用户在登录到系统之后所处的目录。在大多数系统中,各用户的主目录都被组织在同一个特定的目录下,而用户主目录的名称就是该用户的登录名。各用户对自己的主目录有读、写、执行(搜索)权限,其他用户对此目录的访问权限则根据具体情况设置。

7)、用户登录后,要启动一个进程,负责将用户的操作传给内核,这个进程是用户登录到系统后运行的命令解释器或某个特定的程序,即Shell。Shell是用户与Linux系统之间的接口。Linux的Shell有许多种,每种都有不同的特点。常用的有sh(Bourne Shell), csh(C Shell), ksh(Korn Shell), tcsh(TENEX/TOPS-20 type C Shell), bash(Bourne Again Shell)等。

系统管理员可以根据系统情况和用户习惯为用户指定某个Shell。如果不指定Shell,那么系统使用sh为默认的登录Shell,即这个字段的值为/bin/sh。用户的登录Shell也可以指定为某个特定的程序(此程序不是一个命令解释器)。利用这一特点可以限制用户只能运行指定的应用程序,在该应用程序运行结束后,用户就自动退出了系统。有些Linux 系统要求只有那些在系统中登记了的程序才能出现在这个字段中。

8)、系统中有一类用户称为伪用户(pseudo users)。
这些用户在/etc/passwd文件中也占有一条记录,但是不能登录,因为它们的登录Shell为空。它们的存在主要是方便系统管理,满足相应的系统进程对文件属主的要求。常见的伪用户如下所示:
伪 用 户 含 义
bin 拥有可执行的用户命令文件
sys 拥有系统文件
adm 拥有帐户文件
uucp UUCP使用
lp lp或lpd子系统使用
nobody NFS使用

帐户文件

1)、除了上面列出的伪用户外还有许多标准的伪用户,例如:audit, cron, mail, usenet等,他们也都各自为相关的进程和文件所需要。

由于/etc/passwd文件是所有用户都可读的,如果用户的密码太简单或规律比较明显的话,一台普通的计算机就能够很容易地将它破解,因此对安全性要求较高的Linux系统都把加密后的口令字分离出来,单独存放在一个文件中,该文件是/etc/shadow文件。有超级用户才拥有该文件读权限,这就保证了用户密码的安全性。

2)、/etc/shadow中的记录行与/etc/passwd中的一一对应,它由pwconv命令根据/etc/passwd中的数据自动产生。

其格式与/etc/passwd类似,由若干个字段组成,字段之间用":"隔开。这些字段是:
登录名:加密口令:最后一次修改时间:最小时间间隔:最大时间间隔:警告时间:不活动时间:失效时间:标志
"登录名"是与/etc/passwd文件中的登录名相一致的用户账号
"口令"字段存放的是加密后的用户口令字,长度为13个字符。如果为空,则对应用户没有口令,登录时不需要口令;如果含有不属于集合 { ./0-9A-Za-z }中的字符,则对应的用户不能登录。
"最后一次修改时间"表示的是从某个时刻起,到用户最后一次修改口令时的天数,时间起点对不同的系统可能不一样。在多数Linux中的这个时间起点是1970年1月1日。
"最小时间间隔"指的是两次修改口令之间所需的最小天数。
"最大时间间隔"指的是口令保持有效的最大天数。
"警告时间"字段表示的是从系统开始警告用户到用户密码正式失效之间的天数。
"不活动时间"表示的是用户没有登录活动但账号仍能保持有效的最大天数。
"失效时间"字段给出的是一个绝对的天数,如果使用了这个字段,那么就给出相应账号的生存期。期满后,该账号就不再是一个合法的账号,也就不能再用来登录了。

3)、用户组的所有信息都存放在/etc/group文件中。

将用户分组是Linux系统中对用户进行管理及控制访问权限的一种手段。每个用户都属于某个用户组;一个组中可以有多个用户,一个用户也可以属于不同的组。

当一个用户同时是多个组中的成员时,在/etc/passwd文件中记录的是用户所属的主组,也就是登录时所属的默认组,而其他组称为附加组。

用户要访问属于附加组的文件时,必须首先使用newgrp命令使自己成为所要访问的组中的成员。用户组的所有信息都存放在/etc/group文件中。此文件的格式也类似于/etc/passwd文件,由冒号(:)隔开若干个字段,这些字段有:
组名:口令:组标识号:组内用户列表

"组名"是用户组的名称,由字母或数字构成。与/etc/passwd中的登录名一样,组名不应重复。
"口令"字段存放的是用户组加密后的口令字。一般Linux 系统的用户组都没有口令,即这个字段一般为空,或者是*。
"组标识号"与用户标识号类似,也是一个整数,被系统内部用来标识组。
"组内用户列表"是属于这个组的所有用户的列表,不同用户之间用逗号(,)分隔。这个用户组可能是用户的主组,也可能是附加组。


添加批量用户

添加和删除用户对每位Linux系统管理员都是轻而易举的事,比较棘手的是如果要添加几十成百个甚至上千个用户时,不太可能还使用useradd一个一个地添加,必然要找一种简便的创建大量用户的方法。Linux提供了创建大量用户的工具,可以立即创建大量用户,方法如下:

1)、先编辑一个文本用户文件。
每一列按照/etc/passwd密码文件的格式书写,要注意每个用户的用户名、UID、宿主目录都不可以相同,其中密码栏可以留做空白或输入x号。一个范例文件user.txt内容如下:
user01::600:100:user:/home/user001:/bin/bash
user02::601:100:user:/home/user002:/bin/bash

2)、以root身份执行命令 /usr/sbin/newusers,从刚创建的用户文件user.txt中导入数据,创建用户:
# newusers < user.txt

然后可以执行命令 vipw 或 vi /etc/passwd 检查 /etc/passwd 文件是否已经出现这些用户的数据,并且用户的宿主目录是否已经创建。

3)、执行命令/usr/sbin/pwunconv。
将 /etc/shadow 产生的 shadow 密码解码,然后回写到 /etc/passwd 中,并将/etc/shadow的shadow密码栏删掉。这是为了方便下一步的密码转换工作,即先取消 shadow password 功能。
# pwunconv

4)、编辑每个用户的密码对照文件。
格式为:用户名:密码
实例文件 passwd.txt 内容如下:
user01:12X456
user02:1234P6

5)、以 root 身份执行命令 /usr/sbin/chpasswd。
创建用户密码,chpasswd 会将经过 /usr/bin/passwd 命令编码过的密码写入 /etc/passwd 的密码栏。
# chpasswd < passwd.txt

6)、确定密码经编码写入/etc/passwd的密码栏后。
执行命令 /usr/sbin/pwconv 将密码编码为 shadow password,并将结果写入 /etc/shadow。
# pwconv

这样就完成了大量用户的创建,之后可以到/home下检查这些用户宿主目录的权限设置是否都正确,可抽取登录验证用户密码是否正确。


综合使用

1、Linux下一次性修改用户密码


在rpm派系下能成功,deb的不支持
echo "HisPaswd" | passwd --stdin gpdb

在deb派系下能成功(两次密码中有一个'\n',代表换行),在rpm也能成功
echo -e "HisPaswd\nHisPaswd" | passwd gpdb

批量修改主机的同一用户密码
# for ((i=1;i<=100;i++)); do \
ssh 10.1.0.$i 'echo -e "linuXPassword\nlinuXPassword" | passwd linuxuser';done;

甚至可以远程创建用户后并为之设定密码
# ssh remoteserver 'useradd -m -r -u 2345 -g daemon -s /bin/bash -c "new for someuser" gpdb; echo -e "passwdofuser\npasswdofuser" | passwd newuser'

记得保护好这台操作主机和其上历史命令记录情况。当然系统也为我们准备上实现上述功能的指令:chpasswd

echo "freeoa:Npd7k9xT" | chpasswd

为多个用户设置为同一密码(用户在下次登录时强制修改)
for user in $(cat user-list.txt);do echo "new_password" | passwd --stdin "$user" && chage -d 0 $user;done

为多台主机上的同一用户设置指定的密码
for server in `cat server-list.txt`;do
ssh root@$server 'passwd --stdin renu <<EOF
new_passwd
new_passwd
EOF';
done

for server in `cat server-list.txt`;do ssh root@$server 'echo "magi:new_password" | chpasswd';done

修改主机上多个用户及其密码
1)、准备好用户与密码的文件

# cat unp.txt
freeoa:neRvG23q
daygeek:Cc89TYN2
ivy:NewiTux2

2)、开始批量进行修改操作
for users in `cat user-list.txt`;do echo $users | chpasswd;done

因此可以借用双层或多层的for来进行嵌套的多个任务。