回顾:
bash globing IO重定向及管道
glob通配符: *,?,[],[^]
IO重定向: > >>
2> 2>>
&> &>>
>/PATH/TO/SOMEFILE 2>&1 //&1表示引用前面的路径
<, <<(HereDocument:此处文档)
command1| comand2
命令: tr, tee
用户的基础概念
用户管理基础概念:
用户类别:
管理员,普通用户(系统用户和登录用户)
组类别:
管理员组,普通用户组 //要注意这里的ID号的范围
基本组和附加组
私有组,公共组
数据库文件:
/etc/passwd
login:password:uid:gid:comment:home:shell
/etc/shadow
login:encrpted_password:最进一次修改密码的日期:密码最小有效期限:密码最大有效期限:警告时间:密码过期时间:账号失效时间:保留字
/etc/group
group:password:gid:user_list
密码存储格式: 单向加密,并借助于salt完成
加密算法:
md5:识别号码1
sha1 2
sha224 3
sha256 4
sha384 5
sha512:识别号码6
Linux用户和组管理:
进程有两类,一类是自动启动的,一类是开机后通过终端启动的。
类型为:安全上下文;
进程以其发起者的身份运行;
进程对文件的访问权限,取决于发起此进程的用户的权限;
举例:
以root身份可以查看/etc/shadow.。但是以普通管理员身份就不能查看
[root@localhost ~]# cat /etc/shadow
[root@localhost~]# su - dong
[dong@localhost ~]$ cat /etc/shadow
cat:/etc/shadow: Permission denied //没有权限
[dong@localhost~]$
系统用户: 为了能够让那后台进程或服务类进程以非管理员的身份运行,通常需要为次创 建多个普通用户,这类用户从不登陆系统,
每次执行一个命令,其实就是调动了进程。
groupadd命令:
添加组
mangroupadd
语法:
groupadd[options] group_name //翻译:groupadd 选项 组名
groupadd选项:
-g GID : 指定GID, 不指定则默认是上一个组的GID+1;
-r: 创建系统组
我们在Xshell上测试:
一台主机我们打开两个终端进行连接,一个窗口执行命令,另一个窗口查看命令执行的结果,这个的做法在执行一些文件追踪显示,或者让对比时十分有效。
例如:添加一个王用户:
[root@localhost~]# groupadd wang
在另一个伪终端上执行下面的命令:
[root@localhost~]# tail -f /etc/group
pulse-access:x:494:
fuse:x:493:
sshd:x:74:
slocate:x:21:
stapusr:x:156:
stapsys:x:157:
stapdev:x:158:
tcpdump:x:72:
dong:x:500:
wang:x:501: //这个gid我们没有指定是自动生成的。
或
[root@localhost~]# tail -2 /etc/group
wang:x:501:
xiang:x:502:
[root@localhost~]#
创建一个系统组:
[root@localhost~]# groupadd -r test
[root@localhost~]# tail -2 /etc/group
xiang:x:502:
test:x:492:
[root@localhost~]#
创建一个指定gid号的系统组:
[root@localhost~]# groupadd -r -g 306 haha
[root@localhost~]# groupadd -r -g 308 mariadb
[root@localhost~]# tail -2 /etc/group
test:x:492:
haha:x:306:
[root@localhost~]#
在linux是可以允许创建GID相同的用户组的。但是不建议这样创建。
groupmod命令:修改组属性
可以用查看man帮助,来获取groupmod的帮助信息:
[root@localhost~]# man groupmod
格式:groupmod [options]GROUP
-g GID:修改GID;(这里如果前面不加“-o”选项,那么我们修改的GID号一定 不能跟现存的某个组的GID号相同)
-n new_name:修改组名;(如果事先有其他组加入到这个组中了,那么这些其他 组的所属组组名也发生变化)
演示:
将上面的系统组mariadb的组ID改为702
[root@localhost~]# groupmod -g 702 mariadb
[root@localhost~]# tail -2 /etc/group
dong:x:500:
mariadb:x:702:
[root@localhost~]#
将系统组mariadb的组名改为perconaserver
[root@localhost~]# groupmod -n perconaservermariadb //新名在前,原名在后
[root@localhost~]# tail -2 /etc/group
dong:x:500:
perconaserver:x:702:
[root@localhost~]#
groupdel命令:删除组
[root@localhost~]# man groupdel
格式: groupdel [options] GROUP //无可用选项,直接删除组即可
演示:
[root@localhost~]# groupdel perconaserver
[root@localhost~]# tail -2 /etc/group
tcpdump:x:72:
dong:x:500:
[root@localhost~]#
useradd命令:创建用户
注意:创建用户时的诸多默认设定,的配置文件为 /etc/login.defs
其实useradd也可以写成adduser,我们可以通过如下命令来验证,adduser与useradd的关系:
[root@localhost~]# which adduser //查看adduser这个命令是否存在
/usr/sbin/adduser
[root@localhost~]# file `which adduser` //file查看文件类型,反引号表示命令引用
/usr/sbin/adduser:symbolic link to `useradd'
[root@localhost~]#
查看一下useradd的man帮助: man useradd
[root@localhost~]# man useradd
useradd - create a new user or updatedefault new user information(翻译:useradd这个命令是用来创建一个新用户,或者更新默认新用户的信息)
语法格式:useradd[options] LOGIN (翻译: useradd [选项] 登录名)
演示:
[root@localhost~]# useradd docker
[root@localhost~]# tail -1 /etc/passwd
docker:x:501:501::/home/docker:/bin/bash //如果不指定新用户的所属组,则默认创建 一个与用户同名的组,作为用户的私有组
[root@localhost~]#
[root@localhost~]# tail -1 /etc/group //查看创建新用户时建立的私有组,只包含一个 用户
docker:x:501:
[root@localhost~]#
useradd的选项:
-u,--uid UID:短选项-u,长选项--uid,都是指定用户的UID。
-g,--gid GROUP:短选项-g,长选项--gid,指定用户的基本组。注意:此组得 事先存在
-G,--groups GROUP1[,GROUP2,...[,GROUPN]]]:指明用户所属的附加组,多个 组之间用逗号分隔,组要事先存在
演示:
[root@localhost~]# tail /etc/group
sshd:x:74:
slocate:x:21:
stapusr:x:156:
stapsys:x:157:
stapdev:x:158:
tcpdump:x:72:
dong:x:500:
docker:x:501:
mogilefs:x:502:
mygrp:x:503: //有一个mygrp组,现在他没有组成员
[root@localhost~]#
[root@localhost~]# useradd -G mygrp archlinux //创建一个用户,附加组为 mygrp
[root@localhost~]# tail /etc/group
slocate:x:21:
stapusr:x:156:
stapsys:x:157:
stapdev:x:158:
tcpdump:x:72:
dong:x:500:
docker:x:501:
mogilefs:x:502:
mygrp:x:503:archlinux //组mygrp有一个以此组为附加组的组成员是arclinux
archlinux:x:504: //新添加的用户的基本组
[root@localhost~]#
-c,--comment COMMENT:指明注释信息
演示:
[root@localhost~]# useradd -c "MogileFSDFS" mogilefs
[root@localhost~]# tail -1 /etc/passwd
mogilefs:x:502:502:MogileFS DFS:/home/mogilefs:/bin/bash
[root@localhost~]#
-d,--home-dir HOME_DIR :以指定的路径为用户的家目录,他是通过复制 /etc/skel此目录并重命名实现的。指定的家目 录路径如果事先存在,则不会为用户复制环境配置文件
演示:
[root@localhost~]# mkdir /tmp/mytest
[root@localhost~]# useradd -d /tmp/mytestmytest //家目录路径已经存在
useradd:warning: the home directory already exists.(翻译:警告,此目录已经 存在)
Notcopying any file from skel directory into it.(翻译:不从skel目录里向其中复 制任何文件)
[root@localhost~]#
[root@localhost~]# ls -a /tmp/mytest/
. .. //没有任何文件
[root@localhost~]#
[root@localhost~]# ls -a /etc/skel
. .. .bash_logout .bash_profile .bashrc .gnome2 .mozilla
[root@localhost~]#
注意:在指定用户的家目录时,家目录的路径最好不要存在。
-s,--shell SHELL:指定用户的默认shell,可用的所有shell列表存储在 /etc/shells文件
演示:
[root@localhost~]# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin 很多系统用户shell就是/sbin/nologin
/bin/dash
/bin/tcsh
/bin/csh
[root@localhost~]#
[root@localhost~]# useradd -s /bin/cshkeystone
[root@localhost~]# tail -1 /etc/passwd
keystone:x:506:507::/home/keystone:/bin/csh
[root@localhost~]#
注意:当我们指定的shell不在/etc/shells列表中,也是可以的,只是在安全检查相对严格的情况下,会出错的。
-r,--system:创建系统用户;
-m,--create-home:强制创建主目录;
-M,--no-create-home:不为用户创建主目录;
-f,--inactive INACTIVE:密码过期后,账户彻底禁用之前的天数。0表示立即禁用,-1表 示禁用这个功能。
useradd-D :显示用户创建时许多默认配置属性信息。
useradd -D 选项:修改默认选项的值;
演示:
[root@localhost~]# useradd -D
GROUP=100
HOME=/home //用户创建时,尤其不是系统用户时,要不要创建家目录
INACTIVE=-1 //非活动期限为禁用
EXPIRE= //过期期限为永不过期
SHELL=/bin/bash //默认shell
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes //要不要为用户创建邮件缓冲队列,yes表示每创建一个用户,会在 /var/spool/mial/目录下为用户创建一个专用的邮筒,用来接收邮件的。
[root@localhost~]#
这个怎样用呢?
举例说明:
useradd -D
[root@localhost ~]# useradd -D //单独执行这么命令是查看我们创建用户时,默认的配置属 性信息
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
[root@localhost ~]#
我们还可以利用useradd -D来更改我们创建用户时的默认配置属性,比如说我们原来创建一个用户,是默认登录shell是 /bin/bash,当我们用命令,useradd -D -s /bin/csh,那么我们以后在创建用户时,默认的登录shell就是 /bin/csh
[root@localhost ~]# useradd -D -s /bin/csh
[root@localhost ~]# useradd -D
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/csh
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
[root@localhost ~]# useradd nova
[root@localhost ~]# tail -1 /etc/passwd
nova:x:507:508::/home/nova:/bin/csh //发现默认的登录shell变成了/bin/csh
[root@localhost ~]#
注意:上面修改的结果保存于 /etc/default/useradd文件中
[root@localhost~]# cat /etc/default/useradd
#useradd defaults file
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/csh
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
[root@localhost~]#
usermod命令:修改用户属性
[root@localhost~]# man usermod
语法:
usermod[options] LOGIN
选项:
-u,--uid UID:修改用户的ID为此处指定的新UID;
-g,--gid GROUP:修改用户所属的基本组;
-G,--groups GROUP1[,GROUP2,...[,GROUPN]]]:修改用户所属的附加组,原来的附加组 被覆盖
-a,--append:与-G一同使用,用于为用户追加新的附加组;
-c,--comment COMMENT:修改注释信息;
-d,--home HOME_DIR:修改用户的家目录,用户原有的文件不会被转移至新位置;
-m,--move-home:只能与 -d 选项一同使用,用于将原来的家目录移动为新的家目录;
-l,--login NEW_LOGIN:修改用户名;
-s,--shell SHELL:修改用户默认shell;
-L,--lock:锁定用户密码,使用户不能登录;即在用户原来的密码字符串之前添加一个 “!”
-U,--unlock:解锁用户密码;解锁就是将“!”删除;
-eYYYY-MM-DD: 指明用户账号过期日期;
-fINACTIVE:
userdel命令:删除用户
[root@localhost~]# man userdel
语法:
userdel[options] LOGIN
选项:
-r,--remove:删除用户时,一并删除用户的家目录,默认是不删除家目录的。
演示:
[root@localhost ~]# tail -1 /etc/passwd
nova:x:507:508::/home/nova:/bin/csh
[root@localhost ~]# userdel nova
[root@localhost ~]# ls /home/
archlinux docker dong keystone mogilefs nova //家目录仍然存在
[root@localhost ~]# userdel -r keystone
[root@localhost ~]# ls /home
archlinux docker dong mogilefs nova //keytone家目录不存在了
[root@localhost ~]#
练习:
1.创建用户gentoo,UID为4001,基本组为gentoo,附加组为distro(GID为5000)和peguin(GID为5001);
2.创建用户fedora,其注释信息为“FedoraCore”,默认shell为 /bin/tcsh;
3.修改gentoo用户的家目录为/var/tmp/gentoo;要求其原有文件仍能被用户访问;
4.位gentoo新增附加组netadmin;
paswd命令:
修改用户密码的命令
[root@www ~]# man passwd
语法格式:
passwd [-k] [-l] [-u [-f]] [-d] [-e] [-nmindays] [-x maxdays] [-w warndays] [-i inactivedays] [-S] [--stdin] [username]
又上的语法可以看出,passwd是可以单独使用的。
(1)passwd:修改用户自己的密码;
(2)passwd USERNAME:修改指定用户的密码,但默认情况下仅root有此权限;
选项:
-l|-u:锁定或者解锁用户;
-d:清除用户密码串;
演示:
[root@www~]# passwd -d docker //清除docker用户的密码,其实docker是 没有密码的
Removingpassword for user docker.
passwd:Succes
-e DATE:过期期限,日期;
-i DAYS:非活动期限;即密码过期后,账号还能活动几天
-n DAYS:密码的最短使用期限;
-x DAYS:密码的最长使用期限;
-w DAYS:警告期限;
--stdin:结合echo命令,和管道符,将密码直接付给用户,一般在脚本中这样使用
用法:
echo "PASSWORD" | passwd --stdin USERNAME
演示:
[root@www~]# echo"mageedu"|passwd --stdin docker
Changingpassword for user docker.
passwd:all authentication tokens updated successfully.
[root@www~]#
[root@www~]# echo"mageedu"|passwd --stdin docker >/dev/null //如果不想输 出命令执行的结果提示信息,我们可以将这些提示信息输出到/dev/null中
[root@www~]# echo $? //用这个命令查看最近一次执行是否成功,成功为0, 不成功为非0的数
0
[root@www~]#
gpasswd命令:
默认给组定义密码,但是也同时可以向组中添加用户和删除用户
gpasswd group:更改组账号的密码;
格式:gpasswd[option] group
选项[option]:
-a USERNAME:向组中添加用户;
-d USERNAME:从组中移除用户;
newgrp命令:临时切换指定的组为基本组;
格式:
newgrp[-] [group]
-:会模拟用户重新登录以实现重新初始化其工作环境
组密码存放在什么位置?
/etc/gshadow
组账号存放在什么位置?
/etc/group
给组添加密码有什么用呢?
当我们将一个用户临时切换到某个组时,就特别有用了
通过演示来说明组加密码的作用:
先添加一个任意组
[root@www ~]# groupadd mygrp
然后对这个新加的组改密码:
[root@www ~]# gpasswd mygrp
Changing the password for group mygrp
New Password: //密码为123456
Re-enter new password:
[root@www ~]# cat /etc/gshadow |grep mygrp //查看一下密码是否添加成功
mygrp:$6$YDofMRIec$AgW5fhiJdfqex2VK4fjkx.qNaNoarsZmbgdKw4DLULYWGNUPRs8gPysU14mCmzgLDPT4hwTVgt5649uVkW1RW/::archlinux
[root@www ~]#
[root@www ~]# su - archlinux //这是我们切换到一个用户
[archlinux@www ~]$ whoami //查看当前用户是谁
archlinux
[archlinux@www ~]$ id //查看用户的相关信息,我们看到他的属组两个有,其中附 加组为mygrp
uid=503(archlinux) gid=504(archlinux) groups=504(archlinux),503(mygrp)
[archlinux@www ~]$
[archlinux@www ~]$ touch test //创建一个空文件
[archlinux@www ~]$ ll
total 0
-rw-rw-r-- 1 archlinux archlinux 0 Oct 10 16:07 test //可以看到文件的属组为用户的基本组
[archlinux@www ~]$
[archlinux@www ~]$ newgrp mygrp //我们将用户archlinux的基本组临时切换为mygrp
[archlinux@www ~]$
[archlinux@www ~]$ id
uid=503(archlinux) gid=503(mygrp)groups=503(mygrp),504(archlinux) //基本组已经发生变化
[archlinux@www ~]$
[archlinux@www ~]$ touch test2 //在创建一个文件,发现这个文件的基本组已经成为了 mygrp
[archlinux@www ~]$ ll
total 0
-rw-rw-r-- 1 archlinux archlinux 0 Oct 1016:07 test
-rw-r--r-- 1 archlinux mygrp 0 Oct 10 16:14 test2
[archlinux@www ~]$
[archlinux@www ~]$ exit //用这个命令退回到原来的状态
exit
[archlinux@www ~]$ id
uid=503(archlinux) gid=504(archlinux)groups=504(archlinux),503(mygrp)
[archlinux@www ~]$
上面的演示,我们发现用户archlinux本来就属于两个组 archlinux和mygrp,所以可以随意切换。
但是当一个用户不属于某个组时,将这个用户切换到这个组,我们应该怎么做?
我们接着上面演示:
[archlinux@www ~]$ exit //普通用户退回到原来的管理员用户
logout
[root@www ~]#
[root@www ~]# su - docker
[docker@www ~]$ id //查看用户docker的信息,看到它只属于一个组
uid=501(docker) gid=501(docker) groups=501(docker)
[docker@www ~]$
[docker@www ~]$ touch test
[docker@www ~]$ ll //用户docker创建文件的属主属组都为用户的属组属主
total 0
-rw-rw-r-- 1 docker docker 0 Oct 10 16:23test
[docker@www ~]$ newgrp mygrp //docker用户属于mygrp组,并且mygrp组有密码, 这是临时切换,就需要不属于这个组的用户输入组的密 码
Password: //输入组密码123456
[docker@www ~]$ id //查看用户docker的信息发现,其基本组变成了mygrp
uid=501(docker) gid=503(mygrp)groups=503(mygrp),501(docker)
[docker@www ~]$
[docker@www ~]$ touch test2 //再次创建文件,发现文件的属组也成了mygrp
[docker@www ~]$ ll
total 0
-rw-rw-r-- 1 docker docker 0 Oct 10 16:23test
-rw-r--r-- 1 docker mygrp 0 Oct 10 16:27 test2
[docker@www ~]$
所以说,给组加密码,就是为了避免其他用户,将自己的基本组变为这个组
chage命令:
用来更改用户密码的过期信息的
[docker@www ~]$ man chage
格式:
chage[options] 登录名
id命令:显示用户真实和有效的ID;
真实和有效是有区别的
格式:
id [OPTION]... [USERNAME]
选项:
-u:仅显示有效的UID
-g:显示用户的基本组ID
-G:仅显示用户所属的所有组的ID;
-n:显示名字而非ID;与上面的显示ID的选项一起使用
演示:
[docker@www~]$ id -G -n archlinux
archlinuxmygrp
[docker@www~]$
su命令:switch user:完成用户切换
登录有两种:
登录式切换又叫完全切换
非登录式切换又叫半切换
登录式切换:会通过重新读取目标用户的配置文件来重新初始化
su - USERNAME
su -l USERNAME
非登录式切换:不会读取目标用户的配置文件进行初始化
su USERNAME
注意:管理员可无需密码切换至其他任何用户
普通用户要切换其他任何用户都需要密码
选项:
-c 'COMMAND':仅以指定用户的身份运行此处指定的命令;
演示:
[root@www~]# su - docker -c 'whoami'
docker
[root@www~]# whoami
root
[root@www~]#
其他几个命令不怎么用了现在,了解一下就行:
chsh, chfn, finger, whoami, pwck, grpck
chsh:更改当前用户或者指定用户的shell
单独执行chsh 或者 chshdocker
chfn:更改finger信息的;
finger这个命令需要安装在使用,安装: yuminstll finger
man finger :发现这个命令是查看用户信息的工具。
演示:
[root@www~]# finger docker
Login: docker Name:
Directory: /home/docker Shell:/bin/bash
Never logged in.
No mail.
No Plan.
[root@www ~]#
pwck: 检查用户的密码有什么问题的
grpck:检查组账号的密码有什么问题的
命令总结:
groupadd groupmod groupdel useradd usermod userdel passwd newgrp id su chage