linux 账号与用户管理
Posted IamJet
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux 账号与用户管理相关的知识,希望对你有一定的参考价值。
一. 账号与用户登录管理
1. 用户登录流程
- 先找寻 /etc/passwd 里面是否有你输入的账号?如果没有则跳出,如果有的话则将该账号对应的 UID 与 GID读出来,另外,该账号的家目录与 shell 配置也一并读出;
- 核对口令!这时 Linux 会进入 /etc/shadow 里面找出对应的账号与 UID,然后核对一下你刚刚输入的口令与里头的口令是否相符,之前所有条件OK,则可以登录系统进入shell环境。
2. 账户配置文件介绍
- /etc/passwd
7个字段:[ 账号名称:密码占位:UID:GID:用户描述:家目录:登录shell ]
提示:如果有密码则显示x,因为真正的密码在/etc/shadow,uid 0为root权限,1-499系统使用,500以后普通新增用户使用。
- /etc/shadow
9个字段:[ 账号名称:加密密码:最近更改密码日期:禁止更改密码的天数:密码过期天数:密码过期前提前警告的天数:密码过期后失效的天数:账号失效日期:保留 ]
提示:最近更改密码日期 和 账号失效日期 这两个日期都是使用自1970-1-1直到今天某个日期的天数来表示的。计算公式:echo $(($(date --date="2020/03/06" +%s)/86400+1))
- /etc/group
4个字段:[ 组名:群组密码占位:GID:加入此群组的账号名称 ]
提示:使用groups命令可以查看有效群组(第一个是有效群组),这个概念主要针对建立新文件时所属组而言,可以使用newgrp切换有效群组,但是切换之后是在子shell运行,了解后忘记把。
- /etc/gshadow
4个字段: [ 组名:密码:群组管理员账号:加入该组的账号 ]
提示:这个群组管理员是为了帮root干活用的,root太忙了找一些帮手而已,但是现在有sudo,谁还用群组管理员,了解后忘记把。
3. 用户账号管理实践
[root@www ~]# useradd [-u UID] [-g 初始群组] [-G 次要群组] [-mM]\\ > [-c 说明栏] [-d 家目录绝对路径] [-s shell] 使用者账号名 选项与参数: -u :后面接的是 UID ,是一组数字。直接指定一个特定的 UID 给这个账号; -g :后面接的那个组名就是我们上面提到的 initial group 啦~ 该群组的 GID 会被放置到 /etc/passwd 的第四个字段内。 -G :后面接的组名则是这个账号还可以加入的群组。 这个选项与参数会修改 /etc/group 内的相关数据喔! -M :强制!不要创建用户家目录!(系统账号默认值) -m :强制!要创建用户家目录!(一般账号默认值) -c :这个就是 /etc/passwd 的第五栏的说明内容啦~可以随便我们配置的啦~ -d :指定某个目录成为家目录,而不要使用默认值。务必使用绝对路径! -r :创建一个系统的账号,这个账号的 UID 会有限制 (参考 /etc/login.defs) -s :后面接一个 shell ,若没有指定则默认是 /bin/bash 的啦~ -e :后面接一个日期,格式为『YYYY-MM-DD』此项目可写入 shadow 第八字段, 亦即账号失效日的配置项目啰; -f :后面接 shadow 的第七字段项目,指定口令是否会失效。0为立刻失效, -1 为永远不失效(口令只会过期而强制于登陆时重新配置而已。)
[root@www ~]# passwd [--stdin] <==所有人均可使用来改自己的口令 [root@www ~]# passwd [-l] [-u] [--stdin] [-S] \\ > [-n 日数] [-x 日数] [-w 日数] [-i 日期] 账号 <==root 功能 选项与参数: --stdin :可以透过来自前一个管线的数据,作为口令输入,对 shell script 有帮助! -l :是 Lock 的意思,会将 /etc/shadow 第二栏最前面加上 ! 使口令失效; -u :与 -l 相对,是 Unlock 的意思! -S :列出口令相关参数,亦即 shadow 文件内的大部分信息。 -n :后面接天数,shadow 的第 4 字段,多久不可修改口令天数 -x :后面接天数,shadow 的第 5 字段,多久内必须要更动口令 -w :后面接天数,shadow 的第 6 字段,口令过期前的警告天数 -i :后面接『日期』,shadow 的第 7 字段,口令失效日期
[root@www ~]# chage [-ldEImMW] 账号名 选项与参数: -l :列出该账号的详细口令参数; -d :后面接日期,修改 shadow 第三字段(最近一次更改口令的日期),格式 YYYY-MM-DD -E :后面接日期,修改 shadow 第八字段(账号失效日),格式 YYYY-MM-DD -I :后面接天数,修改 shadow 第七字段(口令失效日期) -m :后面接天数,修改 shadow 第四字段(口令最短保留天数) -M :后面接天数,修改 shadow 第五字段(口令多久需要进行变更) -W :后面接天数,修改 shadow 第六字段(口令过期前警告日期)
范例二:创建一个名为 agetest 的账号,该账号第一次登陆后使用默认口令, 但必须要更改过口令后,使用新口令才能够登陆系统使用 bash 环境 [root@www ~]# useradd agetest [root@www ~]# echo "agetest" | passwd --stdin agetest [root@www ~]# chage -d 0 agetest # 此时此账号的口令创建时间会被改为 1970/1/1 ,所以会有问题! 范例三:尝试以 agetest 登陆的情况 You are required to change your password immediately (root enforced) WARNING: Your password has expired. You must change your password now and login again! Changing password for user agetest. Changing password for agetest (current) UNIX password: <==这个账号被强制要求必须要改口令!
[root@www ~]# usermod [-cdegGlsuLU] username 选项与参数: -c :后面接账号的说明,即 /etc/passwd 第五栏的说明栏,可以加入一些账号的说明。 -d :后面接账号的家目录,即修改 /etc/passwd 的第六栏; -e :后面接日期,格式是 YYYY-MM-DD 也就是在 /etc/shadow 内的第八个字段数据啦! -f :后面接天数,为 shadow 的第七字段。 -g :后面接初始群组,修改 /etc/passwd 的第四个字段,亦即是 GID 的字段! -G :后面接次要群组,修改这个使用者能够支持的群组,修改的是 /etc/group 啰~ -a :与 -G 合用,可『添加次要群组的支持』而非『配置』喔! -l :后面接账号名称。亦即是修改账号名称, /etc/passwd 的第一栏! -s :后面接 Shell 的实际文件,例如 /bin/bash 或 /bin/csh 等等。 -u :后面接 UID 数字啦!即 /etc/passwd 第三栏的数据; -L :暂时将用户的口令冻结,让他无法登陆。其实仅改 /etc/shadow 的口令栏。 -U :将 /etc/shadow 口令栏的 ! 拿掉,解冻啦!
[root@www ~]# cp -a /etc/skel /home/testuser [root@www ~]# chown -R vbird3:vbird3 /home/testuser [root@www ~]# chmod 700 /home/testuser
[root@www ~]# userdel [-r] username 选项与参数: -r :连同用户的家目录也一起删除 提示:为了让你的系统不产生莫名其妙的问题,如果想要完整的将某个账号完整的移除,最好可以在下达 userdel -r username 之前, 先以『 find / -user username 』查出整个系统内属于 username 的文件,然后再加以删除吧!
[root@www ~]# chfn [-foph] [账号名] 选项与参数: -f :后面接完整的大名; -o :您办公室的房间号码; -p :办公室的电话号码; -h :家里的电话号码!
[vbird1@www ~]$ chsh [-ls] 选项与参数: -l :列出目前系统上面可用的 shell ,其实就是 /etc/shells 的内容! -s :配置修改自己的 Shell
root@study study]# id uid=0(root) gid=0(root) 组=0(root) 环境=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 [root@study study]# id wangzengyi uid=1005(wangzengyi) gid=1005(wangzengyi) 组=1005(wangzengyi) [root@study study]#
[root@www ~]# groupadd [-g gid] [-r] 组名 选项与参数: -g :后面接某个特定的 GID ,用来直接给予某个 GID ~ -r :创建系统群组啦!与 /etc/login.defs 内的 GID_MIN 有关。 [root@www ~]# groupmod [-g gid] [-n group_name] 群组名 选项与参数: -g :修改既有的 GID 数字; -n :修改既有的组名 提示:不要随意的更动 GID ,容易造成系统资源的错乱! [root@www ~]# groupdel [groupname]
# 关于系统管理员(root)做的动作: [root@www ~]# gpasswd groupname [root@www ~]# gpasswd [-A user1,...] [-M user3,...] groupname [root@www ~]# gpasswd [-rR] groupname 选项与参数: :若没有任何参数时,表示给予 groupname 一个口令(/etc/gshadow) -A :将 groupname 的主控权交由后面的使用者管理(该群组的管理员) -M :将某些账号加入这个群组当中! -r :将 groupname 的口令移除 -R :让 groupname 的口令栏失效 # 关于群组管理员(Group administrator)做的动作: [someone@www ~]$ gpasswd [-ad] user groupname 选项与参数: -a :将某位使用者加入到 groupname 这个群组当中! -d :将某位使用者移除出 groupname 这个群组当中。
实例一: 账号名称 账号全名 支持次要群组 是否可登陆主机 口令 myuser1 1st user mygroup1 可以 password myuser2 2nd user mygroup1 可以 password myuser3 3rd user 无额外支持 不可以 password # 先处理账号相关属性的数据: [root@www ~]# groupadd mygroup1 [root@www ~]# useradd -G mygroup1 -c "1st user" myuser1 [root@www ~]# useradd -G mygroup1 -c "2nd user" myuser2 [root@www ~]# useradd -c "3rd user" -s /sbin/nologin myuser3 # 再处理账号的口令相关属性的数据: [root@www ~]# echo "password" | passwd --stdin myuser1 [root@www ~]# echo "password" | passwd --stdin myuser2 [root@www ~]# echo "password" | passwd --stdin myuser3 实例2: 我的使用者 pro1, pro2, pro3 是同一个项目计划的开发人员,我想要让这三个用户在同一个目录底下工作, 但这三个用户还是拥有自己的家目录与基本的私有群组。假设我要让这个项目计划在 /srv/projecta 目录下开发, 可以如何进行? # 1. 假设这三个账号都尚未创建,可先创建一个名为 projecta 的群组, # 再让这三个用户加入其次要群组的支持即可: [root@www ~]# groupadd projecta [root@www ~]# useradd -G projecta -c "projecta user" pro1 [root@www ~]# useradd -G projecta -c "projecta user" pro2 [root@www ~]# useradd -G projecta -c "projecta user" pro3 [root@www ~]# echo "password" | passwd --stdin pro1 [root@www ~]# echo "password" | passwd --stdin pro2 [root@www ~]# echo "password" | passwd --stdin pro3 # 2. 开始创建此项目的开发目录: [root@www ~]# mkdir /srv/projecta [root@www ~]# chgrp projecta /srv/projecta [root@www ~]# chmod 3770 /srv/projecta #SGID和SBID完美配合 [root@www ~]# ll -d /srv/projecta drwxrws--- 2 root projecta 4096 Feb 27 11:29 /srv/projecta
if [ ! -f account1.txt ]; then echo "所需要的账号文件不存在,请创建 account1.txt ,每行一个账号名称" exit 1 fi usernames=$(cat account1.txt) for username in $usernames do useradd $username <==新增账号 echo $username | passwd --stdin $username <==与账号相同的口令 chage -d 0 $username <==强制登陆修改口令 done
二. 使用者身份切换
1. su
- 若要完整的切换到新使用者的环境,必须要使用『 su - username 』或『 su -l username 』, 才会连同 PATH/USER/MAIL 等变量都转成新用户的环境;
- 如果仅想要运行一次 root 的命令,可以利用『 su - -c "命令串" 』的方式来处理;
- 使用 root 切换成为任何使用者时,并不需要输入新用户的口令;
-
[root@www ~]# su [-lm] [-c 命令] [username] 选项与参数: - :单纯使用 - 如『 su - 』代表使用 login-shell 的变量文件读取方式来登陆系统; 若使用者名称没有加上去,则代表切换为 root 的身份。 -l :与 - 类似,但后面需要加欲切换的使用者账号!也是 login-shell 的方式。 -m :-m 与 -p 是一样的,表示『使用目前的环境配置,而不读取新使用者的配置文件』 -c :仅进行一次命令,所以 -c 后面可以加上命令喔!
-
虽然su已经很完美了,但是还是有缺点,什么缺点呢?那就是每个需要切root权限的人都得知道root密码,这个风险太大了,所以呢大家都会用sudo了。
2. sudo
- 相对于 su 需要了解新切换的用户口令 (常常是需要 root 的口令), sudo 的运行则仅需要自己的口令即可! 甚至可以配置不需要口令即可运行 sudo 呢!由于 sudo 可以让你以其他用户的身份运行命令 (通常是使用 root 的身份来运行命令),因此并非所有人都能够运行 sudo , 而是仅有规范到 /etc/sudoers 内的用户才能够运行 sudo 这个命令。
- 配置/etc/sudoers文件推荐使用visudo命令,找到87--93行附近,看到这个内容:root ALL=(ALL) ALL,四段解释为:
- 系统的哪个账号可以使用 sudo 这个命令的意思,默认为 root 这个账号;
- 当这个账号由哪部主机联机到本 Linux 主机,意思是这个账号可能是由哪一部网络主机联机过来的, 这个配置值可以指定客户端计算机(信任用户的意思)。默认值 root 可来自任何一部网络主机
- 这个账号可以切换成什么身份来下达后续的命令,默认 root 可以切换成任何人;
- 可用该身份下达什么命令?这个命令请务必使用绝对路径撰写。 默认 root 可以切换任何身份且进行任何命令之意。
- 配置一个组可以使用sudo,且不需要输入密码这么配置,%groupname ALL=(ALL) NOPASSWD:ALL,然后需要sudo权限的用户加入这个名叫groupname的组。
- 虽然sudo已经很方便了(sudo的时候连自己的密码都不需要输入了),但是每执行一个命令之前sudo一下,总是不方便,有没有干脆点的痛快方法呢,当然有了,那就是sudo与su的结合,史上最牛逼的命令sudo su -。
三. linux主机的用户信息传递
1. 查询使用者
w, who, last, lastlog
[user1@study ~]$ w 07:20:31 up 2 days, 21:34, 2 users, load average: 0.00, 0.01, 0.05 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT user1 pts/0 192.168.31.244 06:44 7.00s 0.40s 0.05s w user2 pts/1 192.168.31.244 07:12 4:07 0.03s 0.03s -bash [user1@study ~]$ who user1 pts/0 2020-03-06 06:44 (192.168.31.244) user2 pts/1 2020-03-06 07:12 (192.168.31.244) [user1@study ~]$ last | head -5 user2 pts/1 192.168.31.244 Fri Mar 6 07:12 still logged in user1 pts/0 192.168.31.244 Fri Mar 6 06:44 still logged in root pts/0 192.168.31.244 Fri Mar 6 06:43 - 06:44 (00:00) user1 pts/0 192.168.31.244 Fri Mar 6 06:43 - 06:43 (00:00) root pts/0 192.168.31.244 Fri Mar 6 06:38 - 06:43 (00:05) [user1@study ~]$ lastlog |head -5 用户名 端口 来自 最后登陆时间 root pts/0 五 3月 6 06:46:06 +0800 2020 bin **从未登录过** daemon **从未登录过** adm **从未登录过**
2. 使用者通信短信息
[root@www ~]# write 使用者账号 [用户所在终端接口] 输入消息……………… CRTL+D 结束输入,此时在接收方就会看到消息,不过会被打断正在进行的工作,如果不想看到这种消息可以使用如下命令拒收消息,但是root的消息是不能拒收的,而root可以拒收别人的消息。 [user1@www ~]$ mesg n #拒收消息 [user1@www ~]$ mesg y #开启接收消息 如下为root使用wall命令发维护通知。 [root@www ~]# wall "I will shutdown my linux server..."
3. 使用这的mail邮箱
发邮件: mail username@localhost -s "邮件标题" Hello, D.M. Tsai Nice to meet you in the network. You are so nice. byebye! . <==这里很重要喔,结束时,最后一行输入小数点 . 即可! Cc: <==这里是所谓的『副本』,不需要寄给其他人,所以直接 [Enter] [root@www ~]# <==出现提示字符,表示输入完毕了! 以上可以通过写好的文件发送邮件,方法是: mail -s "标题" user2 < ~/test.txt 收邮件: h 列出信件标头;如果要查阅 40 封信件左右的信件标头,可以输入『 h 40 』 d 删除后续接的信件号码,删除单封是『 d10 』,删除 20~40 封则为『 d20-40 』。不过,这个动作要生效的话,必须要配合 q 这个命令才行! s 将信件储存成文件。例如我要将第 5 封信件的内容存成 ~/mail.file:『s 5 ~/mail.file』 x 不做任何动作离开。 q 将刚才的操作保存并退出。
四. 忘记root密码怎么办
以上是关于linux 账号与用户管理的主要内容,如果未能解决你的问题,请参考以下文章