一、用户配置文件和密码配置文件
存储的操作系统用户信息/etc/passwd
查看 #cat /etc/passwd
[root@linux7-128 ~]# 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:997:User for polkitd:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
libstoragemgmt:x:997:994:daemon account for libstoragemgmt:/var/run/lsm:/sbin/nologin
radvd:x:75:75:radvd user:/:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
saslauth:x:996:76:Saslauthd user:/run/saslauthd:/sbin/nologin
rtkit:x:172:172:RealtimeKit:/proc:/sbin/nologin
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
unbound:x:995:993:Unbound DNS resolver:/etc/unbound:/sbin/nologin
usbmuxd:x:113:113:usbmuxd user:/:/sbin/nologin
colord:x:994:991:User for colord:/var/lib/colord:/sbin/nologin
qemu:x:107:107:qemu user:/:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
geoclue:x:993:990:User for geoclue:/var/lib/geoclue:/sbin/nologin
setroubleshoot:x:992:989::/var/lib/setroubleshoot:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
pulse:x:171:171:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
gdm:x:42:42::/var/lib/gdm:/sbin/nologin
sssd:x:991:986:User for sssd:/:/sbin/nologin
gnome-initial-setup:x:990:985::/run/gnome-initial-setup/:/sbin/nologin
avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
huhu:x:1000:1000::/home/huhu:/bin/bash
huhu1:x:1001:1001::/home/huhu1:/bin/bash
每创建一个用户都会在文件下增加一行。如上huhu以及huhu1就是新创建的用户
huhu : x : 1000 : 1000 : : /home/huhu : /bin/bash
文件结构
#该文件结构,每个用户一行,用':'进行分割成7段; # root(用户
名):x(略):0:0:root(注释):/root(用户家目录):/bin/bash(用户的shell) #
longlong02(用户名):x(略):1006:1006:(注释):/home/longlong02(用户家目
录):/bin/bash
用户名:口令:用户标识号:组标识号:注释性描述:主目录:登录Shell
1. 每个用户一行
2. 由:
分割为7段
3. 第一行是用户名,root开头,下面是系统安装时自动创建的,新创建的用户在最下面,从第3段的1000开始
4. 第3段表示uid,第4段表示gid
5. 第2段都是x
,表示用户的密码
6. 第5段表示用户的注释信息,没有实质作用,很多用户都为空
7. 第6段表示用户家目录
8. 第7段表示用户的shell(可以和机器交互的窗口)
知识点
第7段的/sbin/nologin
表示不能登录,即使设置了密码也不可以
存储linux的用户密码/etc/shadow
查看 #cat /etc/shadow
[root@linux7-128 ~]# cat !$
cat /etc/shadow
root:$6$8016end/$N.EBC3/5zxYPYHmigOqONDTnl57R08wg4uVtO91hyoNl4ytb6N6AACK9JAdQFPi7DuI5cZulzMzBGeMfMFON/0:17658:0:99999:7:::
bin:*:17110:0:99999:7:::
daemon:*:17110:0:99999:7:::
adm:*:17110:0:99999:7:::
lp:*:17110:0:99999:7:::
sync:*:17110:0:99999:7:::
shutdown:*:17110:0:99999:7:::
halt:*:17110:0:99999:7:::
mail:*:17110:0:99999:7:::
operator:*:17110:0:99999:7:::
games:*:17110:0:99999:7:::
ftp:*:17110:0:99999:7:::
nobody:*:17110:0:99999:7:::
systemd-network:!!:17648::::::
dbus:!!:17648::::::
polkitd:!!:17648::::::
postfix:!!:17648::::::
sshd:!!:17648::::::
chrony:!!:17648::::::
rpc:!!:17648:0:99999:7:::
libstoragemgmt:!!:17648::::::
radvd:!!:17648::::::
ntp:!!:17648::::::
saslauth:!!:17648::::::
rtkit:!!:17648::::::
tss:!!:17648::::::
unbound:!!:17648::::::
usbmuxd:!!:17648::::::
colord:!!:17648::::::
qemu:!!:17648::::::
abrt:!!:17648::::::
geoclue:!!:17648::::::
setroubleshoot:!!:17648::::::
rpcuser:!!:17648::::::
nfsnobody:!!:17648::::::
pulse:!!:17648::::::
gdm:!!:17648::::::
sssd:!!:17648::::::
gnome-initial-setup:!!:17648::::::
avahi:!!:17648::::::
tcpdump:!!:17648::::::
huhu:$6$UKoYAp4B$RJynooOhhyaQ9rhLGnyiMDJsRu.rJcO4Ey1wM6nyfLzHTsRjLX4rGLVncRCTkN0FP0xd9nDSCH1B2JvMgiPs50:17664:0:99999:7:::
huhu1:$6$/R7Va0Yf$gy0hgKl1IhQvGkO7P6hiKZauhRAlvZj/oCTO9DDDe9eyQw9v4nu3RE3TZsydv5taOWFm3ryXkmMMeQLpDzhxO1:17664:0:99999:7:::
linux的root密码存在于“/etc/shadow”这个文件中,不过要有root权限才能在linux下看到“/etc/shadow”这个文件。
Linux中 /etc/shadow文件中的记录行与/etc/passwd中的一一对应,它由 pwconv 命令根据/etc/passwd中的数据自动产生。它的文件格式与/etc/passwd类似,由若干个字段组成,字段之间用“:”隔开,文件的每行是8个冒号分割的9个域,格式如下:
username: passwd: lastchg: min: max: warn: inactive: expire: flag
登录名:加密口令:最后一次修改时间:最小时间间隔:最大时间间隔:警告时间:不活动时间:失效时间:标志
1. “登录名”是与/etc/passwd文件中的登录名相一致的用户账号
2. “口令”字段存放的是加密后的用户口令字,长度为13个字符。如果为空,则对应用户没有口令,登录时不需要口令;如果含有不属于集合{./0-9A-Za-z}中的字符,则对应的用户不能登录,并且不能反编译。
3. “最后一次修改时间”表示的是从某个时刻起,到用户最后一次修改口令时的天数。时间起点对不同的系统可能不一样。例如在centos Linux中,这个时间起点是1970年1月1日。
4. “最小时间间隔”指的是两次修改口令之间所需的最小天数。
5. “最大时间间隔”指的是口令保持有效的最大天数。
6. “警告时间”字段表示的是从系统开始警告用户到用户密码正式失效之间的天数。
7. “不活动时间”表示的是用户没有登录活动但账号仍能保持有效的最大天数。
8. “失效时间”字段给出的是一个绝对的天数,如果使用了这个字段,那么就给出相应账号的生存期。期满后,该账号就不再是一个合法的账号,也就不能再用来登录了。,从1970年1月1日开始
9. 保留字段,没有实际意义。
知识点
- 普通用户和root用户设置相同的密码,加密后也是不相同的
- 系统采用的是SHA-512加密
例子:
$6$12345678$U6Yv5E1lWn6mEESzKen42o6rbEm
说明:Linux或者其他linux内核系统中
长度: 13 个字符
描述:开始的
位为加密标志,后面8位为salt,后面的为hash
加密算法:5000次的SHA-512加密
插曲
我用curl下载man 中文版时,抓取页面乱码,一度以为系统出问题了,后来Xshell断了重连之后正常,吓死我了。。后来先把压缩包下载到本机,再传到虚拟机里。
二、用户组管理
用户组文件路径 /etc/group
查看 # cat /etc/group
[root@linux7-128 ~]# 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:30:
video:x:39:
ftp:x:50:
lock:x:54:
audio:x:63:
nobody:x:99:
users:x:100:
utmp:x:22:
utempter:x:35:
ssh_keys:x:999:
input:x:998:
systemd-journal:x:190:
systemd-network:x:192:
dbus:x:81:
polkitd:x:997:
postdrop:x:90:
postfix:x:89:
sshd:x:74:
chrony:x:996:
cgred:x:995:
rpc:x:32:
dip:x:40:
libstoragemgmt:x:994:
radvd:x:75:
ntp:x:38:
saslauth:x:76:
rtkit:x:172:
tss:x:59:
unbound:x:993:
libvirt:x:992:
usbmuxd:x:113:
colord:x:991:
kvm:x:36:qemu
qemu:x:107:
abrt:x:173:
geoclue:x:990:
setroubleshoot:x:989:
rpcuser:x:29:
nfsnobody:x:65534:
pulse-access:x:988:
pulse-rt:x:987:
pulse:x:171:
gdm:x:42:
sssd:x:986:
gnome-initial-setup:x:985:
stapusr:x:156:
stapsys:x:157:
stapdev:x:158:
avahi:x:70:
tcpdump:x:72:
slocate:x:21:
huhu:x:1000:
huhu1:x:1001:
这个和/etc/passwd
不是完全一样,没有全部对应的上,基本上那边有的,这边都有。
字段含义
组名:口令:组标识号:组内用户列表
1. 组名:组名是用户组的名称,由字母或数字构成。与/etc/passwd中的登录名一样,组名不应重复。
2. 口令:字段存放的是用户组加密后的口令字。一般Linux系统的用户组都没有口令,即这个字段一般为空,或者是x。
3. 组标识号:与用户标识号类似,也是一个整数,被系统内部用来标识组。别称GID。
4. 组内用户列表:是属于这个组的所有用户的列表,不同用户之间用逗号(,)分隔。这个用户组可能是用户的主组,也可能是附加组。
和/etc/shadow
对应的是/etc/gshadow
,用来存放用户组的密码
/etc/gshadow
是/etc/group
的加密资讯文件,比如用户组(Group)管理密码就是存放在这个文件。
/etc/gshadow
和/etc/group
是互补的两个文件;对于大型服务器,针对很多用户和组,定制一些关系结构比较复杂的权限模型,设置用户组密码是极有必要的。
比如我们不想让一些非用户组成员永久拥有用户组的权限和特性,这时我们可以通过密码验证的方式来让某些用户临时拥有一些用户组特性,这时就要用到用户组密码。
[root@linux7-128 ~]# 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:!::
ssh_keys:!::
input:!::
systemd-journal:!::
systemd-network:!::
dbus:!::
polkitd:!::
postdrop:!::
postfix:!::
sshd:!::
chrony:!::
cgred:!::
rpc:!::
dip:!::
libstoragemgmt:!::
radvd:!::
ntp:!::
saslauth:!::
rtkit:!::
tss:!::
unbound:!::
libvirt:!::
usbmuxd:!::
colord:!::
kvm:!::qemu
qemu:!::
abrt:!::
geoclue:!::
setroubleshoot:!::
rpcuser:!::
nfsnobody:!::
pulse-access:!::
pulse-rt:!::
pulse:!::
gdm:!::
sssd:!::
gnome-initial-setup:!::
stapusr:!::
stapsys:!::
stapdev:!::
avahi:!::
tcpdump:!::
slocate:!::
huhu:!::
huhu1:!::
解析
组名:口令:组管理者:组内用户列表
1. 组名: 是用户组的名称,由字母或数字构成。
2. 口令:用户组密码,这个段可以是空的或!,如果是空的或有!
,表示没有密码
3. 组管理者:这个字段也可为空,如果有多个用户组管理者,用,号分割
4. 组内用户列表:如果有多个成员,用,号分割;
知识点
[root@linux7-128 ~]# ls /etc/sh
shadow shadow- shells
[root@linux7-128 ~]# ls /etc/gs
gshadow gshadow- gss/ gssproxy/
[root@linux7-128 ~]# ls /etc/gr
groff/ group group- grub2.cfg grub.d/
[root@linux7-128 ~]# ls /etc/pa
pam.d/ passwd passwd-
前面提到的几个命令都有一个带-的命令,这是系统自动做的一个备份,每次更改用户时(删除或新加)会生成一个新的,旧的就会加一个-。如果不小心删除了原文件,可以将带-的文件重命名为原文件继续使用
创建用户组
命令
groupadd
语法
groupadd(选项)(参数)
选项
-g:指定新建工作组的id;(centos7预设不小于1000,centos6最小不得小于500,
以前的保留给系统账户使用)
-r:创建系统工作组,系统工作组的组ID小于500;
-K:覆盖配置文件“/ect/login.defs”;
-o:允许添加组ID号不唯一的工作组。
示例1
创建一个用户组并且在/etc/group
中查看
[root@linux7-128 ~]# groupadd grp1
[root@linux7-128 ~]# tail -n1 /etc/group
grp1:x:1002:
示例2
创建一个用户组并且知道组id为1005,最后在/etc/group中查看
[root@linux7-128 ~]# groupadd -g 1005 grp2
[root@linux7-128 ~]# tail -n3 /etc/group
huhu1:x:1001:
grp1:x:1002:
grp2:x:1005:
删除用户组
# groupdel (组名)
示例
删除grp1
[root@linux7-128 ~]# groupdel grp1
[root@linux7-128 ~]# tail -n3 /etc/group
huhu:x:1000:
huhu1:x:1001:
grp2:x:1005:
想删除用户组,这个用户组下面必须没有用户。如果下面有用户,则不允许删除。可以修改用户所属组,让想要删除的组空出来,再删除
三、用户管理
useradd
和 adduser
命令用来建立用户帐号和创建用户的起始目录,使用权限是终极用户。两者用法一样
新建用户
useradd 用户名
语法
useradd(选项)(参数)
选项
-c<备注>:加上备注文字。备注文字会保存在passwd的备注栏位中;
-d<登入目录>:指定用户登入时的启始目录;
-D:变更预设值;
-e<有效期限>:指定帐号的有效期限;
-f<缓冲天数>:指定在密码过期后多少天即关闭该帐号;
-g<群组>:指定用户所属的群组;
-G<群组>:指定用户所属的附加群组;
-m:自动建立用户的登入目录;
-M:不要自动建立用户的登入目录;
-n:取消建立以用户名称为名的群组;
-r:建立系统帐号;
-s<shell>:指定用户登入后所使用的shell;
-u<uid>:指定用户id。
示例
建立一个新用户账户,并设置ID
[root@linux7-128 ~]# useradd -u 1005 huhu2
[root@linux7-128 ~]# tail -n1 /etc/passwd
huhu2:x:1005:1006::/home/huhu2:/bin/bash
注意centos7之后uid值尽量大于1000,以免冲突
建立一个新用户账户,并设置ID 和组
[root@linux7-128 ~]# tail -n3 /etc/group
huhu1:x:1001:
grp2:x:1005:
huhu2:x:1006:
[root@linux7-128 ~]# useradd -u 1007 -g grp2 huhu3
[root@linux7-128 ~]# tail -n2 /etc/passwd
huhu2:x:1005:1006::/home/huhu2:/bin/bash
huhu3:x:1007:1005::/home/huhu3:/bin/bash
新建的huhu3用户此时的用户组为1005,对应我们刚才创建时设定的grp2
建立一个新用户账户,并设置用户组和家目录
[root@linux7-128 ~]# useradd -g grp2 -d /home/nhnh huhu4
[root@linux7-128 ~]# tail -n3 /etc/passwd
huhu2:x:1005:1006::/home/huhu2:/bin/bash
huhu3:x:1007:1005::/home/huhu3:/bin/bash
huhu4:x:1008:1005::/home/nhnh:/bin/bash
如果不指定UID时,会自动根据上一位自动生成,前面是1007,后面就变成1008
如果不指定GID时,不会根据上一位自增,仅仅会根据UID增加
创建用户,指定不创建家目录
[root@linux7-128 ~]# useradd -M huhu5
[root@linux7-128 ~]# tail -n3 /etc/passwd
huhu3:x:1007:1005::/home/huhu3:/bin/bash
huhu4:x:1008:1005::/home/nhnh:/bin/bash
huhu5:x:1009:1009::/home/huhu5:/bin/bash
[root@linux7-128 ~]# ls /home
huhu huhu1 huhu2 huhu3 nhnh
指定不创建家目录时,在etc/passwd
文件里虽然能看到,但实际上/home
目录下是没有/huhu5
的,
不存在不代表没有家目录,huhu5的家目录就是/home/huhu5
,只不过他没有创建而已
删除用户
userdel (选项)(参数)
示例1
删除用户
#userdel huhu5
删掉用户之后,/etc/passwd
里已经没有此用户信息,但是家目录里还有用户的家目录存在,这是防止用户以前有文件存在,把用户的家目录留给管理员,管理员觉得没用了可以手动删除。
删除用户和家目录
#userdel -r huhu5
连同家目录一同删除
四、usermod命令
usermod
更改用户属性,用法和useradd相似
语法
usermod [-LU][-c <备注>][-d <登入目录>][-e <有效期限>][-f <缓冲天数>]
[-g <群组>][-G <群组>][-l <帐号名称>][-s <shell>][-u <uid>][用户帐号]
参数说明
-c<备注> 修改用户帐号的备注文字。
-d登入目录> 修改用户登入时的目录。
-e<有效期限> 修改帐号的有效期限。
-f<缓冲天数> 修改在密码过期后多少天即关闭该帐号。
-g<群组> 修改用户所属的群组。
-G<群组> 修改用户所属的附加群组。
-l<帐号名称> 修改用户帐号名称。
-L 锁定用户密码,使密码无效。
-s<shell> 修改用户登入后所使用的shell。
-u<uid> 修改用户ID。
-U 解除密码锁定。
示例
更改用户UID
[root@linux7-128 ~]# usermod -u 1010 huhu5
[root@linux7-128 ~]# tail -n3 /etc/passwd
huhu3:x:1007:1005::/home/huhu3:/bin/bash
huhu4:x:1008:1005::/home/nhnh:/bin/bash
huhu5:x:1010:1009::/home/huhu5:/bin/bash
拓展
附加群组
# id 用户
查看用户id
[root@linux7-128 ~]# id huhu3
uid=1007(huhu3) gid=1005(grp2) 组=1005(grp2)
这个“组”就是不仅仅包含前面的gid,还包括一些扩展组。
一个用户可以属于多个组,但是gid只有一个,除了gid之外的组叫扩展组。
示例
更改用户的扩展组
[root@linux7-128 ~]# usermod -G huhu2 huhu3
[root@linux7-128 ~]# id huhu3
uid=1007(huhu3) gid=1005(grp2) 组=1005(grp2),1006(huhu2)
知识点
- 可以指定多个扩展组,语法# usermod -G huhu2,huhu1 huhu3
- 这个时候也可以使用# usermod -g huhu2,huhu1 huhu3
- # usermod -g
默认更改gid,后面追加两个组名是则更改的是扩展组
五、用户密码管理
更改用户密码passwd
更改root密码
# passwd
更改普通用户密码
# passwd 用户名
语法
passwd(选项)(参数)
选项
-d:删除密码,仅有系统管理者才能使用;
-f:强制执行;
-k:设置只有在密码过期失效后,方能更新;
-l:锁住密码;
-s:列出密码的相关信息,仅有系统管理者才能使用;
-u:解开已上锁的帐号。
示例1
更改huhu2密码
[root@linux7-128 ~]# passwd huhu2
更改用户 huhu2 的密码 。
新的 密码:
无效的密码: 密码未通过字典检查 - 它基于字典单词
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。
此时可以在/etc/shadow
里看到huhu2加密后的密码
[root@linux7-128 ~]# tail /etc/shadow
sssd:!!:17648::::::
gnome-initial-setup:!!:17648::::::
avahi:!!:17648::::::
tcpdump:!!:17648::::::
huhu:$6$UKoYAp4B$RJynooOhhyaQ9rhLGnyiMDJsRu.rJcO4Ey1wM6nyfLzHTsRjLX4rGLVncRCTkN0FP0xd9nDSCH1B2JvMgiPs50:17664:0:99999:7:::
huhu1:$6$/R7Va0Yf$gy0hgKl1IhQvGkO7P6hiKZauhRAlvZj/oCTO9DDDe9eyQw9v4nu3RE3TZsydv5taOWFm3ryXkmMMeQLpDzhxO1:17664:0:99999:7:::
huhu2:$6$cQTR.pdf$tdjjPk5enR0pESZUoiIB941odWelNLmfB9Bs6Pn7NRI5Fsp9AYk2ifUosQiv8Qi1D0Rl3r7tYCNYr9vscXywV/:17666:0:99999:7:::
huhu3:!!:17666:0:99999:7:::
huhu4:!!:17666:0:99999:7:::
huhu5:!!:17666:0:99999:7:::
示例2
锁定huhu2的密码
[root@linux7-128 ~]# passwd -l huhu2
锁定用户 huhu2 的密码 。
passwd: 操作成功
此时可以在/etc/shadow
里在查看huhu2加密后的密码,看看有什么变化
[root@linux7-128 ~]# tail /etc/shadow
sssd:!!:17648::::::
gnome-initial-setup:!!:17648::::::
avahi:!!:17648::::::
tcpdump:!!:17648::::::
huhu:$6$UKoYAp4B$RJynooOhhyaQ9rhLGnyiMDJsRu.rJcO4Ey1wM6nyfLzHTsRjLX4rGLVncRCTkN0FP0xd9nDSCH1B2JvMgiPs50:17664:0:99999:7:::
huhu1:$6$/R7Va0Yf$gy0hgKl1IhQvGkO7P6hiKZauhRAlvZj/oCTO9DDDe9eyQw9v4nu3RE3TZsydv5taOWFm3ryXkmMMeQLpDzhxO1:17664:0:99999:7:::
huhu2:!!$6$cQTR.pdf$tdjjPk5enR0pESZUoiIB941odWelNLmfB9Bs6Pn7NRI5Fsp9AYk2ifUosQiv8Qi1D0Rl3r7tYCNYr9vscXywV/:17666:0:99999:7:::
huhu3:!!:17666:0:99999:7:::
huhu4:!!:17666:0:99999:7:::
huhu5:!!:17666:0:99999:7:::
可以看到huhu2的密码段前有了两个感叹号!!
,这就说明huhu2的密码已经被锁定了,其他没有密码的用户比如huhu3,也是锁定状态,不允许登陆
如何解锁?
# passwd -u huhu2
[root@linux7-128 ~]# passwd -u huhu2
解锁用户 huhu2 的密码。
passwd: 操作成功
知识点
- passwd -l
和usermod -L
一样,都是锁定密码作用
- passwd -u
和usermod -U
一样,都是解锁密码作用
拓展1
明文显示更改密码
# passwd --stdin 用户名
[root@linux7-128 ~]# passwd --stdin huhu2
更改用户 huhu2 的密码 。
123456
passwd:所有的身份验证令牌已经成功更新。
此命令后面写shell脚本时可能会用到,看看另一种用法
[root@linux7-128 ~]# echo "112233" |passwd --stdin huhu2
更改用户 huhu2 的密码 。
passwd:所有的身份验证令牌已经成功更新。
“|”管道符的作用:把前面的结果传递给后面的命令
拓展2
echo -e
用于启用反斜线控制字符的转换
[root@linux7-128 ~]# echo -e "123\n123"
123
123
[root@linux7-128 ~]# echo -e "123\t123"
123 123
\n
换行
\t
Tab
六、mkpasswd命令
mkpasswd
这个命令是随机生成 密码的一个工具, 如果没有这个命令,请安装相应的包。
安装expect
# yum -y install expect
随机生成高强度密码
[root@linux7-128 ~]# mkpasswd
+Px4cy7gH
选项
-l 指定 长度,默认是 9
-d 指定 数字的个数,默认是 2
-c 指定 小写字符个数,默认是 3
-C 指定大写字符个数,默认是 2
-s 指定特殊字符个数,默认是 1
示例
长度15位,数字至少3位,小写字母至少4位,大写字母至少4位,特殊字符至少2位
[root@linux7-128 ~]# mkpasswd -l 15 -d 3 -c 4 -C 4 -s 2
ldz2d"9TAn2L(wQ
七、su命令
su
命令用于切换当前用户身份到其他用户身份,变更时须输入所要变更的用户帐号与密码。
切换用户时要加-
,这样切换的更加彻底
su命令和su -命令最大的本质区别就是:
前者只是切换了root身份,但Shell环境仍然是普通用户的Shell;而后者连用户和Shell环境一起切换成root身份了。只有切换了Shell环境才不会出现PATH环境变量错误。su切换成root用户以后,pwd一下,发现工作目录仍然是普通用户的工作目录;而用su -命令切换以后,工作目录变成root的工作目录了。用echo $PATH命令看一下su和su -以后的环境变量有何不同。以此类推,要从当前用户切换到其它用户也一样,应该使用su -命令。
在不切换用户的情况下,以普通用户的身份去执行一条命令
[root@linux7-128 ~]# su - -c "touch /tmp/huhu.txt" huhu
[root@linux7-128 ~]# ls -lt /tmp
总用量 136
-rw-rw-r-- 1 huhu huhu 0 5月 15 23:38 huhu.txt
拓展
[root@linux7-128 ~]# su - huhu5
su: 警告:无法更改到 /home/huhu5 目录: 没有那个文件或目录
-bash-4.2$
为什么会这样?
因为之前我们在创建用户huhu5的时候,没有给他创建家目录,所以才会导致显示成这个样子
如何恢复正常?
提示是没有那么文件或目录,那么我们就给他创建一个家目录。
创建方法
[root@linux7-128 ~]# id huhu5 #查看id
uid=1010(huhu5) gid=1009(huhu5) 组=1009(huhu5)
[root@linux7-128 ~]# mkdir /home/huhu5 #创建目录
[root@linux7-128 ~]# chown huhu:huhu /home/huhu5 #更改权限
试验
[root@linux7-128 ~]# su - huhu5
上一次登录:二 5月 15 23:43:44 CST 2018pts/0 上
-bash-4.2$
还是不可以,是因为她的目录下没有东西,不行root用户一样。
-bash-4.2$ ls -la
总用量 0
drwxr-xr-x 2 huhu huhu 6 5月 15 23:47 .
drwxr-xr-x. 8 root root 82 5月 15 23:47 ..
继续
系统是有个模板目录的 /etc/skel
,将他下面的模板文件拷贝到/home/huhu5
下
[root@linux7-128 ~]# ls /etc/skel
[root@linux7-128 ~]# ls -la !$ #查看目录下文件
ls -la /etc/skel
总用量 24
drwxr-xr-x. 3 root root 78 4月 27 20:59 .
drwxr-xr-x. 138 root root 8192 5月 15 23:23 ..
-rw-r--r--. 1 root root 18 8月 3 2017 .bash_logout
-rw-r--r--. 1 root root 193 8月 3 2017 .bash_profile
-rw-r--r--. 1 root root 231 8月 3 2017 .bashrc
drwxr-xr-x. 4 root root 39 4月 27 20:59 .mozilla
[root@linux7-128 ~]# cp /etc/skel/.bash* /home/huhu5 #复制/etc/skel/下所有.bash*文件
[root@linux7-128 ~]# chown -R huhu5:huhu5 /home/huhu5 #再次更改id
再次登录huhu5
[root@linux7-128 ~]# su - huhu5
上一次登录:二 5月 15 23:50:36 CST 2018pts/0 上
[huhu5@linux7-128 ~]$ ls -la
总用量 12
drwxr-xr-x 4 huhu5 huhu5 91 5月 15 23:59 .
drwxr-xr-x. 8 root root 82 5月 15 23:47 ..
-rw-r--r-- 1 huhu5 huhu5 18 5月 15 23:55 .bash_logout
-rw-r--r-- 1 huhu5 huhu5 193 5月 15 23:55 .bash_profile
-rw-r--r-- 1 huhu5 huhu5 231 5月 15 23:55 .bashrc
drwxrwxr-x 3 huhu5 huhu5 18 5月 15 23:59 .cache
drwxrwxr-x 3 huhu5 huhu5 18 5月 15 23:59 .config
一切显示正常
语法
su(选项)(参数)
选项
-c<指令>或--command=<指令>:执行完指定的指令后,即恢复原来的身份;
-f或——fast:适用于csh与tsch,使shell不用去读取启动文件;
-l或——login:改变身份时,也同时变更工作目录,以及HOME,SHELL,USER,logname。此外,也会变更PATH变量;
-m,-p或--preserve-environment:变更身份时,不要变更环境变量;
-s<shell>或--shell=<shell>:指定要执行的shell;
--help:显示帮助;
--version;显示版本信息。
八、sudo命令
sudo
可以让临时用户执行一个命令,以指定用户的身份
# visudo
打开sudo的配置文件
[root@linux7-128 ~]# visudo
配置文件......
实际上打开的是/etc/sudoers.tmp
,不建议使用vi编辑,此文件很重要。
知识点
在编辑文件时,可以输入set nu
,显示行数。
配置sudo必须通过编辑/etc/sudoers文件,而且只有超级用户才可以修改它,还必须使用visudo编辑。之所以使用visudo有两个原因,一是它能够防止两个用户同时修改它;二是它也能进行有限的语法检查。所以,即使只有你一个超级用户,你也最好用visudo来检查一下语法。
visudo默认的是在vi里打开配置文件,用vi来修改文件。我们可以在编译时修改这个默认项。visudo不会擅自保存带有语法错误的配置文件,它会提示你出现的问题,并询问该如何处理,就像:
(在配置文件处新增一行,huhu ALL=(ALL) ls,mv,cat)
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
huhu ALL=(ALL) ls,mv,cat
(保存退出后提示)
[root@linux7-128 ~]# visudo
>>> /etc/sudoers: 语法错误 near line 93 <<<
现在做什么?
(这是告诉我们刚才的语法有错误按下enter键后出现选项)
选项有:
重新编辑 sudoers 文件(e)
退出,不保存对 sudoers 文件的更改(x)
退出并将更改保存到 sudoers 文件(危险!)(Q)
现在做什么?
(这时应该重新编辑,所以输入e回车,会自动定位到有错误的地方,我们也可以使用set nu显示行数)
(往上可以看到一些示例,发现正确的语法是这么写的)
44 ## Processes
45 # Cmnd_Alias PROCESSES = /bin/nice, /bin/kill, /usr/bin/kill, /usr/bin/killall
(所以更改刚才错误的那行命令)
93 huhu ALL=(ALL) /usr/bin/ls, /usr/bin/mv, /usr/bin/cat
(再次保存退出)
这时候没有任何提示,说明配置文件修改成功,并且是正确的命令,此时huhu用户就拥有了查看、重命名其他用户下文件的权限
[root@linux7-128 ~]# su - huhu
上一次登录:二 5月 15 23:38:34 CST 2018pts/0 上
[huhu@linux7-128 ~]$ ls /root
ls: 无法打开目录/root: 权限不够
[huhu@linux7-128 ~]$ sudo ls /root
我们信任您已经从系统管理员那里了解了日常注意事项。
总结起来无外乎这三点:
#1) 尊重别人的隐私。
#2) 输入前要先考虑(后果和风险)。
#3) 权力越大,责任越大。
[sudo] huhu 的密码:
对不起,请重试。
[sudo] huhu 的密码:
1 2-1.txt anaconda-ks.cfg Documents folder.ini manpages-zh-1.5.1.tar.gz Pictures Templates
123 2.txt Desktop Downloads manpages-zh-1.5.1 Music Public Videos
从上面可以看出,切换到huhu之后,默认使用ls是无法查看目录的,但是使用sudo
后,只需要输入密码,就可以查看/root
下的目录
如何不输入密码直接查看?
继续修改visudo
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
huhu ALL=(ALL) /usr/bin/ls, /usr/bin/mv, /usr/bin/cat
huhu1 ALL=(ALL) NOPASSWD: /usr/bin/ls, /usr/bin/cat
此时huhu1用户就不再需要输入密码
[root@linux7-128 huhu]# su - huhu1
上一次登录:日 5月 13 22:11:10 CST 2018pts/1 上
[huhu1@linux7-128 ~]$ ls /root
ls: 无法打开目录/root: 权限不够
[huhu1@linux7-128 ~]$ sudo ls /root
1 2-1.txt anaconda-ks.cfg Documents folder.ini manpages-zh-1.5.1.tar.gz Pictures Templates
123 2.txt Desktop Downloads manpages-zh-1.5.1 Music Public Videos
知识点
配置文件里root ALL=(ALL) ALL
三个ALL什么意思?
第一个ALL是指网络中的主机,我们后面把它改成了主机名,它指明foobar可以在此主机上执行后面的命令。可以是IP,IP段,host或者别名。第二个括号里的ALL是指目标用户,也就是以谁的身份去执行命令。最后一个ALL当然就是指命令名了。例如,我们想让huhu用户在linux主机上以root或huhu1的身份执行kill命令,这样编写配置文件:
huhu linux=(root,huhu1) /bin/kill
设置命令别名
在visudo
里可以设置命令的别名,这样在编辑用户时 ,就不用写繁琐的绝对路径
进入visudo
,在此处参照示例编写
## 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 NET = /usr/bin/ls, /usr/bin/cat, /uer/bin/mv
此时NET代表这这三个命令的别名,那么我们去之前设置用户那里修改
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
huhu ALL=(ALL) /usr/bin/ls, /usr/bin/mv, /usr/bin/cat
修改为
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
huhu ALL=(ALL) NET
huhu1 ALL=(ALL) NOPASSWD: /usr/bin/ls, /usr/bin/cat
这时NET就代表了之前ls、mv、cat三个命令的绝对路径,保存退出
正常,无报错,测试一下
[root@linux7-128 ~]# su - huhu
上一次登录:三 5月 16 19:55:18 CST 2018pts/0 上
[huhu@linux7-128 ~]$ ls /root
ls: 无法打开目录/root: 权限不够
[huhu@linux7-128 ~]$ sudo ls /root
[sudo] huhu 的密码:
anaconda-ks.cfg Documents folder.ini manpages-zh-1.5.1.tar.gz Pictures Templates
Desktop Downloads manpages-zh-1.5.1 Music Public Videos
依然可以正常使用ls命令。
关于用户组
在visudo
里不仅可以针对用户设置权限,也可以针对用户组
## Allows people in group wheel to run all commands
%wheel ALL=(ALL) ALL
这里就是针对用户组的设置,方法与用户一样,可以在下面追加更改。
九、限制root用户远程登录
意义
保障root用户安全,防止密码被盗。
实现思路1
前面我们学了sudo,用户可以临时获得其他用户执行命令的权限。那么现在能否在visudo里设置一下,让普通用户可以临时切换到root用户去操作而不用输入密码呢?
试验
1. 首先我们知道root用户使用su -
命令还是root用户
[root@linux7-128 ~]# su -
上一次登录:四 5月 17 19:59:25 CST 2018从 192.168.220.1pts/0 上
- 那么如果我们让普通用户能够以root用户的身份去执行
su -
,就可以直接切换到root用户。而使用sudo切换用户时,是有一种办法不需要输入用户密码的。
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
huhu ALL=(ALL) NET
huhu1 ALL=(root) NOPASSWD: /usr/bin/su
这意味着huhu1,可以拥有root用户的权限,不需要密码执行su命令。
3. 看看结果
[huhu1@linux7-128 ~]$ whoami
huhu1
[huhu1@linux7-128 ~]$ sudo su -
上一次登录:四 5月 17 23:01:06 CST 2018从 192.168.220.1pts/1 上
[root@linux7-128 ~]#
在huhu1用户下,使用sudo执行su -
命令,不需要输入密码,切换到root用户,成功。
隐患
这样做,虽然普通用户可以不需要密码切换到root用户,同时也有一定的风险。当他切换到root用户时,是可以修改root密码的,这样他就可以直接远程登录。所以这样并不符合我们的设想,我们还要限制root远程登录。
实现思路2
限制root用户远程登录权限,这时候我们需要修改一个配置文件。
/etc/ssh/sshd_config
试验
编辑/etc/ssh/sshd_config
,搜索Root,出现的第一行就是我们需要修改的。
#LoginGraceTime 2m
#PermitRootLogin yes
#StrictModes yes
#MaxAuthTries 6
#MaxSessions 10
上面出现的#PermitRootLogin yes
,就是我们需要修改的,改为
#LoginGraceTime 2m
PermitRootLogin no
#StrictModes yes
#MaxAuthTries 6
#MaxSessions 10
不允许root远程登录,保存退出,然后重启下服务。
[root@linux7-128 ~]# systemctl restart sshd.service
然后重新用Xshll连接一下试试
发现root用户已经不能远程登录了,普通用户时可以正常登录的。
隐患
这种用法,虽然限制了root用户的远程登录,但是当普通用户需要一些root用户的权限时,由于没有密码还是无法操作,所以这时候就要跟试验1相结合,在visudo里设置一下,就可以了。有效的解决了root用户的安全问题。