用户的概念
对于计算机的应用,我们大多数都是在储存资料、办公娱乐。我们耗费精力与时间把我们喜欢的一些东西寻找下载在我们的计算机中,这台计算机没有一丁点限制,谁都可以进行访问,那我们所进行存储的一些东西就将变得很不安全,但是我们在给计算机创建一个用户并设置密码之后,其他人没获得我们的密码,他想对我们的东西做些手脚那将会变得很困难。
用户组的目的:
打个比方可能好理解点,一个学校有很多学生分成了很多班级便于学校管理,在linux中也要对用户(学生)按照某种策略进行分组管理。那么相对你而言你的同班同学就是你的同组用户,其他班级的学生就是非同组用户。
恰好你有一套非常流行的漫画,你就是文件(漫画)的属主,文件属主对自己的文件拥有最大权限可读可写可执行。如果你愿意与同组用户共享文件,那么就可以赋予同组用户(同班同学)一定的权限访问你的文件比如可读不可写可执行。如果你愿意与外班学生分享漫画,文件属主也可以赋予可读不可写不可执行的权限给非同组用户。这样就实现了对不同用户对某个文件的访问权限的管理。这完全取决于文件属主根据实际情况来决定哪个用户有没有有哪些权限访问属主的文件。当然如果你将自己文件的权限设置为777,那么就是所有的用户拥有和文件属主一样的最大权限,你也就失去了对这个文件的绝对控制。你也可以这样理解,文件属主所具有的权限应高于本组用户,本组用户的权限应高于非本组用户。做为文件属主或者是root用户不可以随便赋予本组或非本组用户拥有与文件属主一样的权限,这样会导致安全漏洞。
下面我简单说相关命令的操作。
用户和组的相关文件:
/etc/skel:
用户家目录样本信息。
这个目录存储了用户目录的样本文件,当用户的家目录损坏的时候,我们可以复制这个目录的文件到指定用户的家目录下。
这个目录大多数都是隐藏文件,所以复制的时候需要注意。
/etc/shadow:
详细信息:
样例: hua:!!:17086:0:99999:7:::
如果查看/etc/shadow文件存放的特殊帐号信息如下:
name:!!:13675:0:99999:7:::
每一行给一个特殊帐户定义密码信息,每个字段用 : 隔开。
字段 1 定义与这个 shadow 条目相关联的特殊用户帐户。
字段 2 包含一个加密的密码。
字段 3 自 1/1/1970 起,密码被修改的天数
字段 4 密码将被允许修改之前的天数(0 表示“可在任何时间修改”)
字段 5 系统将强制用户修改为新密码之前的天数(1 表示“永远都不能修改”)
字段 6 密码过期之前,用户将被警告过期的天数(-1 表示“没有警告”)
字段 7 密码过期之后,系统自动禁用帐户的天数(-1 表示“永远不会禁用”)
字段 8 该帐户被禁用的天数(-1 表示“该帐户被启用”)
字段 9 保留供将来使用
/etc/passwd: 存储了用户的详细信息,
/etc/passwd 文件是一个纯文本文件,每行采用了相同的格式:
样例:hua:x:1001:1001::/home/hua:/bin/bash
第一段: 用户登录名
第二段: password 用户口令。此域中的口令是加密的,常用x表示。
当用户登录系统时,系统对输入的口令采取相同的算法,与此域中的内容进行比较。
如果此域为空,表明该用户登录时不需要口令。
第三段: uid 指定用户的 UID。用户登录进系统后,系统通过该值,而不是用户名来识别用户。
第四段: gid GID。如果系统要对相同的一群人赋予相同的权利,则使用该值。
第五段: comment 用来保存用户的真实姓名和个人细节,或者全名。
第六段: home 指定用户的主目录的绝对路径。
第七段: shell 如果用户登录成功,则要执行的命令的绝对路径放在这一区域中。它可以是任何命令。
如果用户的shell类型是nologin,那么他将不能在本地登陆。
linux组与windows的区别:windows不允许用户名与组名同名,而linux可以。
/etc/group :
linux组与windows的区别:windows不允许用户名与组名同名,而linux可以。
记录了组名,组密码,组id号,以及组中成员。
详细信息:
样例: group_name:passwd:GID:user_list
在/etc/group 中的每条记录分四个字段:
第一字段:用户组名称;
第二字段:用户组密码;
第三字段:GID
第四字段:用户列表,每个用户之间用,号分割;本字段可以为空;如果字段为空表示用户组为GID的用户名;
/etc/gshadow :
/etc/gshadow是/etc/group的加密资讯文件,比如用户组(Group)管理密码就是存放在这个文件。
/etc/gshadow和/etc/group是互补的两个文件;对于大型服务器,针对很多用户和组,定制一些关系结构比较复杂的权限模型,设置用户组密码是极有必要的。
比如我们不想让一些非用户组成员永久拥有用户组的权限和特性,这时我们可以通过密码验证的方式来让某些用户临时拥有一些用户组特性,这时就要用到用户组密码。
样例:
[root@localhost ~]# cat /etc/gshadow
root:::root
bin:::root,bin,daemon
组名:口令:组管理者:组内用户列表
1) 组名: 是用户组的名称,由字母或数字构成。
2) 口令:用户组密码,这个段可以是空的或!,如果是空的或有!,表示没有密码
3) 组管理者:这个字段也可为空,如果有多个用户组管理者,用,号分割
4) 组内用户列表:如果有多个成员,用,号分割 ;
/etc/login.defs 用户与组策略文件
login.defs是设置用户帐号限制的文件,在这里我们可配置密码的最大过期天数,密码的最大长度约束等内容。该文件里的配置对root用户无效。如果/etc/shadow文件里有相同的选项,则以/etc/shadow里的设置为准,也就是说/etc/shadow的配置优先级高于/etc/login.defs
下边是该文档的内容:
#*REQUIRED*
#Directorywheremailboxesreside,_or_nameoffile,relativetothe
#homedirectory.Ifyou_do_defineboth,MAIL_DIRtakesprecedence.
#QMAIL_DIRisforQmail
#
#QMAIL_DIRMaildir
MAIL_DIR/var/spool/mail 注:创建用户时,要在目录/var/spool/mail中创建一个用户mail文件;
#MAIL_FILE.mail
#Passwordagingcontrols:
#
#PASS_MAX_DAYSMaximumnumberofdaysapasswordmaybeused.
#PASS_MIN_DAYSMinimumnumberofdaysallowedbetweenpasswordchanges.
#PASS_MIN_LENMinimumacceptablepasswordlength.
#PASS_WARN_AGENumberofdayswarninggivenbeforeapasswordexpires.
#
PASS_MAX_DAYS99999 注:用户的密码不过期最多的天数;
PASS_MIN_DAYS0 注:密码修改之间最小的天数;
PASS_MIN_LEN5 注:密码最小长度;
PASS_WARN_AGE7 注:
#
#Min/maxvaluesforautomaticuidselectioninuseradd
#
UID_MIN500 注:最小UID为500,也就是说添加用户时,UID是从500开始的;
UID_MAX60000 注:最大UID为60000;
#
#Min/maxvaluesforautomaticgidselectioningroupadd
#
GID_MIN500 注: GID是从500开始;
GID_MAX60000
#
#Ifdefined,thiscommandisrunwhenremovingauser.
#Itshouldremoveanyat/cron/printjobsetc.ownedby
#theusertoberemoved(passedasthefirstargument).
#
#USERDEL_CMD/usr/sbin/userdel_local
#
#Ifuseraddshouldcreatehomedirectoriesforusersbydefault
#OnRHsystems,wedo.ThisoptionisORedwiththe-mflagon
#useraddcommandline.
#
CREATE_HOMEyes 注:是否创用户家目录,要求创建;
/erc/default/useradd :
这里我们详细说说/etc/default/useradd这个文件。该文件主要是定义默认家目录、环境配置文件目录、登入执行首个程序等等。
来个实例吧:
# useradd defaults file
GROUP=100 注:gid=100,表示可创建普通组
HOME=/home 注:把用户的家目录建在/home中;用户家目录的默认创建地
INACTIVE=-1 注:是否启用帐号过期停权,-1表示不启用;宽限天数,0及以下数皆为无效数字
EXPIRE= 注:帐号终止日期,不设置表示不启用;帐号失效日期(如:20081212)
SHELL=/bin/bash 注:所用SHELL的类型;登录后执行的程序
SKEL=/etc/skel 注: 用户家目录中的环境文件,默认添加用户的目录默认文件存放位置;也就是说,当我们用adduser添
加用户时,用户家目录下的文件,都是从这个目录中复制过去的;
有人这里又会问:/etc/skel是干什么的?
用useradd username(或者adduser username)添加一个名为username的用户,然后用passwd
username
指定口令。
用户的信息记录在/etc/passwd文件里,由于每个用户都可以(而且必须能)读出这个文件然后就可以crack出其它用户的密码,为安全考虑现在都使用shadow。在/etc/passwd下用户的口令变为x
真正的口令密文记录在/etc/shadow里,而这个文件只有以root权限才能读出。Redhat
5.1以下版本没有直接使用shadow,需要用pwconv转换一下,如果要变回来,可以用pwunconv。
因此,在/etc/skel目录记录了一个用户应该有的基本文件
(ls -a
/etc/skel/看看都有什么,都是用户家目录中的环境文件),useradd会自动把这些文件复制到用户的家目录下并置上适当的权限(除非添加用户时用了-m参数:
useradd -m
xxx)。
如果你在这个目录下键一个public_html的目录,则以后添加的用户在它的家目录下都会自动有个同名的目录,这样每个用户都有了“个人主页”。删除用户可以用userdel
usrname或userdel -r
username(有些发行版可能是deluser),-r参数会删除这个用户的宿主目录,但是在系统里别的地方还可能有此用户的信息,所以在删除用户之前最好还要用find
/ -user username等方式去找一找相关信息。
如果要临时禁止一个用户,可以在/etc/passwd文件中此用户的密码这一项第一个字符前添加一个*号。
如果把密码域改为空,则此用户不需要密码就可以进入系统,当你忘记root口令时,可以用软盘启动把原来的root安装上来,直接去改passwd文件。我记得以单用户方式启动时不需要密码可以进去。长用户名的问题,在Redhat发行版中已经做得很好了,也允许用户名中有空格。如果你手上的发行版不支持,到/usr/include/utmpbits.h里把UT_NAMEDSIZE改为32,重新编译相关程序。
另一个直观的配置工具是linuxconf,比如用它来配置pppuser等等。
有关用户的命令
首先说下创建用户:
在linux中我们创建用户有很多种方法,由于本人才疏学浅,仅知道以下几种,厚颜无耻的拿出来让大伙乐呵乐呵。
(一) 创建用户:useradd
语法格式: useradd(选项)(参数)
这个命令的的选项可是不少:
-c<备注>:加上备注文字。备注文字会保存在passwd的备注栏位中;
-d<登入目录>:指定用户登入时的启始目录;
-D:变更预设值;
-e<有效期限>:指定帐号的有效期限;
-f<缓冲天数>:指定在密码过期后多少天即关闭该帐号;
-g<群组>:指定用户所属的群组;
-G<群组>:指定用户所属的附加群组;
-m:自动建立用户的登入目录;
-M:不要自动建立用户的登入目录;
-n:取消建立以用户名称为名的群组;
-r:建立系统帐号;
-s:指定用户登入后所使用的shell;
-u:指定用户id。
打了这么多选项了,我忍不住要试一下了,下面是这命令的具体用法:
先不带参数的创建一个用户试试:
查看创建的信息,可以发现用户名tom之后跟了一大串的信息,这些是什么意思呢?
我来说明以下:
第一段: 用户登录名
第二段: password 用户口令。此域中的口令是加密的,常用x表示。当用户登录系统时,系统对输入的口令采取相同的算法,与此域中的内容进行比较。如果此域为空,表明该用户登录时不需要口令。
第三段: uid 指定用户的 UID。用户登录进系统后,系统通过该值,而不是用户名来识别用户。
第四段: gid GID。如果系统要对相同的一群人赋予相同的权利,则使用该值。
第五段: comment 用来保存用户的真实姓名和个人细节,或者全名。
第六段: home 指定用户的主目录的绝对路径。
第七段: shell 如果用户登录成功,则要执行的命令的绝对路径放在这一区域中。它可以是任何命令。
每一段的信息已经给大家介绍了,这里在回到原先的主题把,从新来说明下个参数的用法,那么现在问题来了,刚才第一个介绍的命令“-c”是修改备注信息,这里就牵扯到了另外一条命令,这里我先暂时用一下,下面会有详细的说明。
(二)修改用户属性:
命令格式: usermod (选项) (参数)
usermod命令用于修改用户的基本信息。usermod命令不允许你改变正在线上的使用者帐号名称。当usermod命令用来改变user id,必须确认这名user没在电脑上执行任何程序。
该命令的相关参数:
-c<备注>:修改用户帐号的备注文字;
-d<登入目录>:修改用户登入时的目录;
-e<有效期限>:修改帐号的有效期限;
-f<缓冲天数>:修改在密码过期后多少天即关闭该帐号;
-g<群组>:修改用户所属的群组;
-G<群组>;修改用户所属的附加群组;
-l<帐号名称>:修改用户帐号名称;
-L:锁定用户密码,使密码无效;
-s:修改用户登入后所使用的shell;
-u:修改用户ID;
-U:解除密码锁定。
实例:
将hua2添加到组staff中:
usermod -G staff hua2
修改hua的用户名为hua1:
usermod -l hua1 hua
锁定账号hua1:
usermod -L hua1
解除对hua1的锁定:
usermod -U hua1
修改用户的登陆shell:
usermod -s /sbin/nologin /*更改为nologin之后,用户将无法登陆系统,这里仅作命令参考使用*/
(三)用户密码
passwd命令用于设置用户的认证信息,包括用户密码、密码过期时间等。系统管理者则能用它管理系统用户的密码。只有管理者可以指定用户名称,一般用户只能变更自己的密码。
命令格式: passwd (参数)
当然,如果你是管理员用户,那么你想要更改一个用户的密码,只需要在passwd命令加上这个用户的名字即可,
例如:
[root@localhost ~]# passwd harry Changing password for user harry. New password: BAD PASSWORD: The password fails the dictionary check - it is based on a dictionary word Retype new password: passwd: all authentication tokens updated successfully. [root@localhost ~]#
如果你是普通用户,那么改密码的时候直接输入passwd,然后进入更改界面,输入原来的密码确认身份之后,再输入两次新的密码即可。但是如果要更改密码,那么密码一定得遵循密码复杂性要求,这个要求包括:大写字母,小写字母,数字,符号。并且长度到达七个字符。这样的密码在够安全。
下面是样例:
[harry@localhost ~]$ passwd Changing password for user harry. Changing password for harry. (current) UNIX password: New password: Retype new password: passwd: all authentication tokens updated successfully. [harry@localhost ~]$
还有一种修改用户密码的方式,这种方式用户不会和系统产生交互,但是输出的命令是明文的,相信你可以搞定。
命令格式: echo centos | passwd — stdin hua
命令解析: 将用户 hua的密码改为 centos。
(五)批量创建用户
前边说了创建用户的命令与修改用户的命令,个人觉得平时使用最多的也是这个,但是如果同时让我们创建100个用户呢,我们该怎么办,总不把相同的命令重复100次把,所以这里就说下批量创建用户与批量修改用户密码。
批量创建用户: newusers (参数) /*通常是将存放用户信息的文本导入,信息格式类似与"/etc/passwd的文本格式"*/
批量更改用户密码: chpasswd (参数) /*与上边一样,将一个文本导入*/
下边来说下样例:
[root@localhost home]# cd /tmp/ [root@localhost tmp]# ls kde-root pw.txt systemd-private-e44b82a255dd4335be8e8ea86bc3d325-colord.service-cszZnR user1.txt [root@localhost tmp]# cat user1.txt hua:x:1011:1011::/home/hua:/bin/bash hua1:x:1012:1012::/home/hua1:/bin/bash hua2:x:1013:1013::/home/hua2:/bin/bash hua3:x:1014:1014::/home/hua3:/bin/bash hua4:x:1015:1015::/home/hua4:/bin/bash hua5:x:1016:1016::/home/hua5:/bin/bash [root@localhost tmp]# cat pw.txt hua:centos hua1:centos hua2:centos hua3:centos hua4:centos hua5:centos [root@localhost tmp]# newusers user1.txt [root@localhost tmp]# chpasswd < pw.txt [root@localhost tmp]# cat /etc/passwd [root@localhost tmp]# [root@localhost tmp]# su - hua Last login: Thu Oct 13 00:24:40 CST 2016 on pts/0 su: failed to execute /bin/bash : No such file or directory [root@localhost tmp]# cd /home/hua [root@localhost hua]# ls -a . ..
这时候发现不能切换用户,因为什么什么呢,进入hua用户家目录看完之后发现,用户家目录里没有配置文件,
此时就需拷贝/etc/skel/目录中的文件了。但是拷贝完文件之后还是进不去,找了许久,还是在别人的帮助下才发现错到哪里了,我在编写文档的时候多敲了一个空格,在执行命令的时候,系统读取不出来所以造成此结果,所以,再此我也不对这事进行隐瞒,意料之外的学习到了其他的东西。
#这里是拷贝用户家目录的命令:cp -r /etc/skel/.[^.]* /home/hua [hua@localhost ~]$ pwd /home/hua [hua@localhost ~]$ exit logout [root@localhost ~]# su - hua1 Last login: Thu Oct 13 00:55:45 CST 2016 on pts/0 [hua1@localhost ~]$ pwd /home/hua1
这些是把文档中的空格完全删除之后,切换用户的效果。
(五)删除用户
上面我们讲过了创建与修改用户,在这里就来跟大家说以以下删除用户的命令。
删除用户需要用到“userdel”这个命令,
命令格式 : userdel (参数)
样例:
[root@localhost ~]# getent passwd hua /*首先查看下用户信息*/ hua:x:1011:1011::/home/hua:/bin/bash [root@localhost ~]# userdel hua /*在这里删除用户*/ [root@localhost ~]# [root@localhost ~]# getent passwd hua /*删除完成之后使用该命令查询,已经找不到原来的用户了*/ [root@localhost ~]# [root@localhost ~]# cd /home /*进入用户家目录查看*/ [root@localhost home]# ls hua hua1 hua2 hua3 hua4 hua5 mageedu /*这里发现刚才被删除的用户家目录还在*/
如果我们加上-r 这个选项,在我们删除用户的同时,也会把用户的家目录删除掉。
[root@localhost home]# userdel -r hua1 [root@localhost home]# getent passwd hua1 [root@localhost home]#
(六)其他相关命令:
以下命令可以说是紧紧围绕在用户身旁,在工作中使用以下命令会使我们倍感愉快。
1)getent passwd:
这个命令在上边文章中我已经多次使用,那这条命令的具体作用到底是什么呢,我在这里简单说下。
命令格式: getent passwd (参数)
这里的参数可以指定为用户,作用就是可以查看单个用户的具体信息。
2)finger :
finger命令用于查找并显示用户信息。包括本地与远端主机的用户皆可,帐号名称没有大小写的差别。单独执行finger指令,它会显示本地主机现在所有的用户的登陆信息,包括帐号名称,真实姓名,登入终端机,闲置时间,登入时间以及地址和电话。
命令格式:finger (选项) (参数)
命令样式:
[root@localhost home]# finger hua2 Login: hua2 Name: Directory: /home/hua2 Shell: /bin/bash Never logged in. No mail. No Plan. [root@localhost home]# finger Login Name Tty Idle Login Time Office Office Phone Host root root tty1 2:01 Oct 12 12:23 root root pts/0 Oct 13 01:55 (172.16.252.142)
说了finger 命令,那就不得不说另外一个命令chfn。
chfn命令用来改变finger命令显示的信息。这些信息都存放在/etc目录里的passwd文件里。若不指定任何选项,则chfn命令会进入问答式界面。
命令语法:chfn (选项) (参数)
命令选项:
-f<真实姓名>或–full-name<真实姓名>:设置真实姓名;
-h<家中电话>或–home-phone<家中电话>:设置家中的电话号码;
-o<办公地址>或–office<办公地址>:设置办公室的地址;
-p<办公电话>或–office-phone<办公电话>:设置办公室的电话号码;
-u或–help:在线帮助;
-v或-version:显示版本信息。
3)whoami:该命令可以显示当前登陆的用户名称。
4) pwunconv:显示passwd文件中用户密码的加密信息。
pwconv :隐藏加密信息。
关于用户组的相关命令:
(一)创建用户组:groupadd
groupadd命令用于创建一个新的工作组,新工作组的信息将被添加到系统文件中
命令语法:groupadd (选项) (参数)
相关选项:
-g:指定新建工作组的id;
-r:创建系统工作组,系统工作组的组ID小于500;
-K:覆盖配置文件“/ect/login.defs”;
-o:允许添加组ID号不唯一的工作组。
在这里,命令的参数就是我们需要创建的组名。
命令样例:
[root@localhost home]# groupadd -g 300 hkd /*创建一个名叫hkd的组,并指定组ID号*/
此时会在/etc/group文件中产生一个组ID(GID)是300的项目。
(二)更改组名与识别号(GID)
groupmod命令更改群组识别码或名称。需要更改群组的识别码或名称时,可用groupmod指令来完成这项工作。
命令语法:groupmod (选项) (参数)
相关选项:
-g<群组识别码>:设置欲使用的群组识别码;
-o:重复使用群组识别码;
-n<新群组名称>:设置欲使用的群组名称。
参数: 指定需要修改的组名。
(三)删除用户组:
groupdel命令用于删除指定的工作组,本命令要修改的系统文件包括/ect/group和/ect/gshadow。若该群组中仍包括某些用户,则必须先删除这些用户后,方能删除群组。
命令语法: groupdel (参数)
参数:指定需要删除的组名。
(四)查看用户组:
在这里要提到两个命令,这两个命令可以使我们在万军丛中智取敌将首级,一个可以查找用户组里有那些用户,另一个命令可以查看用户在那个组。
先说第一个:groupmems
命令格式:groupmems -a user_name | -d user_name | [-g group_name] | -l | -p
参数 :
groupmems -g hua -a hua1 :这样使用,可以将hua1添加到hua组。
groupmems -g hua -d hua1 :这样使用,可以将hua1从hua组中删除。
groupmems -g hua -l :这样使用, 可以查看hua组中有那些成员。
groupmems -g hua -p :这样使用,可以将hua组中的成员全部删除
相对于第一个,第二个命令groups简单的多。因为在我们创建用户的同时,必将会生成一个组,这个命令就可以查看拥有该用户的所有组。
命令格式: groups (参数)
这里的参数直接指定对应的用户名即可。
好了就说到这里把,以后边学变补充。信息量略大。
原创文章,作者:ly,如若转载,请注明出处:http://www.178linux.com/53652