【图文教程】 Linux 用户和组管理

预习内容:

3.1 用户配置文件和密码配置文件
3.2 用户组管理
3.3 用户管理
3.4 usermod命令
3.5 用户密码管理
3.6 mkpasswd命令
3.7 su命令
3.8 sudo命令
3.9 限制root远程登录

扩展:
sudo与su比较 http://www.apelearn.com/bbs/thread-7467-1-1.html
sudo配置文件样例 www.opensource.apple.com/source/sudo/sudo-16/sudo/sample.sudoers
sudo不错的教程 http://www.jianshu.com/p/51338e41abb7
sudo -i 也可以登录到root吗? http://www.apelearn.com/bbs/thread-6899-1-1.html

3.1 用户配置文件和密码配置文件:

/etc目录下的passwd文件是核心的用户配置文件,每创建一个用户的信息都会存储在这个文件里,这个文件的结构是每个用户一行,每一行都会用冒分割成七段。

第一段表示的是用户名
第二段是密码的占位符(所以密码不是存放在这个文件里)
第三段是用户的uid
第四段是用户所属组的gid
第五段是对用户的描述、注释信息
第六段是用户的家目录也叫宿主目录
第七段是用户的登录shell
在这个文件可以发现root用户和普通用户的第七段信息都是/bin/bash,这代表这些用户都可以登录,而系统自带的用户大多数都是sbin/nologin,这代表这些用户不可以进行登录。

[root@sc ~]# 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
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
sc:x:1000:1000:sc:/home/sc:/bin/bash
aming:x:1001:1001::/home/aming:/bin/bash
user1:x:1002:1002::/home/user1:/bin/bash
相对的在/etc目录下还有一个shadow文件,这个文件是用户的密码文件,用户的密码都存放在这里,这个文件和passwd文件是一一对应的,所以这个文件是专门用来存储、控制用户的密码的。同样的这个文件也是每一行记录一个用户,用冒号分割成九段,

第一段是用户的名称
第二段是用户的密码,这些密码都是经过加密的,因为使用的是MD5的算法加随机数生成的密文所以无法破解或反编译
第三段是一个天数,这个天数是从1970年1月1日开始计算到上一次你修改密码的时间
第四段表示要过多少天才能更改密码,这段默认的是零,也就是没有限制
第五段表示的是密码多少天后会过期,即在此天数内必须要更改密码
第六段表示密码到期前的警告,会提醒用户密码在多少天内会过期
第七段表示的是账户的失效期限
第八段表示账号的生命周期
第九段是保留字段,没有实际意义

每个字段的含义是:
· sp_namp - 指向以 null 结束的用户名的指针
· sp_pwdp - 指向 null 结束的密码的指针
· sp_lstchg - 最近更改密码的日期(日期计算方法是从1970年1月1日开始的天数)
· sp_min - days before which password may not be changed
· sp_max - days after which password must be changed
· sp_warn - days before password is to expire that user is warned of pending password expiration
· sp_inact - days after password expires that account is considered inactive and disabled
· sp_expire - days since Jan 1, 1970 when account will be disabled
· sp_flag - reserved for future use

[root@sc ~]# cat /etc/shadow
root:$6$2Zb5YJ2vO7U0gvq4$lVbjtZM37yIRS3EaU.r9ZhiitI4FJXJLbWyC4QFMoqYxyWTtfW89.2qGesMvUTDQd656CJQxpCTAf7LZwKPdq/::0:99999:7:::
bin:*:17834:0:99999:7:::
daemon:*:17834:0:99999:7:::
adm:*:17834:0:99999:7:::
lp:*:17834:0:99999:7:::
sync:*:17834:0:99999:7:::
shutdown:*:17834:0:99999:7:::
halt:*:17834:0:99999:7:::
mail:*:17834:0:99999:7:::
operator:*:17834:0:99999:7:::
games:*:17834:0:99999:7:::
ftp:*:17834:0:99999:7:::
nobody:*:17834:0:99999:7:::
systemd-network:!!:17973::::::
dbus:!!:17973::::::
polkitd:!!:17973::::::
sshd:!!:17973::::::
postfix:!!:17973::::::
chrony:!!:17973::::::
sc:$6$0NK2/c8N.C0DVPIB$JcjkdT2LHSstcKGr/stgJG0erg6h9ULXLoSbI8Q71iTDk5C/kAEmL9xuKCDaBEluik9lldJE0t44rQlb5t09G1::0:99999:7:::
aming:$6$c6BkO4y5$w6I88K5M.2wVmr7xPCG6CTpJF0zvofETaDdI2RylxP3ASZgPp56ywzZWz7EEjeqNmcSrW6zFfyY8c76x375VO0:17980:0:99999:7:::
user1:!!:17980:0:99999:7:::

3.2 用户组管理:

groupadd [-g gid] [-o]] [-r] [-f] groupname

参数 参数含义
-g (gid) 指定组ID号
-o 允许组ID号,不必惟一
-r 加入组ID号,低于499系统账号
-f 加入已经有的组时,发展程序退出
/etc目录下有个group文件,这个文件存储的是用户组的信息。跟passwd差不多的含义。
[root@sc ~]# cat /etc/group
root:x:0:
bin:x:1:
daemon:x:2:
sys:x:3:
adm:x:4:
tty:x:5:
disk:x:6:
lp:x:7:
mem:x:8:
kmem:x:9:
wheel:x:10:
cdrom:x:11:
mail:x:12:postfix
man:x:15:
dialout:x:18:
floppy:x:19:
games:x:20:
tape:x:33:
video:x:39:
ftp:x:50:
lock:x:54:
audio:x:63:
nobody:x:99:
users:x:100:
utmp:x:22:
utempter:x:35:
input:x:999:
systemd-journal:x:190:
systemd-network:x:192:
dbus:x:81:
polkitd:x:998:
ssh_keys:x:997:
sshd:x:74:
postdrop:x:90:
postfix:x:89:
chrony:x:996:
sc:x:1000:sc
aming:x:1001:
user1:x:1002:
除此之外/etc目录下还有一个与shadow差不多的文件:gshadow 此文件是用户组密码的配置文件,此文件几乎不会去动它。
[root@sc ~]# cat /etc/gshadow
root:::
bin:::
daemon:::
sys:::
adm:::
tty:::
disk:::
lp:::
mem:::
kmem:::
wheel:::
cdrom:::
mail:::postfix
man:::
dialout:::
floppy:::
games:::
tape:::
video:::
ftp:::
lock:::
audio:::
nobody:::
users:::
utmp:!::
utempter:!::
input:!::
systemd-journal:!::
systemd-network:!::
dbus:!::
polkitd:!::
ssh_keys:!::
sshd:!::
postdrop:!::
postfix:!::
chrony:!::
sc:!!::sc
aming:!::
user1:!::
如果使用ls命令去逐个列出这些文件,会发现还有一个相同名称带个-号的文件,这个带有-号的文件是备份文件,如果不小心删除了原来的文件的话,拷贝这个文件就可以使用了。但是可能会有个问题,如果你刚好新创建了一个用户,但是这个备份文件还没来得及更新的话,这个用户的信息就会丢失,不过一般来讲影响不大。
[root@sc ~]# ls /etc/shadow*
/etc/shadow  /etc/shadow-
[root@sc ~]# ls /etc/gshadow*
/etc/gshadow  /etc/gshadow-
[root@sc ~]# ls /etc/passwd*
/etc/passwd  /etc/passwd-
[root@sc ~]# ls /etc/group*
/etc/group  /etc/group-
关于用户组有一个命令:groupadd,此命令是用来添加用户组的,示例:
[root@sc ~]# groupadd grp1
[root@sc ~]# tail -n1 /etc/group
grp1:x:1003:
创建的同时可以指定gid,在CentOS7中指定的gi要在1000以上,1000以内的已经预留给系统了,CentOS6则是500以上,这一点要区分一下:
[root@sc ~]# groupadd -g 1005 grp2
[root@sc ~]# tail -n3 /etc/group
user1:x:1002:
grp1:x:1003:
grp2:x:1005:
既然可以创建用户组,也就可以删除用户组,但是前提是这个用户组里没有用户才能删除,不然是删除不了的,命令是:
[root@sc ~]# groupdel grp1
[root@sc ~]# tail -n3 /etc/group
aming:x:1001:
user1:x:1002:
grp2:x:1005:

总结:用户组可以包含很多成员,每个成员都是一个用户,只要这个用户组里面有一个用户,就不能把这个用户组删除。

[root@sc ~]# groupdel user1
groupdel:不能移除用户“user1”的主组

3.3 用户管理:

useradd [-d home] [-s shell] [-c comment] [-m [-k template]] [-f inactive] [-e expire ] [-p passwd] [-r] name

参数 参数含义
-c 加上备注文字,备注文字保存在passwd的备注栏中
-d 指定用户登入时的主目录,替换系统默认值/home/<用户名>
-D 变更预设值
-e 指定账号的失效日期,日期格式为MM/DD/YY,例如06/30/12。缺省表示永久有效
-f 指定在密码过期后多少天即关闭该账号。如果为0账号立即被停用;如果为-1则账号一直可用。默认值为-1
-g 指定用户所属的群组。值可以使组名也可以是GID。用户组必须已经存在的,期默认值为100,即users
-G 指定用户所属的附加群组
-m 自动建立用户的登入目录
-M 不要自动建立用户的登入目录
-n 取消建立以用户名称为名的群组
-r 建立系统账号
-s 指定用户登入后所使用的shell。默认值为/bin/bash
-u 指定用户ID号。该值在系统中必须是唯一的。0~499默认是保留给系统用户账号使用的,所以该值必须大于499
useradd和adduser命令可以添加一个普通用户,这两个命令的用法是一样的,可以看得出普通用户的uid是从1000开始的,示例:
[root@sc ~]# useradd user2  # 创建一个普通用户user2
[root@sc ~]# tail -n2 /etc/passwd
user1:x:1002:1002::/home/user1:/bin/bash
user2:x:1003:1003::/home/user2:/bin/bash
[root@sc ~]# tail -n3 /etc/passwd
aming:x:1001:1001::/home/aming:/bin/bash
user1:x:1002:1002::/home/user1:/bin/bash
user2:x:1003:1003::/home/user2:/bin/bash
创建用户的同时可以指定用户的uid,和指定用户的用户组,示例:
[root@sc ~]# useradd -u 1004 -g grp2 user3  # 指定普通用户user3的uid和gid
[root@sc ~]# tail -n3 /etc/passwd
user1:x:1002:1002::/home/user1:/bin/bash
user2:x:1003:1003::/home/user2:/bin/bash
user3:x:1004:1005::/home/user3:/bin/bash
创建用户的同时可以指定用户的家目录,和指定用户的shell,示例:
[root@sc ~]# useradd -u 1006 -g grp2 -d /home/aming111 -s /sbin/nologin user4  # 指定普通用户user3的uid和gid,家目录和shell
[root@sc ~]# tail -n3 /etc/passwd
user2:x:1003:1003::/home/user2:/bin/bash
user3:x:1004:1005::/home/user3:/bin/bash
user4:x:1006:1005::/home/aming111:/sbin/nologin
[root@sc ~]# ls /home/  # 查看家目录下是否有aming111
aming  aming111  sc  user1  user2  user3
创建用户的同时还可以指定不创建用户的家目录,虽然指定不创建家目录,但是并不代表这个用户没有家目录,只是没有创建而已:
[root@sc ~]# useradd -M user5  # 创建 user5 但是指定不创建家目录,需要加 -M 参数
[root@sc ~]# tail -n3 /etc/passwd
user3:x:1004:1005::/home/user3:/bin/bash
user4:x:1006:1005::/home/aming111:/sbin/nologin
user5:x:1007:1007::/home/user5:/bin/bash
[root@sc ~]# ls /home/  # /home/下确没有user5
aming  aming111  sc  user1  user2  user3
创建用户时没有指定用户的uid的话,那么默认是从上一个用户的uid自增。如果创建用户时不指定gid的话,gid不会根据上一个用户的gid自增,而是和用户的uid保持一致,示例:
[root@sc ~]# groupadd -g 1010 grp3
[root@sc ~]# useradd -g grp3 user6
[root@sc ~]# tail -n5 /etc/passwd
user2:x:1003:1003::/home/user2:/bin/bash
user3:x:1004:1005::/home/user3:/bin/bash
user4:x:1006:1005::/home/aming111:/sbin/nologin
user5:x:1007:1007::/home/user5:/bin/bash
user6:x:1008:1010::/home/user6:/bin/bash
[root@sc ~]# useradd user7
[root@sc ~]# tail -n5 /etc/passwd
user3:x:1004:1005::/home/user3:/bin/bash
user4:x:1006:1005::/home/aming111:/sbin/nologin
user5:x:1007:1007::/home/user5:/bin/bash
user6:x:1008:1010::/home/user6:/bin/bash
user7:x:1009:1009::/home/user7:/bin/bash
[root@sc ~]# adduser user8
[root@sc ~]# tail -n5 /etc/passwd
user4:x:1006:1005::/home/aming111:/sbin/nologin
user5:x:1007:1007::/home/user5:/bin/bash
user6:x:1008:1010::/home/user6:/bin/bash
user7:x:1009:1009::/home/user7:/bin/bash
user8:x:1010:1011::/home/user8:/bin/bash
删除用户但是用户的家目录没被删除,因为用户的家目可能会有文件,所以没有删除,留给系统管理员手动删除:
[root@sc ~]# userdel user8
[root@sc ~]# tail -n3 /etc/passwd
user5:x:1007:1007::/home/user5:/bin/bash
user6:x:1008:1010::/home/user6:/bin/bash
user7:x:1009:1009::/home/user7:/bin/bash
[root@sc ~]# ls /home
aming     sc     user2  user6  user8
aming111  user1  user3  user7
[root@sc ~]# rm -fr /home/user8
也可以删除用户的同时将用户的家目录一并删除:
[root@sc ~]# userdel -r user7
[root@sc ~]# ls /home/
aming  aming111  sc  user1  user2  user3  user6

3.4 usermod命令:

usermod [-LU][-c <备注>][-d <登入目录>][-e <有效期限>][-f <缓冲天数>][-g <群组>][-G <群组>][-l <帐号名称>][-s ][-u ][用户帐号]

参数 参数含义
-c<备注> 修改用户帐号的备注文字
-d<登入目录> 修改用户登入时的目录
-e<有效期限> 修改帐号的有效期限
-f<缓冲天数> 修改在密码过期后多少天即关闭该帐号
-g<群组> 修改用户所属的群组
-G<群组> 修改用户所属的附加群组
-l<帐号名称> 修改用户帐号名称
-L 锁定用户密码,使密码无效
-s (shell) 修改用户登入后所使用的shell
-u (uid) 修改用户ID
-U 解除密码锁定
usermod 命令是用于更改用户属性的一个命令,usermod 和 useradd 的用法相似,此命令的几种用法:
[root@sc ~]# usermod -u 111 username  ^C
[root@sc ~]# usermod -g gid username  ^C
[root@sc ~]# usermod -d /home/jfdjka username  ^C
[root@sc ~]# usermod -s /sbin/nologin username  ^C
usermod -u 数字username 更改用户的uid,例如我将user1用户的uid改为111:
[root@sc ~]# usermod -u 111 user1
[root@sc ~]# id user1
uid=111(user1) gid=1002(user1) 组=1002(user1)
[root@sc ~]# tail -n6 /etc/passwd
user1:x:111:1002::/home/user1:/bin/bash
user2:x:1003:1003::/home/user2:/bin/bash
user3:x:1004:1005::/home/user3:/bin/bash
user4:x:1006:1005::/home/aming111:/sbin/nologin
user5:x:1007:1007::/home/user5:/bin/bash
user6:x:1008:1010::/home/user6:/bin/bash
usermod -g 用户组或gid username 更改用户的gid:例如我将user1用户的用户组改为grp:
[root@sc ~]# usermod -g grp2 user1
[root@sc ~]# id user1
uid=111(user1) gid=1005(grp2) 组=1005(grp2)
usermod -d 路径 username 更改用户的家目录,例如:
[root@sc ~]# usermod -d /home/sc user1
[root@sc ~]# tail -n6 /etc/passwd
user1:x:111:1005::/home/sc:/bin/bash
user2:x:1003:1003::/home/user2:/bin/bash
user3:x:1004:1005::/home/user3:/bin/bash
user4:x:1006:1005::/home/aming111:/sbin/nologin
user5:x:1007:1007::/home/user5:/bin/bash
user6:x:1008:1010::/home/user6:/bin/bash
usermod -s shell username更改用户的shell,例如:
[root@sc ~]# usermod -s /sbin/nologin/ user1
[root@sc ~]# tail -n6 /etc/passwd
user1:x:111:1005::/home/sc:/sbin/nologin/
user2:x:1003:1003::/home/user2:/bin/bash
user3:x:1004:1005::/home/user3:/bin/bash
user4:x:1006:1005::/home/aming111:/sbin/nologin
user5:x:1007:1007::/home/user5:/bin/bash
user6:x:1008:1010::/home/user6:/bin/bash
usermod -G 用户组或 gid username 扩展用户组(扩展组),一个用户可以属于多个组,但是 gid 只有一个,例如我将user1用户加多一个 grp1,user1 用户 aming 的用户组:
[root@sc ~]# usermod -G grp2,user5 aming
[root@sc ~]# id aming
uid=1001(aming) gid=1001(aming) 组=1001(aming),1005(grp2),1007(user5)
id user1命令可以查看user1用户的uid、gid和用户组:
[root@sc ~]# id aming
uid=1001(aming) gid=1001(aming) 组=1001(aming),1005(grp2),1007(user5)

3.5 用户密码管理:

passwd命令是用于修改用户密码的命令,更改root用户的密码:
[root@sc ~]# passwd 
更改用户 root 的密码 。
新的 密码:
无效的密码: 密码少于 8 个字符
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。
更改普通用户的密码:
[root@sc ~]# passwd aming
更改用户 aming 的密码 。
新的 密码:
无效的密码: 密码少于 8 个字符
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。
密码段两个!号表示的是这个用户没有密码,意味着此用户不能够登录:
[root@sc ~]# tail /etc/shadow
postfix:!!:17973::::::
chrony:!!:17973::::::
sc:$6$0NK2/c8N.C0DVPIB$JcjkdT2LHSstcKGr/stgJG0erg6h9ULXLoSbI8Q71iTDk5C/kAEmL9xuKCDaBEluik9lldJE0t44rQlb5t09G1::0:99999:7:::
aming:$6$viybskWe$WOvVIEe3UJQn70EI44EQkTkqtjYCxDcj0CFTboB0x9w84WWtZY/WPOHUnrz74Gnr73lkF4Eot34nojkpmhO3K/:17980:0:99999:7:::
user1:!!:17980:0:99999:7:::
user2:!!:17980:0:99999:7:::
user3:!!:17980:0:99999:7:::
user4:!!:17980:0:99999:7:::
user5:!!:17980:0:99999:7:::
user6:!!:17980:0:99999:7:::
密码段两个*号表示的是这个用户的密码是被锁定的,不能用的,意味着此用户不能够登录:
[root@sc ~]# head /etc/shadow
root:$6$i8gxKKjg$YeqkLyT0X0DOp8lhZm2qZUbgNUVuN7tQI/8XUxEjhzKY3yWYNRpmlW0.4vDt.vnEOouEcMeC6YSGzJmL6JtgL1:17980:0:99999:7:::
bin:*:17834:0:99999:7:::
daemon:*:17834:0:99999:7:::
adm:*:17834:0:99999:7:::
lp:*:17834:0:99999:7:::
sync:*:17834:0:99999:7:::
shutdown:*:17834:0:99999:7:::
halt:*:17834:0:99999:7:::
mail:*:17834:0:99999:7:::
operator:*:17834:0:99999:7:::
passwd -l命令可以锁定一个用户的密码,例如我要锁定user1用户,锁定成功后会在这个用户的密码前面加上两个!号:
[root@sc ~]# passwd -l aming
锁定用户 aming 的密码 。
passwd: 操作成功
[root@sc ~]# tail /etc/shadow
postfix:!!:17973::::::
chrony:!!:17973::::::
sc:$6$0NK2/c8N.C0DVPIB$JcjkdT2LHSstcKGr/stgJG0erg6h9ULXLoSbI8Q71iTDk5C/kAEmL9xuKCDaBEluik9lldJE0t44rQlb5t09G1::0:99999:7:::
aming:!!$6$viybskWe$WOvVIEe3UJQn70EI44EQkTkqtjYCxDcj0CFTboB0x9w84WWtZY/WPOHUnrz74Gnr73lkF4Eot34nojkpmhO3K/:17980:0:99999:7:::
user1:!!:17980:0:99999:7:::
user2:!!:17980:0:99999:7:::
user3:!!:17980:0:99999:7:::
user4:!!:17980:0:99999:7:::
user5:!!:17980:0:99999:7:::
user6:!!:17980:0:99999:7:::
passwd -u 命令可以取消用户密码的锁定,取消之后用户密码前面的两个!号就消失了:
[root@sc ~]# passwd -u aming
解锁用户 aming 的密码。
passwd: 操作成功
[root@sc ~]# tail /etc/shadow
postfix:!!:17973::::::
chrony:!!:17973::::::
sc:$6$0NK2/c8N.C0DVPIB$JcjkdT2LHSstcKGr/stgJG0erg6h9ULXLoSbI8Q71iTDk5C/kAEmL9xuKCDaBEluik9lldJE0t44rQlb5t09G1::0:99999:7:::
aming:$6$viybskWe$WOvVIEe3UJQn70EI44EQkTkqtjYCxDcj0CFTboB0x9w84WWtZY/WPOHUnrz74Gnr73lkF4Eot34nojkpmhO3K/:17980:0:99999:7:::
user1:!!:17980:0:99999:7:::
user2:!!:17980:0:99999:7:::
user3:!!:17980:0:99999:7:::
user4:!!:17980:0:99999:7:::
user5:!!:17980:0:99999:7:::
user6:!!:17980:0:99999:7:::
usermod -L 命令也可以锁定用户的密码,不过和使用passwd -l命令来锁定密码不同的是,此命令锁定的密码前面只有一个!号:
[root@sc ~]# usermod -L aming
[root@sc ~]# tail /etc/shadow
postfix:!!:17973::::::
chrony:!!:17973::::::
sc:$6$0NK2/c8N.C0DVPIB$JcjkdT2LHSstcKGr/stgJG0erg6h9ULXLoSbI8Q71iTDk5C/kAEmL9xuKCDaBEluik9lldJE0t44rQlb5t09G1::0:99999:7:::
aming:!$6$viybskWe$WOvVIEe3UJQn70EI44EQkTkqtjYCxDcj0CFTboB0x9w84WWtZY/WPOHUnrz74Gnr73lkF4Eot34nojkpmhO3K/:17980:0:99999:7:::
user1:!!:17980:0:99999:7:::
user2:!!:17980:0:99999:7:::
user3:!!:17980:0:99999:7:::
user4:!!:17980:0:99999:7:::
user5:!!:17980:0:99999:7:::
user6:!!:17980:0:99999:7:::
usermod -U 命令则是取消密码的锁定:
[root@sc ~]# usermod -U aming
[root@sc ~]# tail /etc/shadow
postfix:!!:17973::::::
chrony:!!:17973::::::
sc:$6$0NK2/c8N.C0DVPIB$JcjkdT2LHSstcKGr/stgJG0erg6h9ULXLoSbI8Q71iTDk5C/kAEmL9xuKCDaBEluik9lldJE0t44rQlb5t09G1::0:99999:7:::
aming:$6$viybskWe$WOvVIEe3UJQn70EI44EQkTkqtjYCxDcj0CFTboB0x9w84WWtZY/WPOHUnrz74Gnr73lkF4Eot34nojkpmhO3K/:17980:0:99999:7:::
user1:!!:17980:0:99999:7:::
user2:!!:17980:0:99999:7:::
user3:!!:17980:0:99999:7:::
user4:!!:17980:0:99999:7:::
user5:!!:17980:0:99999:7:::
user6:!!:17980:0:99999:7:::
passwd --stdin 命令可以更改用户密码,在shell脚本上可能会使用到这个命令:
[root@sc ~]# passwd --stdin user5
更改用户 user5 的密码 。
123
passwd:所有的身份验证令牌已经成功更新。
使用这个命令更改用户密码是明文显示的,而且不需要输入第二次确认密码。
所以可以用管道符直接将一个字符串设置为用户的密码:
[root@sc ~]# echo "123" |passwd --stdin user5
更改用户 user5 的密码 。
passwd:所有的身份验证令牌已经成功更新。
echo -e 命令可以在一行命令里面出现一个换行符 \n:
[root@sc ~]# echo "123\nsss"
123\nsss
[root@sc ~]# echo -e "123\nsss"
123
sss
[root@sc ~]# echo -e "123\tsss"
123	sss
所以可以利用这一点即便在passwd命令不加 --stdin选项也能够直接用一句命令就能设置密码:
[root@sc ~]# echo -e "123\n123" |passwd user3
更改用户 user3 的密码 。
新的 密码:无效的密码: 密码少于 8 个字符
重新输入新的 密码:passwd:所有的身份验证令牌已经成功更新。

设置密码的原则:
密码的长度要大于等于十位(特殊情况除外)
密码要包括数字大写字母小写字母和特殊字符
密码最好不要有规律性
密码不要包含个人信息,例如名字、生日之类的
密码定期更换

3.6 mkpasswd命令:

参数 参数含义
-l 指定密码长度
-s special的简写,指定特殊字符个数
-d 指定数字的个数 注: mkpasswd命令配合echo、passwd命令以及管道符“
mkpasswd是make password的缩写,它是一个工具,是用来生成密码的一个工具。一般这个命令需要自己安装,需要安装expect包:
[root@sc ~]# yum install -y expect
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
 * base: mirrors.tuna.tsinghua.edu.cn
 * extras: mirrors.tuna.tsinghua.edu.cn
 * updates: mirrors.163.com
base                         | 3.6 kB     00:00     
extras                       | 3.4 kB     00:00     
http://ftp.sjtu.edu.cn/centos/7.6.1810/updates/x86_64/repodata/repomd.xml: [Errno 14] curl#7 - "Failed to connect to 2001:da8:8000:6023::230: 网络不可达"
正在尝试其它镜像。
updates                      | 3.4 kB     00:00     
正在解决依赖关系
--> 正在检查事务
---> 软件包 expect.x86_64.0.5.45-14.el7_1 将被 安装
--> 正在处理依赖关系 libtcl8.5.so()(64bit),它被软件包 expect-5.45-14.el7_1.x86_64 需要
--> 正在检查事务
---> 软件包 tcl.x86_64.1.8.5.13-8.el7 将被 安装
--> 解决依赖关系完成

依赖关系解决

====================================================
 Package  架构     版本                源      大小
====================================================
正在安装:
 expect   x86_64   5.45-14.el7_1       base   262 k
为依赖而安装:
 tcl      x86_64   1:8.5.13-8.el7      base   1.9 M

事务概要
====================================================
安装  1 软件包 (+1 依赖软件包)

总下载量:2.1 M
安装大小:4.9 M
Downloading packages:
(1/2): tcl-8.5.13-8.el7.x86_64 | 1.9 MB   00:00     
(2/2): expect-5.45-14.el7_1.x8 | 262 kB   00:01     
----------------------------------------------------
总计                   1.6 MB/s | 2.1 MB  00:01     
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  正在安装    : 1:tcl-8.5.13-8.el7.x86_64       1/2 
  正在安装    : expect-5.45-14.el7_1.x86_64     2/2 
  验证中      : 1:tcl-8.5.13-8.el7.x86_64       1/2 
  验证中      : expect-5.45-14.el7_1.x86_64     2/2 

已安装:
  expect.x86_64 0:5.45-14.el7_1                     

作为依赖被安装:
  tcl.x86_64 1:8.5.13-8.el7                         

完毕!
安装完毕后就可以使用mkpasswd命令随机生成一个密码:
[root@sc ~]# mkpasswd
p2{aVH6ww
mkpasswd -l可以指定生成密码的长度,比如我指定生成一个12位长度的密码:
[root@sc ~]# mkpasswd -l 12
4Zadnvb4C{kw
还可以指定生成的密码包括几个特殊符号,例如我要生成一个密码长度为12位,包含5个特殊符号的密码:
[root@sc ~]# mkpasswd -l 12 -s 5
)~09A-q\hD<l
或者指定生成的密码中不包含特殊字符:
[root@sc ~]# mkpasswd -l 12 -s 0
tqpjSe72cSdu

3.7 su命令:

su命令是用来切换用户的,例如我要从root用户切换到 aming 用户:
[root@sc ~]# su - aming
[aming@sc ~]$ whoami
aming
[aming@sc ~]$ id
uid=1001(aming) gid=1001(aming) 组=1001(aming),1005(grp2),1007(user5) 环境=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
这个 - 选项是彻底切换用户的意思,如果不加 - 选项也可以,但是切换得不彻底,例如当前的家目录还是root,环境变量也还是root的配置等等:
[root@sc ~]# su aming
[aming@sc root]$ pwd
/root
[aming@sc root]$ su - root
密码:
上一次登录:一 3月 25 18:59:00 CST 2019pts/1 上
[root@sc ~]# su - aming
上一次登录:一 3月 25 18:59:12 CST 2019pts/1 上
[aming@sc ~]$ pwd
/home/aming
可以用su命令以某个用户的身份去执行一条命令,而且这个用户并不会进行登录:
[aming@sc ~]$ su - -c "touch /tmp/aming.111" aming
[aming@sc ~]$ ls -lt /tmp/ |head
总用量 12
-rw-rw-r--. 1 aming aming   0 3月  25 19:02 aming.111  # 这就是aming用户在/tmp/下创建的文件
drwx------. 2 root  root    6 3月  25 10:23 vmware-root_5487-3853949434
drwx------. 3 root  root   17 3月  25 10:23 systemd-private-4b0698c0cbd84892bd651a034f19be73-chronyd.service-LbZqht
drwx------. 2 root  root    6 3月  24 22:26 vmware-root_5490-2865234879
-rw-r--r--. 1 root  root  540 3月  23 23:03 fstab
-rw-r--r--. 1 root  root  884 3月  23 23:02 passwd
drwx------. 2 root  root    6 3月  23 13:19 vmware-root_5457-3853949403
drwx------. 2 root  root    6 3月  23 01:09 vmware-root_5437-4148145672
drwx------. 2 root  root    6 3月  22 20:43 vmware-root_5411-4147621393
[aming@sc ~]$ id aming
uid=1001(aming) gid=1001(aming) 组=1001(aming),1005(grp2),1007(user5)
[aming@sc ~]$ date
2019年 03月 25日 星期一 19:06:45 CST
普通用户使用su命令切换到 root 用户或者其他普通用户的时候都需要输入密码,而 root 用户切换到普通用户不需要输入密码:
有一种情况就是某个普通用户没有家目录,这种情况登录到这个用户的话和其他用户有点不太一样:
[aming@sc ~]$ pwd
/home/aming
[aming@sc ~]$ su - user5
密码:
su: 警告:无法更改到 /home/user5 目录: 没有那个文件或目录
-bash-4.2$ 
想要让这个用户恢复正常的话需要使用root用户为这个用户在home目录下创建一个家目录,然后将家目录的配置文件拷贝一份进去:

1.在 /root/ 环境下查看 user5 的属性并创建一个家目录和更改属主、属组:

上一次登录:一 3月 25 18:59:31 CST 2019pts/1 上
[root@sc ~]# id user5
uid=1007(user5) gid=1007(user5) 组=1007(user5)
[root@sc ~]# mkdir /home/user5
[root@sc ~]# chown user5:user5 /home/user5

2.拷贝 /etc/skel/ 目录的配置文件,这个 /etc/skel/ 目录是模板目录,里面的配置文件所有用户都是通用的,拷贝到 /home/user5/ 并更改 /home/user5/ 的属主和属组:

[root@sc ~]# ls /etc/skel/
[root@sc ~]# ls -la /etc/skel/  # 查看 /etc/skel 下的配置文件
总用量 24
drwxr-xr-x.  2 root root   62 4月  11 2018 .
drwxr-xr-x. 75 root root 8192 3月  25 18:39 ..
-rw-r--r--.  1 root root   18 10月 31 01:07 .bash_logout
-rw-r--r--.  1 root root  193 10月 31 01:07 .bash_profile
-rw-r--r--.  1 root root  231 10月 31 01:07 .bashrc
[root@sc ~]# cp /etc/skel/.bash* /home/user5/  # 把 /etc/skel/ 里的模板文件拷贝到 /home/user5/ 里
[root@sc ~]# chown -R user5:user5 !$  # 更改 /home/user5 的属主属组
chown -R user5:user5 /home/user5/

3.登录正常:

[root@sc ~]# su - user5
上一次登录:一 3月 25 19:08:12 CST 2019pts/1 上
[user5@sc ~]$ 

3.8 sudo命令:

sudo命令可以让普通用户临时指定一个用户去执行一条命令,一般都是用于临时给普通用户授权root用户的身份。

查看配置文件命令:
[root@sc ~]# visudo

用此命令打开文件的原因是可以在编辑此配置文件的时候检测到语法错误。

注意:赋予用户具体的命令时,要写命令文件的绝对路径,并且要用逗号加空格分割

在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述

## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL
aming   ALL=(ALL)       ls,mv,cat

## Allows members of the 'sys' group to run networking, software,
## service management apps and more.
# %sys ALL = NETWORKING, SOFTWARE, SERVICES, STORAGE, DELEGATING, PROCESSES, LOCATE, DRIVERS

## Allows people in group wheel to run all commands
%wheel  ALL=(ALL)       ALL

## Same thing without a password
# %wheel        ALL=(ALL)       NOPASSWD: ALL

## Allows members of the users group to mount and unmount the
## cdrom as root
# %users  ALL=/sbin/mount /mnt/cdrom, /sbin/umount /mnt/cdrom

## Allows members of the users group to shutdown this system
# %users  localhost=/sbin/shutdown -h now
:wq
>>> /etc/sudoers: 语法错误 near line 101 <<<
现在做什么?
选项有:
  重新编辑 sudoers 文件(e)
  退出,不保存对 sudoers 文件的更改(x)
  退出并将更改保存到 sudoers 文件(危险!)(Q)

现在做什么?e
## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL
aming   ALL=(ALL)       /usr/bin/ls,/usr/bin/mv,/usr/bin/cat
普通用户使用想要查看root目录是权限不够的:
[aming@sc ~]$ ls /root/
ls: 无法打开目录/root/: 权限不够
但是由于刚才我们在配置文件里授予了aming用户可以使用sudo命令临时获得以root用户身份执行命令的权限,所以使用sudo命令就可以查看root目录了:
[aming@sc ~]$ sudo /usr/bin/ls /root/

我们信任您已经从系统管理员那里了解了日常注意事项。
总结起来无外乎这三点:

    #1) 尊重别人的隐私。
    #2) 输入前要先考虑(后果和风险)。
    #3) 权力越大,责任越大。

[sudo] aming 的密码:
233.txt  anaconda-ks.cfg
[aming@sc ~]$ sudo /usr/bin/ls /root/
233.txt  anaconda-ks.cfg
[aming@sc ~]$ cat /root/3.txt
cat: /root/3.txt: 权限不够
[aming@sc ~]$ sudo cat /root/3.txt
[sudo] aming 的密码:
111
在配置文件里授予权限的时候加个 PASSWD: 就可以在普通用户使用 sudo 命令的时候不需要输入密码:
## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL
aming   ALL=(ALL)       /usr/bin/ls,/usr/bin/mv,/usr/bin/cat
user5   ALL=(ALL)       NOPASSWD: /usr/bin/ls,/usr/bin/cat
[root@sc ~]# su - user5
上一次登录:一 3月 25 19:24:06 CST 2019pts/1 上
[user5@sc ~]$ sudo ls /root/
233.txt  3.txt	anaconda-ks.cfg
配置 aming 用户命令别名的使用:
## Command Aliases
## These are groups of related commands...

## Networking
# Cmnd_Alias NETWORKING = /sbin/route, /sbin/ifconfig, /bin/ping, /sbin/dhclient, /usr/bin/net, /sbin/iptables, /usr/bin/rfcomm, /usr/bin/wvdial, /sbin/iwconfig, /sbin/mii-tool
Cmnd_Alias AMING_CMD = /usr/bin//ls, /usr/bin/mv, /usr/bin/cat
## Installation and management of software
# Cmnd_Alias SOFTWARE = /bin/rpm, /usr/bin/up2date, /usr/bin/yum
## Allow root to run any commands anywhere 
root    ALL=(ALL)       ALL
aming   ALL=(ALL)       AMING_CMD
user5   ALL=(ALL)       NOPASSWD: /usr/bin/ls,/usr/bin/cat
[root@sc ~]# su - aming
上一次登录:一 3月 25 19:55:41 CST 2019pts/1 上
[aming@sc ~]$ sudo ls /root/
[sudo] aming 的密码:
233.txt  3.txt	anaconda-ks.cfg
[aming@sc ~]$ sudo cat /root/3.txt
111
针对用户组进行配置权限:

在这里插入图片描述
在这里插入图片描述

3.9 限制root远程登录:

因为root用户的密码很重要,不能轻易的被别人知道,所以我们需要让普通用户能够无需知道密码就能登录root用户:

1.首先使用visudo命令编辑配置文件:

## User Aliases
## These aren't often necessary, as you can use regular groups
## (ie, from files, LDAP, NIS, etc) in this file - just use %groupname
## rather than USERALIAS
# User_Alias ADMINS = jsmith, mikem
User_Alias AMINGS = aming, user5, user6
## Next comes the main part: which users can run what software on
## which machines (the sudoers file can be shared between multiple
## systems).
## Syntax:
##
##      user    MACHINE=COMMANDS
##
## The COMMANDS section may have other options added to it.
##
## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL
aming   ALL=(ALL)       AMING_CMD
user5   ALL=(ALL)       NOPASSWD: /usr/bin/ls,/usr/bin/cat
AMINGS  ALL=(ALL)       NOPASSWD: /usr/bin/su

2.配置成功则可以使用sudo命令无需密码登录root:

[root@sc ~]# su - aming
上一次登录:一 3月 25 22:54:34 CST 2019pts/0 上
[aming@sc ~]$ sudo su -
上一次登录:一 3月 25 22:55:12 CST 2019从 192.168.94.
[root@sc ~]# whoami
root
如果密码没有使用管理密码的工具管理的话,一般都是以明文状态显示的,为了防止root用户的密码不小心被别人获得后,进行远程登录的情况,所以有时候需要限制使用root用户进行远程登录:
  1. 修改sshd.config配置文件:
[root@sc ~]# vi /etc/ssh/sshd_config 

在这里插入图片描述

[root@sc ~]# systemctl restart sshd.service 
  1. 完成以上操作后,无论使用密钥或者是密码都无法远程登录root用户了:

在这里插入图片描述在这里插入图片描述

  1. 只有普通用户可以远程登录:

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

因为刚刚授予了普通用户使用sudo命令可以免密码登录到root用户,所以现在普通用户aming可以在不知道密码的情况下登录到root:
[aming@sc ~]$ ls /root/
ls: 无法打开目录/root/: 权限不够
[aming@sc ~]$ su - root
密码:
[aming@sc ~]$ sudo su - root
上一次登录:一 3月 25 22:57:02 CST 2019pts/0 上
最后一次失败的登录:一 3月 25 23:18:24 CST 2019从 192.168.94.1ssh:notty 上
最有一次成功登录后有 3 次失败的登录尝试。
[root@sc ~]# 
想要取消限制的话,就注释掉sshd.config文件中刚刚修改的那一行,接着重启服务即可,取消限制后就可以正常远程登录root了:
[root@sc ~]# vi /etc/ssh/sshd_config 

在这里插入图片描述

[root@sc ~]# systemctl restart sshd.service 

直播课:

sudo不错的教程:https://www.jianshu.com/p/51338e41abb7

1 用户管理在工作中如何体现
2 usermod -L 加1个! passwd -l 加2个!
3 密码加密 6 6 SHA-512
4 sudo格式:
= < command to run>关于host字段的使用场景

限定用户:chroot https://linux.cn/article-8313-1.html

密码配置文件中第二列密码的配置项:
“*” "!"代表帐号被锁定,
“!!”表示这个密码已经过期了。
字符串是以6
6开头的,表明是用SHA-512加密的,11 表明是用MD5加密的、22 是用Blowfish加密的、55是用 SHA-256加密的。

sudo的配置文件/etc/sudoers:
配置文件字段 root ALL=(ALL) ALL
root :用户,用户组,别名用户,别名组
第一个ALL:登陆到主机的:主机名,hostname,ip段
第二个ALL:身份,如果没有设置,默认root身份
第三个ALL:和第二个ALL直接可以设置NOPASSWD;命令必须是绝对路劲,多个命令之间使用“,”号

总结遇到的问题:

显示visudo崩盘了:

解决办法:mv /etc/.sudoers.tmp.swp /tmp/

E325: ATTENTION
Found a swap file by the name "/etc/.sudoers.tmp.swp
"
          owned by: root   dated: Mon Mar 25 20:35:4
6 2019
         file name: /etc/sudoers.tmp
          modified: YES
         user name: root   host name: sc
        process ID: 9060
While opening file "/etc/sudoers.tmp"
             dated: Mon Mar 25 22:46:40 2019
      NEWER than swap file!

(1) Another program may be editing the same file.  I
f this is the case,
    be careful not to end up with two different inst
ances of the same
    file when making changes.  Quit, or continue wit
h caution.
(2) An edit session for this file crashed.
    If this is the case, use ":recover" or "vim -r /
etc/sudoers.tmp"
    to recover the changes (see ":help recovery").
    If you did this already, delete the swap file "/
etc/.sudoers.tmp.swp"
    to avoid this message.

猜你喜欢

转载自blog.csdn.net/weixin_44816331/article/details/88789138