- 用户管理
- 用户管理--用户信息与密码的配置文件
- 用户信息文件与组信息文件详解
- Username/UID与GID解释:
- Linux的组的类型:
- ===查看与切换===
- 用户之间的切换su与sudo(提权)与PAM:
- id 可以显示真实有效的用户ID(UID)和组ID(GID)
- finger 用于查找并显示用户信息
- chfn用来改变finger命令显示的信息
- ===用户===
- useradd 用于Linux中创建的新的系统用户
- passwd 用于设置用户的认证信息,包括用户密码、密码过期时间等
- usermod 用于修改用户的基本信息
- chpasswd 是批量更新用户口令的工具
- chsh用来更换登录系统时使用的shell
- chage是用来修改帐号和密码的有效期限
- userdel 用于删除给定的用户,以及与用户相关的文件
- pwck 用来验证系统认证文件/etc/passwd和/etc/shadow的内容和格式的完整性
- vipw编辑/etc/passwd文件
- ===组===
- groups 指定用户所在组的组成员
- groupadd 用于创建一个新的工作组
- gpasswd 是Linux下工作组文件/etc/group和/etc/gshadow管理工具
- groupmod 更改群组识别码或名称
- groupdel 用于删除指定的工作组
- vigr编辑/etc/group文件(锁定文件)
- grpck用于验证组文件的完整性
- getent用于获取指定数据库中的条目
- ===查看用户登录信息===
- last 用于显示用户最近登录信息
- lastb命令
- lastlog 用于显示系统中所有用户最近一次登录信息。
- newusers 用于批处理的方式一次创建多个命令
- Living Example:总结怎么查看用户创建的时间
用户管理
用户管理--用户信息与密码的配置文件
/etc/passwd:用户及其属性信息(名称、UID、基本组ID等等)
/etc/shadow:用户密码及其相关属性
/etc/group:用户组及其属性信息
/etc/gshadow:组密码及其相关属性
用户配置文件:
/etc/login.defs
/etc/default/useradd :默认配置文件
新用户信息文件: /etc/skel
登录信息: /etc/motd
用户信息文件与组信息文件详解
[root@test-6 ~]# 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
……
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
pppp:x:501:501::/home/pppp:/bin/bash
peng:x:502:502::/home/peng:/bin/bash
每一行内容存放一个用户的信息,每个用户信息有7部分组成,用户信息文件分析(每项用:
隔开)
root:x:0:0:root:/root:/bin/bash
root | 用户名 | 用户登录系统时使用的用户名 |
---|---|---|
x | 密码 | 密码位 |
0 | UID | 用户标识号 |
0 | GID | 缺省组标识 |
root | 用户全名 | 例如存放用户全名等信息 |
/root | 用户家目录 | 用户登录系统后的缺省目录 |
/bin/bash | 当前使用登录的shell | 用户使用的Shell ,默认为bash |
组:
[root@test-6 ~]# cat /etc/group
dialout:x:20:fnngj
dialout | 组名 | 用户登录时所在的组 |
---|---|---|
x | 组密码 | 一般不用 |
20 | GID | 组标识号 |
fnngj | 组内用户列表 | 属于该组的所有用户列表 |
密码文件详解
用户密码文件,用户信息文件中留有密码位,为什么没密码了呢? 其实,最早的linux这个位置真的是放密码的,因为不全安,所以,就将密码单独存放了,现在只是用x表示这里有存放密码的位置。
为什么要把密码放在/etc/shadow中
[root@AAAA7 ~]# ls -l /etc/shadow
----------. 1 root root 1205 11月 20 10:28 /etc/shadow
现在我们来看密码文件都放了什么?
[root@test-6 ~]# cat /etc/shadow
root:$6$4Ml.w1pd$j21iPRx9yFD0ZuTXg1Eil8937Jt9/1zZ8P5RQZI052iHAKqzsfuYqB41YNSVgPOdT3fgPYGGCkNQV.595c8FB0:17876:0:99999:7:::
bin:*:15980:0:99999:7:::
daemon:*:15980:0:99999:7:::
adm:*:15980:0:99999:7:::
lp:*:15980:0:99999:7:::
sync:*:15980:0:99999:7:::
……
pppp:$6$AjMZTGBT$p.Y0wUAgI2wRi79zCY62tTXLyEDfVBs7kIX5.8TZ/Z4WC6G0IyYKMGsMgNaZtHXwxUOD3nAQKEyDTSu0JrApY/:17884:0:99999:7:::
peng:$6$sgWtVVZL$hxH2Kt3txIsk5dU/E4ekn.6M2Qc9VbCMX8sWlvQU17mMhS45PMbD7yf9OUgFY6LGAagWzkS/LwuwEQIClx7O6.:17891:0:99999:7:::
第一行为例进行分解。
root:$6$4Ml.w1pd$j21iPRx9yFD0ZuTXg1Eil8937Jt9/1zZ8P5RQZI052iHAKqzsfuYqB41YNSVgPOdT3fgPYGGCkNQV.595c8FB0:17876:0:99999:7:::
root 用户名 用户登录系统时使用的用户名
$6$4Ml.w1pd$j21iPRx9yFD0ZuTXg1Eil8937Jt9/1zZ8P5RQZI052iHAKqzsfuYqB41YNSVgPOdT3fgPYGGCkNQV.595c8FB0 密码 加密密码 MD5
17876 最后一次修改时间 linux这里以1970年1月1日作为1,1971年1月1日就是366,依次类推到我修改密码的日期表示为17876了。
0 最小时间间隔 这个字段代表要经过多久才可以更改密码。如果是“0”表密码可以随时更改。
99999 最大时间间隔 于害怕密码被人盗取而危害到整个系统的安全,所以安排了这个字段,你必须在这个时间内重新修改密码,否则这个帐号将暂时失效。上面的99999,表示密码不需要重新输入,最好设定一段时间修改密码。确保系统安全
7 密码变更期期限快到前的警告期:当帐号的密码失效期限快到时,系统依据这个字段的设定发出警告,提醒用户“再过n天您的密码将过期,请尽快重新设定密码。默认的是七天。
帐号失效期: 如果用户过了警告期没有重新输入密码,使得密码失效,而该用户在这个字段限定的时间内又没有向管理员反映,让帐号重新启用,那么这个帐号将暂时失效。
帐号取消日期: 这个日期跟第三个字段一样,都是使用1970年以来的日期设定方法。这个字段表示:这个帐号在此字段规定的日期之后将无法再使用。这个字段通常用于收费服务系统中,可以规定一个日期让该帐号不能再使用。
保留: 最后一个字段是保留的,看以后有没有新功能加入。
Linux设置密码有一定的要求:
- 多使用数字、字母、特殊符号等加大密码难度
-
足够长
-
也可以使用随机密码:
设置随机密码:
[root@test-6 ~]# echo $[$RANDOM] | md5sum
1936fd5e2f1496417e4818c7e8a1ffc1 -
--------------------------------------------------------------------------------------------------------------
疑问:既然shadow文件保存了密码,而passwd文件中没有保存密码,为什么不把passwd文件中的密码位取消掉呢?
其实,密码在存放之前,是先放在passwd文件中的,然后再转换到shadow文件中的。下面来验证下
[root@bogon /]# grep root /etc/passwd /etc/shadow
/etc/passwd:root:x:0:0:root:/root:/bin/bash
/etc/passwd:operator:x:11:0:operator:/root:/sbin/nologin
/etc/shadow:root:$1$5DlBd7m8$tF.az6hWi27oaaFw7OpFs.:15391:0:99999:7:::
[root@bogon /]# pwunconv 将密码回写
[root@bogon /]# grep root /etc/passwd /etc/shadow
/etc/passwd:root:$1$5DlBd7m8$tF.az6hWi27oaaFw7OpFs.:0:0:root:/root:/bin/bash
/etc/passwd:operator:*:11:0:operator:/root:/sbin/nologin
grep: /etc/shadow: 没有那个文件或目录
[root@bogon /]# pwconv 转换到shdow文件中,只不过平时这个动作平时由linux自动完成。
[root@bogon /]# grep root /etc/passwd /etc/shadow
/etc/passwd:root:x:0:0:root:/root:/bin/bash
/etc/passwd:operator:x:11:0:operator:/root:/sbin/nologin
/etc/shadow:root:$1$5DlBd7m8$tF.az6hWi27oaaFw7OpFs.:15456:0:99999:7:::
linux对用户登录的验证就是通passwod文件来验证用户名是否存在,然后通过shadow文件来验证用户名对应的密码是否正确,那么理解了底层东西很有必要,我们可以不需要去学习创建用户命令,真接通过vim命令在两个文件中添加用户。这就是linux的魅力噢。不像windows一样,我们不但知其然,还知其所以然。
"会灵魂附体的"命令权限
继续用户管理的学习,上一小节我们知道,只有root可以修改密码文件,那么普通用户为什么可以修改自己的密码,这是因为我们所操作有命令"灵魂附体"般的拥有了root权限。这个小节自我感觉不教难理解,而我的内容也是顺着思路写,按着顺序看,最好去试验一下。^_^
小节重点:
===============================
setUID=4 所有人
setGID=2 所属组
粘着位=1 其它人
===============================
Username/UID与GID解释:
Username/UID
管理员:root,标示符:UID:0、#;GID:0
普通用户【系统用户和登陆用户】:1-65535
注意:普通用户:系统用户、登陆用户
系统用户:用于指定内核服务资源分配的ID标示符
UID【1-499】这是6版本
登陆用户:用于指定操作人员的管理ID标示符
UID【500-65535】
存放位置:[root@test ~]# cat /etc/passwd
GID:包含了多个用户的容器【装载UID以及对应的权限】
管理员组:root,0
普通组:
系统组:
UID【1-499】
登陆组:
UID【500-65535】
Linux的组的类型:
用户的基本组【主组】
组名和用户同名,且仅仅包含了一个用户【私有组】
注意:默认情况下载创建用户时,创建的用户的基本组和用户名一致,且在/home文件下,能找到对应的家目录
用户的附加组【额外组】
Linux的安全上、下文:
不同的用户,针对不同的用户组文件,不能任意使用,这就是上、下文
运行中的进程,对文件的访问权限,依赖于发起此进程的用户的权限
===查看与切换===
用户之间的切换su与sudo(提权)与PAM:
su ->switch user
su - root
su -l root #切换用户
su -c ls root #以用户的身份去执行命令,但是不登陆
/bin/su - elk -c '/usr/local/elasticsearch-7.10.0/bin/elasticsearch'
/bin/su - root -c 'ps'
su -
(后面不接用户、默认是root身份)
普通用户切换root用户是要密码的哟!亲!
普通用户切换到其它普通用户也是要密码的哟!
一个-
表示以root身份直接切换到root用户的家目录
su --
两个--
表示以root身份直接切换到普通用户的家目录
如果使用su user
(不加-
,只是用户切换过去了,其实还是在切换之前的目录下)
退出当前用户界面:exit
sudo 用来以其他身份来执行命令,预设的身份为root
sudo命令用来以其他身份来执行命令,预设的身份为root。在/etc/sudoers中设置了可执行sudo指令的用户。
若其未经授权的用户企图使用sudo,则会发出警告的邮件给管理员。
用户使用sudo时,必须先输入密码,之后有5分钟的有效期限,超过期限则必须重新输入密码。
Grammar
sudo (选项) (参数)
选项
- -c:查看Grammar是否正确 (
sudo -c
) -
-k:结束密码的有效期限,也就是下次再执行sudo时便需要输入密码;。
-
-l:列出目前用户可执行与无法执行的指令;
-
-u<用户>:以指定的用户作为新的身份。若不加上此参数,则预设以root作为新的身份;
-
-v:延长密码有效期限5分钟;
-
-i:切换至root用户,run login shell as the target user; a command may also be specified
-
-p:改变询问密码的提示符号;
-
-s
<shell>
:执行指定的shell; -
-V :显示版本信息。
-
-b:在后台执行指令;
-
-h:显示帮助;
-
-H:将HOME环境变量设为新身份的HOME环境变量;
参数
指令:需要运行的指令和对应的参数。
Living Example
定义用户别名
1、关键字严格区分大小写
2、别名必须都是大写
列出目前用户可执行与无法执行的指令:
[pppp@test-6 ~]$ sudo -l
匹配此主机上 pppp 的默认条目:
!visiblepw, always_set_home, env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC
KDEDIR LS_COLORS", env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE",
env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES", env_keep+="LC_MONETARY
LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE", env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS
_XKB_CHARSET XAUTHORITY", secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin
用户 pppp 可以在该主机上运行以下命令:
(root) NOPASSWD: /bin/mount, /bin/umount
配置sudo必须通过编辑/etc/sudoers
文件,而且只有超级用户才可以修改它,还必须使用visudo
编辑。之所以使用visudo有两个原因:
- 一是它能够防止两个用户同时修改它
- 二是它也能进行有限的Grammar检查。
所以,即使只有你一个超级用户,你也最好用visudo来检查一下Grammar。
visudo默认的是在vi里打开配置文件,用vi来修改文件。我们可以在编译时修改这个默认项。visudo不会擅自保存带有Grammar错误的配置文件,它会提示你出现的问题,并询问该如何处理,就像:
>>> sudoers file: syntax error, line 22 <<
此时我们有三种选择:键入e
是重新编辑,键入x
是不保存退出,键入Q
是退出并保存。如果真选择Q
,那么sudo将不会再运行,直到错误被纠正。
现在,我们一起来看一下神秘的配置文件,学一下如何编写它。让我们从一个简单的例子开始:让用户Foobar可以通过sudo执行所有root可执行的命令。
[peng@test-7 ~]$ ls /root/ # 这是没有配置sudo权限
ls: cannot open directory /root/: Permission denied
以root身份用visudo打开配置文件,可以看到类似下面几行:
我们一看就明白个差不多了,root有所有权限,只要仿照现有root的例子就行,我们在下面加一行(最好用tab作为空白):
peng ALL=(ALL) ALL
保存退出后,切换到peng
用户,我们用它的身份执行命令:
[root@test-7 ~]# su - peng # 切换到peng用户
[peng@test-7 ~]$ sudo ls /root/ # 这个配置了sudo权限
[sudo] password for peng: # 输入peng的密码
11 333 anaconda-ks.cfg file.txt sed.script test
222 aa day1.py file.txt.bak study.py www
#好了,我们限制一下foobar 的权利,不让他为所欲为。比如我们只想让他像root那样使用ls和ifconfig,把那一行改为:
foobar localhost= /sbin/ifconfig, /bin/ls
#再来执行命令:
[foobar@localhost ~]$ sudo head -5 /etc/shadow
Password:
Sorry, user foobar is not allowed to execute '/usr/bin/head -5 /etc/shadow' as root on localhost.localdomain.
[foobar@localhost ~]$ sudo /sbin/ifconfigeth0
Linkencap:Ethernet HWaddr 00:14:85:EC:E9:9B...
现在让我们来看一下那三个ALL到底是什么意思。
- 第一个ALL是指网络中的主机(可以是主机名、ip地址、网段),我们后面把它改成了主机名,它指明foobar可以在此主机上执行后面的命令。
- 第二个括号里的ALL是指目标用户;默认是以root身份执行,也就是以谁的身份去执行命令;例如:
Runas_Alias ADDD = root,test
定义以谁的身份执行命令,这个用的很少 - 最后一个ALL当然就是指命令名了(且必须是命令的绝对路径)。
例如,我们想让foobar用户在linux主机上以jimmy或rene的身份执行kill命令,这样编写配置文件:
foobar linux=(jimmy,rene) /bin/kill
但这还有个问题,foobar到底以jimmy还是rene的身份执行?这时我们应该想到了sudo -u
了,它正是用在这种时候。 foobar可以使用sudo -u jimmy kill PID
或者sudo -u rene kill PID
,但这样挺麻烦,其实我们可以不必每次加-u
,把rene或jimmy设为默认的目标用户即可。再在上面加一行:
Defaults:foobar runas_default=rene
Defaults后面如果有冒号,是对后面用户的默认,如果没有,则是对所有用户的默认。就像配置文件中自带的一行:Defaults env_reset
另一个问题是,很多时候,我们本来就登录了,每次使用sudo还要输入密码就显得烦琐了。我们可不可以不再输入密码呢?当然可以,我们这样修改配置文件:
peng localhost=(AAL) NOPASSWD: /bin/cat, /bin/ls
再来sudo一下:
[foobar@localhost ~]$ sudo ls /
rootanaconda-ks.cfg Desktop install.log install.log.syslog
当然,你也可以说某些命令用户peng不可以运行
,通过使用!
操作符,但这不是一个好主意。因为,用!
操作符来从ALL中剔出
一些命令一般是没什么效果的,一个用户完全可以把那个命令拷贝到别的地方,换一个名字后再来运行。
解释说明:
test ALL=(root) /usr/sbin/useradd,!/usr/bin/passwd,!/usr/sbin/visudo, /usr/sbin/*
!
是不让执行-
命令之间用
逗号
隔开 -
星号
表示所有(usr/sbin下面的所有命令) - /usr/sbin下面的命令基本都是管理员用的命令,尽量不要提权
自定义指定某些用户能使用某些命令的权限(定义的别名,必须大写,否则会报错,多个别名用逗号连接) --重点
定义命令的别名
定义主机名的别名(可以使主机名,也可以是ip)
定义多个别名:(用冒号隔开)
定义用户组:(qqqq、pppp代表普通用户)
引用定义的别名(主机名或者命令)
如果不想让指定的用户输入密码验证:peng hostname=NOPASSWD: qqq
组 (用%
调用系统组)
下面是visudo
自带的配置,只需要打用户加入到系统的wheel组也可以实现sudo
。如果你不需要输入密码就把NOPASSED这行配置注释拿到,然后把上面的wheel注释掉
## Allows people in group wheel to run all commands
%wheel ALL=(ALL) ALL
## Same thing without a password
# %wheel ALL=(ALL) NOPASSWD: ALL # 如果不需要密码就把注释拿到,然后把wheel需要密码的配置注释掉
下面就是举例,在linux添加一个新的系统组,然后添加用户
1、新建组
2、往组里添加用户
[root@lnmp01 ~]# groupadd -r seo
#添加用户到组的2种方法:(2种方法usermod和gpasswd)
[root@lnmp01 ~]# usermod -a -G seo kkk
组名 用户名
#将用户添加到组中去
[root@lnmp01 ~]# gpasswd -a liao seo #一般用这种方法
用户名 组名
Adding user liao to group seo
#打开visudo,在最后面添加如下配置即可
%yunwei ALL=(root) NOPASSWD: /usr/bin/passwd,/usr/sbin/useradd,!/usr/bin/passwd root,!/usr/sbin/visudo # 这个是自己写的,如果你需要全部的命令,就使用ALL
%yunwei ALL=(root) NETWORKING #这个是系统默认有一个NETWORKING,只有把NETWORKING注释取消,写上这句,就可以用NETWORKING里面的命令
--------------------------------------------------------------------
日志与安全:(非常重要!)
sudo
为安全考虑得很周到,不仅可以记录日志,还能在有必要时向系统管理员报告。但是,sudo的日志功能不是自动的,必须由管理员开启。操作如下:默认在/var/log/sudo
,但是如果文件不存在的话需要我们添加日志文件的说明方法:
# visudo #在文件末尾添加下面几行
Defaults logfile=/var/log/sudo.log #定义日志的位置和名字
Defaults loglinelen=0 #不限制日志行数
Defaults !syslog #使用系统日志服务来管理
#添加完了以后重启系统日志服务
/etc/init.d/rsyslog restart
然后切换到普通用户,进行sudo操作;在然后在回到root用户下,查看/var/log/sudo.log里面的日志记录
--------------------------------------------------------------------
#重启日志守候进程:
ps aux grep syslogd
#把得到的syslogd进程的PID(输出的第二列是PID)填入下面:
kill –HUP PID
# 这样,sudo就可以写日志了:
[foobar@localhost ~]$ sudo ls /
rootanaconda-ks.cfg Desktop install.log install.log.syslog
$cat /var/log/sudoJul 28 22:52:54 localhost sudo: foobar :
TTY=pts/1 ; pwd=/home/foobar ; USER=root ; command=/bin/ls /root
# 不过,有一个小小的“缺陷”,sudo记录日志并不是很忠实:
[foobar@localhost ~]$ sudo cat /etc/shadow > /dev/null
cat /var/log/sudo...Jul 28 23:10:24 localhost sudo: foobar : TTY=pts/1 ;
PWD=/home/foobar ; USER=root ; COMMAND=/bin/cat /etc/shadow
重定向没有被记录在案!为什么?因为在命令运行之前,shell把重定向的工作做完了,sudo根本就没看到重定向。这也有个好处,下面的手段不会得逞:
[foobar@localhost ~]$ sudo ls /root > /etc/shadow
bash: /etc/shadow: 权限不够
sudo 有自己的方式来保护安全。以root的身份执行sudo -V,查看一下sudo的设置。因为考虑到安全问题,一部分环境变量并没有传递给sudo后面的命令,或者被检查后再传递的,比如:PATH,HOME,SHELL等。当然,你也可以通过sudoers来配置这些环境变量。
runuser
runuser
是一个 Linux 系统中的命令,用于以指定用户身份运行命令或启动进程。下面是runuser
命令的详细解释:
runuser [选项] 用户名 -c 命令
选项:
-l
或--login
:以登录 shell 的方式运行命令,即模拟用户登录,加载用户的环境变量和配置文件。-m
或--preserve-environment
:在非登录 shell 的方式下,保持用户的环境变量。-u
或--user
:指定要切换到的目标用户。-g
或--group
:指定要切换到的目标组。-
-s
或--shell
:指定要使用的 shell。 -
用户名:要切换到的目标用户的用户名。
-
-c 命令:要运行的命令或要启动的进程。可以使用单引号或双引号将命令括起来。
使用 runuser
命令时,当前用户需要具有足够的权限才能切换到目标用户。一旦切换到目标用户,命令将以该用户的身份执行。
以下是几个示例:
- 以 root 用户身份运行命令:
runuser -l root -c 'command'
- 切换到特定用户并执行命令:
runuser -l username -c 'command'
- 以非登录 shell 的方式切换到用户并执行命令:
runuser -u username -c 'command'
- 以特定的 shell 运行命令:
runuser -s /bin/bash -u username -c 'command'
请注意,runuser
命令主要用于 Linux 系统。在其他操作系统上,可能具有类似功能但不完全相同的命令。
如需获取更多关于 runuser
命令的详细信息,你可以在终端中使用man runuser
命令查看其手册页面。
runuser sudo su的区别
"runuser"、"sudo" 和 "su" 是 Linux 系统中用于切换用户身份和执行命令的命令。下面是它们之间的区别:
1、使用权限:
-
"runuser":需要当前用户具有足够的权限才能切换到目标用户。
-
"sudo":当前用户需要属于 sudoers(拥有管理员权限)列表中的用户,并且输入自己的密码来执行特权操作。
-
"su":当前用户需要是超级用户(root)或者知道目标用户的密码才能切换到目标用户。
2、切换用户的方式:
-
"runuser":以指定用户身份运行命令,并可以选择以登录 shell 的方式加载用户的环境变量和配置文件。
-
"sudo":使用特权身份执行单个命令或一系列命令。
-
"su":切换到目标用户的身份,并进入目标用户的 shell 环境。
3、命令语法:
-
"runuser":
runuser [选项] 用户名 -c 命令
-
"sudo":
sudo [选项] 命令
-
"su":
su [选项] [用户名]
4、使用方式:
-
"runuser":用于在当前会话中临时切换用户身份执行命令。
-
"sudo":用于授予临时的管理员权限,以执行需要特权的命令。
-
"su":用于永久切换到目标用户,并在目标用户的环境中执行命令。
总之,在使用权限、切换用户方式和命令语法上,这三个命令都有所不同。具体选择使用哪个命令取决于你的需求和当前的用户权限。
PAM件式的认证模块
参考:https://www.cnblogs.com/LyShark/p/10221794.html
PAM(Pluggable Authentication Modules) #插件式的认证模块
glib (gnu c standard libruary)
[root@lamp ~]# ls /lib64/security/ #认证插件的位置
[root@lamp ~]# ls /etc/pam.d/ #pam配置文件所在的位置
id 可以显示真实有效的用户ID(UID)和组ID(GID)
id命令可以显示真实有效的用户ID(UID)和组ID(GID)。UID是对一个用户的单一身份标识。组ID(GID)则对应多个UID。id命令已经默认预装在大多数Linux系统中。要使用它,只需要在你的控制台输入id。不带选项输入id会显示如下。结果会使用活跃用户。
当我们想知道某个用户的UID和GID时id命令是非常有用的。一些程序可能需要UID/GID来运行。id使我们更加容易地找出用户的UID以GID而不必在/etc/group文件中搜寻。如往常一样,你可以在控制台输入man id进入id的手册页来获取更多的详情。
Grammar
id [-gGnru][--help][--version][用户名称]
选项
-
-n或--name 显示用户,所属群组或附加群组的名称。
-
-u或--user 显示用户ID。
- -Z:显示当前用户的加密文档
-
-g或--group 显示用户所属群组的ID。
-
-G或--groups 显示用户所属附加群组的ID。
-
-r或--real 显示实际ID。
-
-help 显示帮助。
-
-version 显示版本信息。
Living Example
[root@localhost ~]# id
uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel)
解释:用户root的UID号码 = 0,GID号码 = 0。用户root是下面组的成员:
-
root组GID号是:0
-
bin组GID号是:1
-
daemon组GID号是:2
-
sys组GID号是:3
-
adm组GID号是:4
-
disk组GID号是:6
-
wheel组GID号是:10
输出特定用户信息,我们可以输出特定的用户信息相关的UID和GID。只需要在id命令
后跟上用户名:
[root@test ~]# id root
uid=0(root) gid=0(root) 组=0(root)
输出所有不同的组ID ,有效的,真实的和补充的,我们可以使用-G
选项来实现:
[root@test ~]# id root
uid=0(root) gid=0(root) 组=0(root)
结果只会显示GID号。你可以和/etc/group文件比较。下面是/etc/group文件的示例内容:
只输出有效的组ID,通过使用-g
选项来只输出有效组ID:
[root@localhost ~]# id -g
0
打印用户名、UID 和该用户所属的所有组,要这么做,我们可以使用-a
选项:
[root@localhost ~]# id -a
uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel)
[root@test ~]# id -G -n peng
peng yy
finger 用于查找并显示用户信息
finger命令用于查找并显示用户信息。包括本地与远端主机的用户皆可,帐号名称没有大小写的差别。单独执行finger指令,它会显示本地主机现在所有的用户的登陆信息,包括帐号名称,真实姓名,登入终端机,闲置时间,登入时间以及地址和电话。
Grammar
finger username
finger(选项)(参数)
选项
- -f:指定真名
- -o:指定办公名牌号
-
-m:排除查找用户的真实姓名;
-
-l:列出该用户的帐号名称,真实姓名,用户专属目录,登入所用的Shell,登入时间,转信地址,电子邮件状态,还有计划文件和方案文件内容;
-
-s:列出该用户的帐号名称,真实姓名,登入终端机,闲置时间,登入时间以及地址和电话;
-
-p:列出该用户的帐号名称,真实姓名,用户专属目录,登入所用的Shell,登入时间,转信地址,电子邮件状态,但不显示该用户的计划文件和方案文件内容。
不指定finger的选项如果提供操作者的话,缺省设为-l
输出风格,否则为-s
风格,注意在两种格式中,如果信息不足,都有一些域可能丢失,如果没有指定参数finger会为当前登录的每个用户打印一个条目。
参数
用户名:指定要查询信息的用户。
Living Example
显示指定用户信息
# finger -m hnlinux
显示远程用户信息
# finger -m root@192.168.1.13
下列指令可以查询本机管理员的资料:
[root@test ~]# finger root
Login: root Name: root
Directory: /root Shell: /bin/bash
On since 四 12月 27 08:37 (CST) on pts/0 from sky-20181114odd.mshome.net
3 seconds idle
Mail last read 三 12月 19 20:43 2018 (CST)
No Plan.
如果要查询远程机上的用户信息,需要在用户名后面接@
主机名,采用用户名@
主机名的格式,不过要查询的网络主机需要运行finger守护进程的支持。
chfn用来改变finger命令显示的信息
chfn命令用来改变finger命令显示的信息。这些信息都存放在/etc目录里的passwd文件里。若不指定任何选项,则chfn命令会进入问答式界面。
Grammar
chfn(选项)(参数)
选项
-
-f<真实姓名>或--full-name<真实姓名>:设置真实姓名;
-
-h<家中电话>或--home-phone<家中电话>:设置家中的电话号码;
-
-o<办公地址>或--office<办公地址>:设置办公室的地址;
-
-p<办公电话>或--office-phone<办公电话>:设置办公室的电话号码;
-
-u或--help:在线帮助;
-
-v或-version:显示版本信息。
参数
用户名:指定要改变finger信息的用户名。
Living Example
范例1,改变finger信息:
[root@localhost Desktop]# chfn
Changing finger information for root.
Name [root]: jack
Office []: hn
Office Phone []: 888888
Home Phone []: 9999999
Finger information changed.
范例2,改变账号真实姓名:
[root@localhost Desktop]# chfn -f jack
Changing finger information for root.
Finger information changed.
范例3:
shell>> chfn
Changing finger information for user
Password: [del]
Name[]:linuxde ### 提供 finger 时的资料
Office[]:NCCU
Office Phone[]: [del]
Home Phone[]: [del]
===用户===
useradd 用于Linux中创建的新的系统用户
useradd命令用于Linux中创建的新的系统用户。useradd可用来建立用户帐号。帐号建好之后,再用passwd设定帐号的密码.而可用userdel删除帐号。使用useradd指令所建立的帐号,实际上是保存在/etc/passwd文本文件中。
在Slackware中,adduser指令是个script程序,利用交谈的方式取得输入的用户帐号资料,然后再交由真正建立帐号的useradd命令建立新用户,如此可方便管理员建立用户帐号。在Red Hat Linux中,adduser命令则是useradd命令的符号连接,两者实际上是同一个指令。
Grammar
useradd(选项)(参数)
选项
- -u
:指定用户idUID。 -
-g<群组>:指定用户所属的群组GID;
-
-G<群组>:指定用户所属的附加群组;
-
-c<备注>:加上备注文字。备注文字会保存在passwd的备注栏位中;(在创建用户是可以把重要的信息写入到备注信息里面(创建日期、用户的作用),后期可能会查看用户是什么时候创建的,这个是无法准备记录的 useradd -c `date +%Y/%m/%d` username)
-
-d<登入目录>:指定用户登入时的家目录;
-
-s
:指定用户登入后所使用的shell;/sbin/nologin /bin/false /bin/bash /bin/sh - -e<有效期限>:指定帐号的失效时间; 格式:2020-12-12
- -f<缓冲天数>:指定在密码过期后多少天即关闭该帐号;
-
-M:不要自动建立用户家目录;(默认是要创建用户家目录的)
-
-D:指定一个默认的属性值;
-
-r:建立系统帐号;
-
-m:自动建立用户的家目录(默认会创建家目录);
-
-n:取消建立以用户名称为名的群组;
参数
用户名:要创建的用户名。
Living Example
[root@CentOS6 home]# usermod -f 9 20181231test -f指的就是这个9
[root@CentOS6 home]# passwd -S 20181231test
20181231test PS 2018-12-31 0 99999 7 9 (密码已设置,使用 SHA512 加密。)
[root@CentOS6 ~]# useradd -u 1558 -g webadmin -G sys,root -s /bin/bash -c "market lisi" -e 2012-12-12 jack
-----------------------------------------------------------------------------------------
[root@test /]# useradd -d /tmp/test -c "This is test" -s /sbin/nolog -g peng -u 500 -G yy test
test:x:500:1000:This is test:/tmp/test:/sbin/nolog
-----------------------------------------------------------------------------------------
[root@test-6 ~]# useradd -D -s /bin/sh
[root@test-6 ~]# cat /etc/default/useradd
# useradd defaults file
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/sh
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
注意:使用-D选项指定默认参数时,实际上可以直接改配置文件/etc/default/useradd
-----------------------------------------------------------------------------------------
新建用户加入组:
useradd –g sales jack –G company,employees //-g:加入主要组、-G:加入次要组
建立一个新用户账户,并设置ID:
useradd caojh -u 544
需要说明的是,设定ID值时尽量要大于500,以免冲突。因为Linux安装后会建立一些特殊用户,一般0到499之间的值留给bin、mail这样的系统账号。
[root@CentOS6 ~]# useradd lisi 添加创建了一用户lisi
[root@CentOS6 ~]# passwd lisi 设置lisi的密码
更改用户 lisi 的密码 。 这里输入密码
新的 密码:
无效的密码: 它没有包含足够的不同字符
无效的密码: 是回文
重新输入新的 密码: 再次确认密码
passwd: 所有的身份验证令牌已经成功更新。
-----------------------------------------------------------------------------------------
上面这种是不被推荐的一种创建用户的方式,任何的用户都应该属于某个组。创建这样的“散人”实际中没有太大意义。
[root@CentOS6 ~]# grep "lisi" /etc/passwd --col
lisi:x:501:501::/home/lisi:/bin/bash
从上面信息中看到,系统默认为我们创建了一个lisi的组,组ID为501
上面是铺垫,下面才是重点。。
思考:在上一节中,我们提到,存放用户密码的文件shadow只有root用户才可操作。那么普通用户为什么可以修改密码呢
==================setUID==========================
这里引出一个东东----setUID
定义:当一个可执行程序具有setUID权限,用户执行这个程序时,将以这个程序所有者的身份执行。
哈哈!小狼不能和小羊谈朋友,小羊可以与小羊谈朋友,于是,小狼披上了羊的外衣,然后以羊的身份和小羊一起幸福的生活。吼吼。
其实,用户执行的这个程序就是命令,passwd命令授权了SetUID权限。所以普通用户也可以通过passwd命令改密码。
下面来做个试验!!很有意思的噢,要不要也来试试噢?
切换到lisi用户下面。
[lisi@localhost ~]$ touch file01 touch创建一个file01的文件
[lisi@localhost ~]$ ls -l file01
-rw-rw-r-- 1 lisi lisi 0 5月 5 22:14 file01
我们看到,这个时候用touch命令创建的文件,所有者是lisi,所属于组是lisi组
切换到root下面
[root@localhost ~]# ls -l /bin/touch
-rwxr-xr-x 1 root root 38056 2009-07-03 /bin/touch
细心朋友会发现权限前面还多一位。没错!setUID就属于这一位。
setUID=4
现在我们给touch命令授予个setUID授予setUID权限有两种方式。
[root@localhost ~]# chmod u+s /bin/touch
[root@localhost ~]# chmod 4755 /bin/touch
关于用户权限不理解的看我之前的相关文章。
再次切换到lisi目录下
[lisi@localhost ~]$ touch file02 创建文件file02
[lisi@localhost ~]$ ls -l file02
-rw-rw-r-- 1 root lisi 0 5月 5 22:35 file02
这次我们发现,同样的一个命令touch ,这次创建出来的文件所有者变成的root
去掉setUID权限的两种方式:
[root@localhost ~]# chmod u-s /bin/touch
[root@localhost ~]# chmod 755 /bin/touch
========================setGID=====================
setGID的用法与setUID的用法一起,它是添加组权限的。
setGID=2
添加setGID的方式如下:
[root@localhost ~]# chmod g+s /bin/touch
[root@localhost ~]# chmod 2755 /bin/touch
一般的命令我们不能随便授予setUID权限假如给vi命令授予setUID命令,无疑于给linux留了个后面,那样我们就可以通过vi命令修改用户与密码信息文件了。
那么到底有哪些命令设置有setUID呢?我们可以查找一下。
[root@localhost ~]# find / -perm -4000 -o -perm -2000
在当前目录下(/)查找具有setUID(-perm -4000)或者(-o)具有
setGID(-perm -2000)权限的命令
======================粘着位====================
粘着位有什么作用,我们来看一个例子,这样更容易理解。。
[root@localhost test]# mkdir abc 创建一个目录abc
[root@localhost test]# touch abc/newfile 在这个目录下创建一个文件newfile
[root@localhost test]# chmod 777 abc 对这个目录设置权限为所有人都有所有权限
[root@localhost test]# ls -ld abc
drwxrwxrwx 2 root root 4096 5月 5 23:44 abc
[root@localhost test]# ls -l abc/newfile newfile文件的权限是其它人没有删改的权限。
-rw-r--r-- 1 root root 0 5月 5 23:44 abc/newfile
切换到lisi用户
[lisi@localhost test]$ rm -rf abc
具然把abc目录下面的newfile干掉了,lisi用户虽然有对abc目录的所有权限,但对newfile文件没有删除权限呀。这就是linux对文件的权限规定。
假如张三和李四对一个文件夹都有所有权,这个文件夹下放的有张三的文件,也有李四的文件,如果张三看李四的文件不爽,那么他就直接干掉了,李四上去一看哭了。为什么办法让李四不哭呢?这里就用到粘着位了。
粘着位
粘着位=1
t,如果一个权限为777目录有粘着位,每个用户都可以在这个目录下创建文件,但只能删除自己是所有者的文件。
粘着位的授权方式:
[root@localhost test]# chmod o+t abc
[root@localhost test]# chmod 1755 abc
我们再来删除试试:
[lisi@localhost abc]$ rm newfile
rm:是否删除有写保护的一般空文件‘newfile’? y
rm: 无法删除‘newfile’: 权限不够
自己创建的文件就可以删除噢!
[root@localhost test]# touch newfile2
[root@localhost test]# rm newfile2
rm:是否删除一般空文件‘newfile2’? y
用户组权限Living Example
先直接抛一个需求出来吧!先步骤完成了,后面再分析。
授权用户 chongshi 和 bugmaster 对目录/cnblogs有写权限
创建目录
[root@localhost hzh]# mkdir /cnblogs 创建目录
[root@bogon hzh]# ls -ld /cnblogs 查看目录
drwxr-xr-x 2 root root 4096 5月 10 23:20 /cnblogs
添加两个用户并设置密码
[root@bogon hzh]# useradd chongshi 创建用户
[root@bogon hzh]# passwd chongshi 设置密码
Changing password for user chongshi.
New UNIX password:
BAD PASSWORD: it is based on a dictionary word
Retype new UNIX password:
passwd: all authentication tokens updated successfully.
[root@bogon hzh]# useradd bugmaster
[root@bogon hzh]# passwd bugmaster
Changing password for user bugmaster.
New UNIX password:
BAD PASSWORD: it is based on a dictionary word
Retype new UNIX password:
passwd: all authentication tokens updated successfully.
添加一个组
[root@bogon hzh]# groupadd testing 创建组
[root@bogon hzh]# grep testing /etc/group 查看组信息
testing:x:506:
将用户添加到组中
[root@bogon hzh]# usermod -G testing chongshi 用户chongshi添加到组testing
[root@bogon hzh]# gpasswd -a bugmaster testing 用户bugmaster添加到组testing
Adding user bugmaster to group testing
注意:上面两种方式不同,但作用是一样的,都是将用户添加到组中。
[root@bogon hzh]# grep testing /etc/group 查看组中成员
testing:x:506:chongshi,bugmaster
我们知道,组有什么样的权限,组中成员也有什么样的权限。
设置cnblogs目录的所属组为testing
[root@bogon hzh]# chgrp testing /cnblogs 将/cnblogs目录的所属组改为testing
[root@bogon hzh]# ls -ld /cnblogs 查看目录所属组
drwxr-xr-x 2 root testing 4096 5月 10 23:20 /cnblogs
对组加写权限
[root@bogon hzh]# chmod g+w /cnblogs 对组加写权限
[root@bogon hzh]# ls -ld /cnblogs 查看组对目录的权限
drwxrwxr-x 2 root testing 4096 5月 10 23:20 /cnblogs
现在用户chongshi和bugmaster已经对/cnbogs已经有写权限
[root@bogon hzh]# su -- chongshi 切换用户
[chongshi@bogon hzh]$ touch /cnblogs/abc 创建文件,(可以成功在目录下创建文件,说明对本目录具有写权限)
[root@CentOS6 ~]# groupadd webadmin
[root@CentOS6 ~]# useradd -u 1888 -g webadmin -G sys,root -s /bin/bash -c "market lisi" -e 2020-12-12 jack
passwd 用于设置用户的认证信息,包括用户密码、密码过期时间等
passwd命令用于设置用户的认证信息,包括用户密码、密码过期时间等。系统管理者则能用它管理系统用户的密码。只有管理者可以指定用户名称,一般用户只能变更自己的密码。
Grammar
passwd UserName (仅root才能使用)
passwd(Option)(参数)
选项
-
-d:删除密码,仅有系统管理者才能使用;
-
-l:锁住密码;
-
-u:解开已上锁的帐号。
-
--stdin:使用标准输入重新获取密码
-
-S:列出密码的相关信息,仅有系统管理者才能使用;用户密码状态;
passwd -S username
- -e:将用户密码设置失效
- -n:指定密码最小使用期限
- -x:设置密码最大的使用期限
-
-w:设置密码失效警告时间
-
-i:设置密码的非活动期限
-
-f:强制执行;
-
-k:设置只有在密码过期失效后,方能更新; (还不知道怎么用)
参数
用户名:需要设置密码的用户名。
Living Example
如果是普通用户执行passwd只能修改自己的密码。如果新建用户后,要为新用户创建密码,则用passwd用户名,注意要以root用户的权限来创建。
[root@localhost ~]# passwd linuxde //更改或创建linuxde用户的密码;
Changing password for user linuxde.
New UNIX password: //请输入新密码;
Retype new UNIX password: //再输入一次;
passwd: all authentication tokens updated successfully. //成功;
--stdin非交互式修改密码:
[root@test-6 ~]# echo "123456" | passwd --stdin peng
更改用户 peng 的密码 。
passwd: 所有的身份验证令牌已经成功更新。
普通用户如果想更改自己的密码,直接运行passwd即可,比如当前操作的用户是linuxde。
[linuxde@localhost ~]$ passwd
Changing password for user linuxde. //更改linuxde用户的密码;
(current) UNIX password: //请输入当前密码;
New UNIX password: //请输入新密码;
Retype new UNIX password: //确认新密码;
passwd: all authentication tokens updated successfully. //更改成功;
比如我们让某个用户不能修改密码,可以用-l选项来锁定:
[root@localhost ~]# passwd -l linuxde //锁定用户linuxde不能更改密码;
Locking password for user linuxde.
passwd: Success //锁定成功;
[linuxde@localhost ~]# su linuxde //通过su切换到linuxde用户;
[linuxde@localhost ~]$ passwd //linuxde来更改密码;
Changing password for user linuxde.
Changing password for linuxde
(current) UNIX password: //输入linuxde的当前密码;
passwd: Authentication token manipulation error //失败,不能更改密码;
再来一例:
[root@CentOS6 ~]# passwd -S 20181231test (没有删除密码的情况下)
20181231test PS 2018-12-31 0 99999 7 9 (密码已设置,使用 SHA512 加密。)
[root@localhost ~]# passwd -d linuxde //清除linuxde用户密码;
Removing password for user linuxde.
passwd: Success //清除成功;
[root@localhost ~]# passwd -S linuxde //查询linuxde用户密码状态;
Empty password. //空密码,也就是没有密码;
[root@CentOS6 ~]# passwd -S 20181231test
20181231test NP 2018-12-31 0 99999 7 9 (密码为空。)
注意:当我们清除一个用户的密码时,登录时就无需密码,这一点要加以注意。
禁用原理:
[root@bogon /]# grep fnngj /etc/shadow
fnngj:$1$EudBseaZ$kw1S8ZS2dsvnJ83phhvQF0:15456:0:99999:7:::
[root@bogon /]# passwd -l fnngj
Locking password for user fnngj.
passwd: Success
[root@bogon /]# grep fnngj /etc/shadow
fnngj:!!$1$EudBseaZ$kw1S8ZS2dsvnJ83phhvQF0:15456:0:99999:7:::
看到上面的操作,相信你已经明白了,当我禁用你的密码后,密码在shadwo文件中依然存在,只是前面多了两个叹号(!!
),这样你肯定登录不了了,因为验证端改变了密码。当然,解锁之后,密码前面的两个叹号会去掉。
其实,我们知道了原理以后,完全可以不用通过命令,通过vi编辑文件,一样可以禁用用户。
usermod 用于修改用户的基本信息
usermod命令用于修改用户的基本信息。
usermod命令不允许你改变正在线上的使用者帐号名称。当usermod命令用来改变user id,必须确认这名user没在电脑上执行任何程序。你需手动更改使用者的crontab档。也需手动更改使用者的at工作档。采用NIS server须在server上更动相关的NIS设定。
Grammar
usermod Option [组名] [用户名]
usermod(Option)(参数)
选项
-
-u
:修改用户ID; -
-c<备注>:修改用户帐号的备注文字;
-
-d<登入目录>:修改用户的家目录;(这个选项,必须之前那个位置有那个目录才行)
-
-e<有效期限>:修改帐号的有效期限; (格式YYYY-MM-DD 2018-12-29)
-
-f<缓冲天数>:修改在密码过期后多少天即关闭该帐号;
usermod -f 7 123
- -g<群组>:修改用户所属的组id;
-
-a|--append ##把用户追加到某些组中,仅与-G选项一起使用
-
-G<群组>;修改用户所属的附加群组,仅与-a选项一起使用;
usermod -G [组名] [用户名]
- -l<帐号名称>:修改用户帐号名称;
usermod -l [新用户名] [旧用户名]
- -L:锁定用户密码,使密码无效;
-
-U:解除密码锁定。
-
-s
:修改用户登入后所使用的shell; -
-a:追加一个新的附加组,如果原来有组则直接覆盖
参数
登录名:指定要修改信息的用户登录名。
Living Example
将newuser2添加到组staff中:
usermod -G staff newuser2
修改newuser的用户名为newuser1:
usermod -l newuser1 newuser
锁定账号newuser1:
usermod -L newuser1
解除对newuser1的锁定:
usermod -U newuser1
[root@test ~]# usermod -l 123 q 改账号名称
usermod: user q is currently used by process 2212
[root@test ~]# usermod -d /home/123 123 改账号的家目录
[root@test ~]# usermod -c 321 123 改备注信息
[root@test ~]# finger 123
Login: 123 Name: 321
Directory: /home/123 Shell: /bin/bash
Last login 四 12月 27 10:44 (CST) on pts/0
No mail.
No Plan.
[root@test ~]# usermod -e 2018-12-29 123 改账号的有效期限
[root@test ~]# usermod -f 7 123 账号过期后7天即关闭该帐号
[root@test ~]# passwd -S 123
123 PS 2018-12-27 0 99999 7 7 (密码已设置,使用 SHA512 算法。)
chpasswd 是批量更新用户口令的工具
chpasswd命令是批量更新用户口令的工具,是把一个文件内容重新定向添加到/etc/shadow中。用户必须是存在的
Grammar
chpasswd (选项)
选项
-
-e:输入的密码是加密后的密文;
-
-h:显示帮助信息并退出;
-
-m:当被支持的密码未被加密时,使用MD5加密代替DES加密。
Living Example
第一种:创建对应文件,然后重定向
先创建用户密码对应文件,格式为username:password
,如abc:abc123
,必须以这种格式来书写,并且不能有空行,保存成文本文件user.txt,然后执行chpasswd命令:
chpasswd < user.txt
第二种:
[root@AAAA7 ~]# echo "username:passwd" | chpasswd
[root@test-6 ~]# echo "peng:123456" | chpasswd
chsh用来更换登录系统时使用的shell
chsh命令用来更换登录系统时使用的shell。若不指定任何参数与用户名称,则chsh会以应答的方式进行设置。
Grammar
chsh (选项) (参数)
选项
- -s
或--shell :更改系统预设的shell环境 -
-l或--list-shells:列出目前系统可用的shell清单;
-
-u或--help:在线帮助;
-
-v或-version:显示版本信息。
参数
用户名:要改变默认shell的用户。
Living Example
查看系统安装了哪些shell的两种方法:
第一种:
[rocrocket@localhost ~]$ chsh -l
/bin/sh
/bin/bash
/sbin/nologin
/bin/zsh
第二种:
[rocrocket@localhost ~]$ cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/bin/zsh
其实chsh -l也是来查看这个文件。
查看当前正在使用的shell:
[rocrocket@localhost ~]$ echo $SHELL
/bin/bash
注意SHELL一定要是大写。可以看到,目前使用的shell是/bin/bash
修改指定用户的shell:
[root@CentOS6 ~]# chsh -s /sbin/nologin 20181231test
Changing shell for 20181231test.
Shell changed.
[root@CentOS6 ~]# cat /etc/passwd | grep "20181231test"
20181231test:x:800:800:20181231chuangjian:/home/20181231:/sbin/nologin
把我的shell改成zsh:
[rocrocket@localhost ~]$ chsh -s /bin/zsh
Changing shell for rocrocket.
Password:
Shell changed.
使用chsh加选项-s就可以修改登录的shell了!你会发现你现在执行echo $SHELL
后仍然输出为/bin/bash,这是因为你需要重启你的shell才完全投入到zsh怀抱中去。chsh -s其实修改的就是/etc/passwd文件里和你的用户名相对应的那一行。现在来查看下:
[rocrocket@localhost ~]$ cat /etc/passwd|grep ^rocrocket
rocrocket:x:500:500:rocrocket,China:/rocrocket/PSB/home:/bin/zsh
你可以发现输出内容的最后部分已经变成了/bin/zsh了,下次重启的时候,linux就会读取这一命令来启动shell了!
把shell修改回/bin/bash:
[rocrocket@localhost ~]$ chsh -s /bin/bash
Changing shell for rocrocket.
Password:
Shell changed.
chage是用来修改帐号和密码的有效期限
chage命令是用来修改帐号和密码的有效期限。
Grammar
chage [选项] 用户名
选项
-
-d:上一次更改的日期。
-
-m:密码可更改的最小天数。为零时代表任何时候都可以更改密码。
-
-M:密码保持有效的最大天数。99999为永久
-
-W:用户密码到期前,提前收到警告信息的天数。
-
-E:修改帐号到期的日期。过了这天,此帐号将不可用。
-
-I:停滞时期。如果一个密码已过期这些天,那么此帐号将不可用。
-
-l:例出当前的设置。由非特权用户来确定他们的密码或帐号何时过期。chage -l username
Living Example
可以编辑/etc/login.defs
来设定几个参数,以后设置口令默认就按照参数设定为准:
PASS_MAX_DAYS 99999
PASS_MIN_DAYS 0
PASS_MIN_LEN 5
PASS_WARN_AGE 7
当然在/etc/default/useradd可以找到如下2个参数进行设置:
# useradd defaults file
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
通过修改配置文件,能对之后新建用户起作用,而目前系统已经存在的用户,则直接用chage来配置。
我的服务器root帐户密码策略信息如下:
[root@linuxde ~]# chage -l root
最近一次密码修改时间 : 3月 12, 2013
密码过期时间 :从不
密码失效时间 :从不 -I 或者usermod –f 日期
帐户过期时间 :从不 -E 或者usermod -e 日期
两次改变密码之间相距的最小天数 :0 -m
两次改变密码之间相距的最大天数 :99999 -M
在密码过期之前警告的天数 :7 -W
我可以通过如下命令修改我的密码过期时间:
[root@linuxde ~]# chage -M 60 root
[root@linuxde ~]# chage -l root
最近一次密码修改时间 : 3月 12, 2013
密码过期时间 : 5月 11, 2013
密码失效时间 :从不
帐户过期时间 :从不
两次改变密码之间相距的最小天数 :0
两次改变密码之间相距的最大天数 :60
在密码过期之前警告的天数 :9
然后通过如下命令设置密码失效时间:
[root@linuxde ~]# chage -I 5 root
[root@linuxde ~]# chage -l root
最近一次密码修改时间 : 3月 12, 2013
密码过期时间 : 5月 11, 2013
密码失效时间 : 5月 16, 2013
帐户过期时间 :从不
两次改变密码之间相距的最小天数 :0
两次改变密码之间相距的最大天数 :60
在密码过期之前警告的天数 :9
注意:从上述命令可以看到,修改两次改变密码之间相距的最大天数,就相当于是修改密码过期时间;在密码过期后5天,密码自动失效,这个用户将无法登陆系统了。
再来一个案例:
[root@localhost ~]# chage -M 90 test #密码有效期90天
[root@localhost ~]# chage -d 0 test #强制用户登陆时修改口令
[root@localhost ~]# chage -d 0 -m 0 -M 90 -W 15 test #强制用户下次登陆时修改密码,并且设置密码最低有效期0和最高有限期90,提前15天发警报提示
[root@localhost ~]# chage -E '2014-09-30' test # test这个账号的有效期是2014-09-30
userdel 用于删除给定的用户,以及与用户相关的文件
userdel命令用于删除给定的用户,以及与用户相关的文件。若不加选项,则仅删除用户帐号,而不删除相关文件。
Grammar
userdel (选项) (参数)
选项
-
-r:删除用户的同时,删除与用户相关的所有文件。userdel -r [用户名]
-
-f:强制删除用户,即使用户当前已登录;
参数
用户名:要删除的用户名。
Living Example
userdel命令很简单,比如我们现在有个用户linuxde,其家目录位于/var目录中,现在我们来删除这个用户:
userdel linuxde #删除用户linuxde,但不删除其家目录及文件;
userdel -r linuxde #删除用户linuxde,其家目录及文件一并删除;
请不要轻易用-r
选项;他会删除用户的同时删除用户所有的文件和目录,切记如果用户目录下有重要的文件,在删除前请备份。
其实也有最简单的办法,但这种办法有点不安全,也就是直接在/etc/passwd中删除您想要删除用户的记录;但最好不要这样做,/etc/passwd是极为重要的文件,可能您一不小心会操作失误。
手工删除:
使用find命令查找属于某个用户或用户组的文件
find选项 -user
、-uid
、-group
、-gid
- 对需要保留的文件进行移动和备份
- 对不需要的文件进行删除
- 清除用户文件中的相关表项
- 清除用户宿主目录
[root@bogon /]# find /home -user fnngj #可以对查找出来的用户信息判断需要干掉哪些。
/home/fnngj
/home/fnngj/.bashrc
/home/fnngj/.bash_profile
/home/fnngj/.gtkrc
/home/fnngj/.bash_history
/home/fnngj/.bash_logout
pwck 用来验证系统认证文件/etc/passwd和/etc/shadow的内容和格式的完整性
pwck命令用来验证系统认证文件/etc/passwd和/etc/shadow的内容和格式的完整性;直接输入命令,后面不用带参数
描述
pwck 命令检查用户及其认证信息的完整性。它检查 /etc/passwd 和 /etc/shadow
格式正确、数据有效。将会提示用户删除格式不正确或者有其它错误的项。
检查的项目有:
· 正确的字段数
· 一个唯一且有效的用户名
· 一个有效的用户和组标识符
· 有效的主组
· 有效的主目录
· 有效的登录 shell
当指定第二个文件参数或 /etc/shadow 在系统中存在时,启用 shadow 检查。
这些检查是:
· 每个密码项都有对应的影子相,反之亦然。
· 密码在影子化了的文件中指定
· 影子项有正确的字段数。
· 影子项在影子文件中是唯一的
· 最后一次的密码更改时间不是被设成了一个将来的时间。
The checks for correct number of fields and unique user name are fatal. If the entry has
the wrong number of fields, the user will be prompted to delete the entire line. If the
user does not answer affirmatively, all further checks are bypassed. An entry with a
duplicated user name is prompted for deletion, but the remaining checks will still be
made. All other errors are warning and the user is encouraged to run the usermod command
to correct the error.
操作 /etc/passwd 文件的这些命令不能警告损坏或重复的条目,这些情况下,应该使用 pwck
来移除这写有问题的条目。
Grammar
pwck(选项)(参数)
选项
-
-q:仅报告错误信息;
-
-s:以用户id排序文件"/etc/passwd"和"/etc/shadow";
- -r:只读方式运行指令。
参数
-
密码文件:指定密码文件的路径;
-
影子文件:指定影子文件的路径。
Living Example
pwck /etc/passwd
user 'lp': directory '/var/spool/lpd' does not exist
………………………………………………
user 'hplip': directory '/var/run/hplip' does not exist
pwck:无改变
vipw编辑/etc/passwd文件
vipw 编辑/etc/passwd文件
这个命令与vi最大的区别就是编辑的时候锁定文件。如果多人对passwd文件都有编辑权限,那么多人同时编辑就会造成混乱。使用vipw编辑passwd文件时,别人就无法打开passwd文件。
===组===
groups 指定用户所在组的组成员
groups命令在标准输入输出上输出指定用户所在组的组成员,每个用户属于/etc/passwd中指定的一个组和在/etc/group中指定的其他组。
Grammar
groups username
groups (选项) (参数)
选项
-
-help:显示命令的帮助信息;
-
--version:显示命令的版本信息。
参数
用户名:指定要打印所属工作组的用户名。
Living Example
#显示linux用户所属的组
groups linux
linux : linux adm dialout cdrom plugdev lpadmin admin sambashare
groupadd 用于创建一个新的工作组
groupadd命令用于创建一个新的工作组,新工作组的信息将被添加到系统文件中。
Grammar
groupadd [用户组名]
groupadd(Option)(参数)
选项
-
-g:指定新建工作组的id;
-
-r:创建系统工作组,系统工作组的组ID小于500; (ID小于500是版本6的)
-
-K:覆盖配置文件"/ect/login.defs";
-
-o:允许添加组ID号不唯一的工作组。
参数
组名:指定新建工作组的组名。
Living Example
建立一个新组,并设置组ID加入系统:
[root@AAAA7 ~]# groupadd -g 499 linuxde
此时在/etc/passwd文件中产生一个组ID(GID)是499的项目。
[root@AAAA7 ~]# grep linuxde /etc/group
linuxde:x:499:
# groupadd webadmin 添加一个组webadmin
[root@AAAA7 ~]# grep web /etc/group 查看组信息
webadmin:x:1001:
gpasswd 是Linux下工作组文件/etc/group和/etc/gshadow管理工具
Grammar
gpasswd -a user_name group_name
Usage: gpasswd [Option] GROUP
gpasswd(Option)(参数)
选项
-
-a:添加用户到组;
-
-d:从组删除用户;
-
-A:指定管理员;
-
-M:指定组成员和-A的用途差不多;
-
-r:删除密码;
-
-R:限制用户登入组,只有组中的成员才可以用newgrp加入该组。
-
-a:添加用户到组;
-
-d:从组删除用户;
-
-A:指定管理员;
-
-M:指定组成员和-A的用途差不多;
-
-r:删除密码;
-
-R:限制用户登入组,只有组中的成员才可以用newgrp加入该组。
Options:
-a, --add USER add USER to GROUP
-d, --delete USER remove USER from GROUP
-h, --help display this help message and exit
-r, --remove-password remove the GROUP's password
-R, --restrict restrict access to GROUP to its members
-M, --members USER,... set the list of members of GROUP
-A, --administrators ADMIN,...
set the list of administrators for GROUP
Except for the -A and -M Options, the Options cannot be combined.
参数
组:指定要管理的工作组。
Living Example
# gpasswd -a tom webadmin 添加用户到组
# gpasswd -d tom webadmin 把用户从组中删除
# gpasswd webadmin 给用户组设置密码
# gpasswd -A tom webadmin 将tom提升为组管理员
# gpasswd -r webadmin 删除组密码
# gpasswd -R webadmin 禁止其他用户切换到该组
注意:添加用户到某一个组 可以使用usermod -G group_name user_name
这个命令可以添加一个用户到指定的组,但是以前添加的组就会清空掉。
所以想要添加一个用户到一个组,同时保留以前添加的组时,请使用gpasswd这个命令来添加操作用户
groupmod 更改群组识别码或名称
groupmod命令更改群组识别码或名称。需要更改群组的识别码或名称时,可用groupmod指令来完成这项工作。
Grammar
groupmod(选项)(参数)
选项
- -n<新群组名称>:设置使用的群组名称。
groupmod -n [新组名] [旧组名]
- -g<群组识别码>:设置欲使用的群组识别码;
- -o:重复使用群组识别码;
参数
组名:指定要修改的工作的组名。
groupmod -n [新组名] [旧组名]
[root@AAAA7 ~]# groupmod -n apache webadmin 修改组名webadmin为apache
groupdel 用于删除指定的工作组
groupdel命令用于删除指定的工作组,本命令要修改的系统文件包括/ect/group和/ect/gshadow。若该群组中仍包括某些用户,则必须先删除这些用户后,方能删除群组。
Grammar
groupdel(参数)
参数
组:要删除的工作组名。
Living Example
[root@AAAA7 ~]# groupadd xxxxxxxxxx //创建xxxxxxxxxx工作组
[root@AAAA7 ~]# tail -5 /etc/group //查看这个工作组
aaaaa74:x:1000:
named:x:25:
linuxde:x:600:
apache:x:1001:
xxxxxxxxxx:x:1002:
[root@AAAA7 ~]# groupdel xxxxxxxxxx //删除这个工作组
vigr编辑/etc/group文件(锁定文件)
与vipw用法一样,在编辑group文件时,禁止其他人编辑。防止多人写操作,造成写混乱。
grpck用于验证组文件的完整性
grpck命令用于验证组文件的完整性,在验证之前,需要先锁定(lock)组文件/etc/group和/etc/shadow。
grpck命令检查数据是否正确存放,每条记录是否都包含足够的信息,是否有一个唯一的组名,是否包含正确的用户,是否正确设置了组的管理员等。grpck检查发现错误以后,在命令行提示用户是否删除错误的记录。如果用户没有明确回答删除记录,grpck终止运行。
Grammar
grpck(选项)
选项
-
-r:只读模式;
-
-s:排序组id。
Living Example
对组账号和影子文件进行验证:
grpck //必须以管理员身份运行
[root@AAAA7 ~]# grpck /etc/group /etc/gshadow
[root@AAAA7 ~]# //后面两句一样,如果没有输出信息,则表示没有错误。
===============================================================================
测试错误的Living Example:
echo check_user:x: >> /etc/group //添加一行错误的格式数据
cat /etc/group | grep check_user
check_user:x: //这儿GID字段为空,是错误的。
grpck /etc/group
invalid group file entry
delete line 'check_user:x:'? y //提示是否删除
grpck: the files have been updated //这时已经删除了错误的行,提示文件已经更新。
cat /etc/group | grep check_user //没有查到,已经删除了。
getent用于获取指定数据库中的条目
getent
命令用于获取指定数据库中的条目。它可以从系统的各种数据库(如 passwd、group、hosts、services 等)中检索信息。常见的用途之一是在 Linux 系统中查看用户和组的信息。
使用以下语法来运行 getent 命令:
getent database entry
其中 database
是要查询的数据库名称,可以是以下之一:passwd、group、hosts、services等。
entry
则是要查询的具体条目的名称或标识符。具体的语法和可接受的值将取决于所查询的数据库。
以下是一些常见的示例:
- 查看所有用户的列表:
getent passwd
- 查看特定用户的详细信息:
getent passwd username
将 username
替换为你要查询的用户名。
- 查看所有用户组的列表:
getent group
- 查看特定用户组的详细信息:
getent group groupname
将 groupname
替换为你要查询的用户组名。
- 查看某个主机的 IP 地址:
getent hosts hostname
将 hostname
替换为你要查询的主机名。
通过使用合适的数据库和条目参数,你可以在 Linux 系统上使用 getent
命令来获取各种不同的信息。请注意,某些操作可能需要超级用户权限(root)。可以通过 man getent
命令查看更详细的文档和选项说明。
===查看用户登录信息===
last 用于显示用户最近登录信息
last命令用于显示用户最近登录信息。单独执行last命令,它会读取/var/log/wtmp的文件,并把该给文件的内容记录的登入系统的用户名单全部显示出来。
Grammar
last(选项)(参数)
选项
-
-a:把从何处登入系统的主机名称或ip地址,显示在最后一行;
-
-d:将IP地址转换成主机名称;
-
-f <记录文件>:指定记录文件。
-
-n <显示列数>或-<显示列数>:设置列出名单的显示列数;
-
-R:不显示登入系统的主机名称或IP地址;
-
-x:显示系统关机,重新开机,以及执行等级的改变等信息。
参数
-
用户名:显示用户登录列表;
-
终端:显示从指定终端的登录列表。
Living Example
last命令用了显示用户登录情况,以下是直接显示固定行数的记录:
[root@test-6 peng]# last -10
root pts/1 192.168.211.2 Wed Dec 19 18:01 still logged in
root pts/2 192.168.211.2 Wed Dec 19 17:50 still logged in
root pts/1 192.168.211.2 Wed Dec 19 17:50 - 17:51 (00:01)
root pts/1 192.168.211.2 Wed Dec 19 17:47 - 17:47 (00:00)
root pts/2 192.168.211.2 Wed Dec 19 17:38 - 17:38 (00:00)
root pts/2 192.168.211.2 Wed Dec 19 17:12 - 17:13 (00:00)
root pts/1 192.168.211.2 Wed Dec 19 17:12 - 17:43 (00:30)
root pts/0 :0.0 Wed Dec 19 17:12 still logged in
root pts/0 192.168.211.2 Wed Dec 19 17:06 - 17:06 (00:00)
root pts/0 192.168.211.2 Wed Dec 19 17:05 - 17:05 (00:00)
lastb命令
Linux lastb命令用于列出登入系统失败的用户相关信息。
单独执行lastb指令,它会读取位于/var/log目录下,名称为btmp的文件,并把该文件内容
记录的登入失败的用户名单,全部显示出来
参数说明:
- -a 把从何处登入系统的主机名称或IP地址显示在最后一行。
- -d 将IP地址转换成主机名称。
- -f<记录文件> 指定记录文件。
- -n<显示列数>或-<显示列数> 设置列出名单的显示列数。
- -R 不显示登入系统的主机名称或IP地址。
- -x 显示系统关机,重新开机,以及执行等级的改变等信息
lastlog 用于显示系统中所有用户最近一次登录信息。
lastlog命令用于显示系统中所有用户最近一次登录信息。
lastlog文件在每次有用户登录时被查询。可以使用lastlog命令检查某特定用户上次登录的时间,并格式化输出上次登录日志/var/log/lastlog的内容。它根据UID排序显示登录名、端口号(tty)和上次登录时间。如果一个用户从未登录过,lastlog显示**Never logged**
。注意需要以root身份运行该命令。
Grammar
lastlog(选项)
选项
-
-b<天数>:显示指定天数前的登录信息;
-
-h:显示召集令的帮助信息;
-
-t<天数>:显示指定天数以来的登录信息;
-
-u<用户名>:显示指定用户的最近登录信息。
Living Example
[root@test-6 peng]# lastlog
#用户名 端口 来自 最后登陆时间
Username Port From Latest
root pts/1 192.168.211.2 三 12月 19 18:01:07 +0800 2018
bin **从未登录过**
daemon **从未登录过**
…………………中间省略……………………………………
sshd **从未登录过**
tcpdump **从未登录过**
newusers 用于批处理的方式一次创建多个命令
newusers命令用于批处理的方式一次创建多个命令。
Grammar
newusers(参数)
参数
用户文件:指定包含用户信息的文本文件,文件的格式要与/etc/passwd相同。
Living Example
实用newusers命令批量添加用户:
用法很简单,newusers后面直接跟一个文件,文件格式和/etc/passwd的格式相同。
用户名1:x:UID:GID:用户说明:用户的家目录:所用SHELL
举例:
jingang0:x:520:520::/home/jingang0:/sbin/nologin
jingang1:x:521:521::/home/jingang1:/sbin/nologin
......
值得一提的是关于SHELL类型,查看主机上所有SHELL,可以通过chsh来查看:
[root@localhost beinan]# chsh --list
/bin/sh
/bin/bash
/sbin/nologin
/bin/ksh
/bin/tcsh
/bin/csh
/bin/zsh
其中除了/sbin/nologin,其它类型的SHELL都能登录系统,nologin大多是虚拟用户用的SHELL,也就是说虽然他是系统用户,但他并无登录系统的权限;如果您想添加这类用户,就把他的SHELL设置成/sbin/nologin,比如上面的例子。
关于用户名、UID、GID及用户的家目录是怎么回事,您可以读相应的参考文档。
Living Example:总结怎么查看用户创建的时间
前言
你知道吗,如何在 Linux系统上查看帐户的创建日期?如果知道,那么有些什么办法。
你成功了么?如果是的话,该怎么做?
基本上 Linux 系统不会跟踪这些信息,因此,获取这些信息的替代方法是什么?
你可能会问为什么我要查看这个?
是的,在某些情况下,你可能需要查看这些信息,那时就会对你会有帮助。
可以使用以下 7 种方法进行验证:
-
使用
/var/log/secure
-
使用
aureport
工具 -
使用
.bash_logout
-
使用
chage
命令 -
使用
useradd
命令 -
使用
passwd
命令 -
使用
last
命令
方式 1:使用 /var/log/secure
它存储所有安全相关的消息,包括身份验证失败和授权特权。它还会通过系统安全守护进程跟踪sudo 登录、SSH 登录和其他错误记录。
# grep prakash /var/log/secure
Apr 12 04:07:18 centos.2daygeek.com useradd[21263]: new group: name=prakash, GID=501
Apr 12 04:07:18 centos.2daygeek.com useradd[21263]: new user: name=prakash, UID=501, GID=501, home=/home/prakash, shell=/bin/bash
Apr 12 04:07:34 centos.2daygeek.com passwd: pam_unix(passwd:chauthtok): password changed for prakash
y (uid=0)
方式 2:使用 aureport 工具
aureport工具可以根据记录在审计日志中的事件记录生成汇总和柱状报告。默认情况下,它会查询/var/log/audit/ 目录中的所有audit.log
文件来创建报告。
# aureport --auth | grep prakash
46. 04/12/2018 04:08:32 prakash 103.5.134.167 ssh /usr/sbin/sshd yes 288
47. 04/12/2018 04:08:32 prakash 103.5.134.167 ssh /usr/sbin/sshd yes 291
方式 3:使用 .bash_logout
家目录中的.bash_logout
对 bash有特殊的含义,它提供了一种在用户退出系统时执行命令的方式。
我们可以查看用户家目录中.bash_logout
的更改日期。该文件是在用户第一次注销时创建的。
# aureport --auth | grep prakash
46. 04/12/2018 04:08:32 prakash 103.5.134.167 ssh /usr/sbin/sshd yes 288
47. 04/12/2018 04:08:32 prakash 103.5.134.167 ssh /usr/sbin/sshd yes 291
或者直接查看家目录的时间(前提是在创建用户之前创建了家目录)
ls -l /home/test/
方式 4:使用 chage 命令
chage 意即 "change age"。该命令让用户管理密码过期信息。chage命令可以修改上次密码更改日期后需要更改密码的天数。
系统使用此信息来确定用户何时必须更改其密码。如果用户自帐户创建日期以来没有更改密码,这个就有用
# chage --list prakash
Last password change : Apr 12, 2018
Password expires : never
Password inactive : never
Account expires : never
Minimum number of days between password change : 0
Maximum number of days between password change : 99999
Number of days of warning before password expires : 7
方式 5:使用 useradd 命令
useradd 命令用于在 Linux中创建新帐户。默认情况下,它不会添加用户创建日期,我们必须使用 "备注"选项添加日期
# useradd -m prakash -c `date +%Y/%m/%d`
# grep prakash /etc/passwd
prakash:x:501:501:2018/04/12:/home/prakash:/bin/bash
方式 6:使用 passwd 命令
passwd 命令用于将密码分配给本地帐户或用户。如果用户在帐户创建后没有修改密码,那么可以使用passwd 命令查看最后一次密码修改的日期
# passwd -S prakash
prakash PS 2018-04-11 0 99999 7 -1 (Password set, MD5 crypt.)
方式 7:使用 last 命令
last 命令读取/var/log/wtmp,并显示自该文件创建以来所有登录(和退出)用户的列表
# last | grep "prakash"
prakash pts/2 103.5.134.167 Thu Apr 12 04:08 still logged in
免责声明: 本文部分内容转自网络文章,转载此文章仅为个人收藏,分享知识,如有侵权,请联系博主进行删除。