shell脚本中实现自动判断用户有无密码

在最近完成老师布置的作业的时候遇到了如何让shell脚本中的命令自动判断一个用户是否已设置密码的问题,虽然看似不是很难的一个问题,但是在这一功能实现的过程中却包含了许多细小的而重要的知识。刚开始小编对此很是头疼,虽然我们查看一个用户是否有密码并不是很难,直接cat /etc/shadow这个文件看看密码位是否有加密的字符就行了,但是让命令自己去判断和匹配就不是很顺利了,小编上网查看后,并没有得到很好的答案,大多数都是人工查看的答案,并不适用于shell脚本中自动的判断,所以在认真对比/etc/passwd/etc/shadow 这两个文件之后,又结合自己的想法,实现了这个自动判断的功能,接下来小编将我这一过程实现中遇到的问题和扩展的知识,罗列出来,以便于给像小编一样没有在网上找到合适答案的童鞋们参考,本文纯属个人思考产物,如有更好方法,请赐教。

我们知道用户的密码是存储到/etc/passwd/etc/shadow这两个文件中的,为什么这么说呢?因为当系统开启了用户的投影密码后,才会把密码映射到shadow这个文件中,如果没有开启投影密码,则用户的密码是保存在passwd 这个文件中的,为了提高系统的安全性,一般这个功能是默认开启的,但是我们可以手动将其关闭:pwconv开启投影密码,pwunconv关闭投影密码。

为了接下来的命令实现,小编在这里将passwd文件和shadow文件的关系进行图形化的详细分析,以便小伙伴们能看懂:

如果没有开启影子密码功能,则不会存在shadow这个文件,密码就被保存在了passwd文件的密码位上,此时,创建的用户一直都没有设置密码的情况下,该密码位是两个!!符号,如果用户的密码通过passwd -d username 这个命令给清空的话,该密码位上没有任何东西。

如果开启了影子密码功能,passwd中密码位的密码将会投射到shadow中,同样,如果用户还没设置过密码,则密码位为两个!!符号,如果用户的密码通过passwd -d username 清空了的话,在shadow的密码位上为空。

有图有真相:

存在上述的两种情况啊!针对shell脚本而言,编写的脚本要有较高的准确性和可移植性,所以命令的执行一定要有绝对的把握,如果我们定义查看匹配shadow文件,那如果有的主机上没有开启影子密码功能,那么找不到shadow这个文件,命令的执行结果就不对了,所以为了保证命令的绝对性,小编采用如下思想:

不管系统有没有开启影子投射功能,我们在进行筛选判断之前,先执行pwconv命令开启影子密码功能。这样一来,我们就完全的确定了密码存在于shadow文件中,我们就可以针对shadow文件进行一些操作。

没有密码的情况有两种,一种是密码位为空,一种是密码位一个!或!!,一个!是因为该用户被锁定了。如果用户有密码的情况是密码位为:“$加密方式编号$salt$密码位” 所以我们可以将密码位的参数提取出来运用正则表达式进行对比,如果不是“$加密方式编号$salt$密码位”形式的参数,就说明该用户没有密码。

开启影子密码的命令为:pwconv

提取shadow文件中密码位参数的命令为:getent shadow |grep ^username |cut -d: -f2

这里有图:

这里截取的是一个用户的密码位。

将取出的参数进行匹配,判断出是否有密码:[[ "$(pwconv ;getent shadow |grep ^username |cut -d: -f2)" =~ ^‘$‘.* ]] && echo true || echo false

该命令中使用到了:

$( ):调用括号中的命令执行的结果

[[ ]]:条件测试,可以进行条件测试的还有 [ ],但是我们使用到了扩展正则表达式,而[ ]不支持引用正则表达式,所以我们使用双引号的条件测试符。

=~:该符号是进行字符串的测试,含义为:左侧字符串是否能够被右侧的PATTERN所匹配。

&&:根据退出状态而定,命令可以有条件地运行,代表条件性的AND THEN ,根据前一条命令的返回值来判断,返回值为真(0),则执行自身后面的命令。

||:代表条件性的OR ELSE,若前一条命令的返回值为假(非0),则执行自身后面的命令。

命令执行的结果为:(两种结果展示)

我们可以可以将用户名设置为一个变量,通过传递的用户名参数,实现指定用户的查看,将这个方法用户在shell脚本中,就可以进行有条件的判断了。嘻嘻~

才学疏浅,如有不足请多多指点,如有你发现了更好的办法,记得告诉小编哦!

时间: 2024-10-05 05:32:15

shell脚本中实现自动判断用户有无密码的相关文章

Shell脚本中判断输入参数个数的方法投稿:junjie 字体:[增加 减小] 类型:转载

Shell脚本中判断输入参数个数的方法 投稿:junjie 字体:[增加 减小] 类型:转载 这篇文章主要介绍了Shell脚本中判断输入参数个数的方法,使用内置变量$#即可实现判断输入了多少个参数,需要的朋友可以参考下 $#代表了命令行的参数数量,可以看以下实例: 复制代码 代码如下: if [ $# != 1 ] ; then echo "USAGE: $0 TABNAME" echo " e.g.: $0 CDR_CALL_20040701" exit 1; f

shell脚本中的逻辑判断,文件目录属性判断,if特殊用法,case语句

笔记内容: 20.5 shell脚本中的逻辑判断 20.6 文件目录属性判断 20.7 if特殊用法 20.8/20.9 case判断 笔记日期:2017-11-22 20.5 shell脚本中的逻辑判断 在所有的编程语言中都会有if语句来进行逻辑判断,所以在shell中也不例外. Shell的if语句的判断条件和其他编程语言一样写在if关键字的那一行,但是需要使用方括号括起来,并且变量和逻辑运算符以及方括号都要用空格隔开,这一点和其他的编程语言不一样,整个if语句块以fi关键字表示结尾,the

20.5 shell脚本中的逻辑判断 20.6 文件目录属性判断 20.7 if特殊用法 20.8/20.9 case判断

- 20.5 shell脚本中的逻辑判断 - 20.6 文件目录属性判断 - 20.7 if特殊用法 - 20.8/20.9 case判断 # 20.5 Shell脚本中的逻辑判断 - 很多脚本可以直接用命令执行,比如之前的那个 ``` [[email protected] ~]# for i in `seq 1 5`;do echo $i;done 1 2 3 4 5 [[email protected] ~]# for i in `seq 1 5` > do > echo $i > 

shell脚本中的逻辑判断 文件目录属性判断 if特殊用法 case判断

一.shell脚本中的逻辑判断在shell脚本中,很多都会逻辑判断,判断某一个数值,判断某一个文件,或者某一个目录,我们针对判断结果再做一些操作,如果没有判断,就没法做一些操作格式1:if条件:then语句:fi例子:[[email protected] ~]# if [ $a -ge 3 ] //分行写就是这样写 thenecho okfiok[[email protected] ~]# if [ $a -ge 3 ]; then echo ok; fi //这是一行写的格式//解释:-gt表

shell脚本中的逻辑判断、文件目录属性判断、if特殊用法、case判断

一.shell脚本中的逻辑判断 语法1.格式1if 条件 ; then 语句; fi例:如果a大于3,打印OK [[email protected] ~]# vi 2.sh [[email protected] ~]# bash -v 2.sh #!/bin/bash a=5 if [ $a -gt 3 ] then echo ok fi ok [[email protected] ~]# bash 2.sh ok [[email protected] ~]# 2.格式2if 条件; then

shell脚本中的逻辑判断、文件目录属性判断、 if特殊用法、case判断

shell脚本中的逻辑判断 shell脚本中很多都是逻辑判断,判断某个数值,判断某一个文件,或者某个目录,最后真对判断的某个结果再去做一些操作,在shll脚本中到处都是逻辑判断,如果没有判断就没有办法去做一些操作,不然只能敲命令了, shell中逻辑判断的语法 最常见的语法 :if 条件 ; then 语句; fi 他的格式比较特殊if和fi是相对的,正好对应的,then是if怎么样然后怎么样,这个语法读起来是如果怎么样然后怎么样 如果a的值大于3软后怎么样 [[email protected]

20.5 Shell脚本中的逻辑判断;20.6 文件目录属性判断;20.7 if特殊用法;20.8 20.9 cace判断(上下)

扩展: select用法 http://www.apelearn.com/bbs/thread-7950-1-1.html 20.5 Shell脚本中的逻辑判断 格式1:if 条件 ; then 语句; fi 1. 创建if1.sh测试脚本: [[email protected] ~]# vi if1.sh a=5,如果a大于3,满足这个条件,显示ok 添加内容: #!/bin/bash a=5 if [ $a -gt 3 ] then echo ok fi 2. 执行if1.sh脚本: [[e

六十八、shell脚本中的逻辑判断、文件目录属性判断、if特殊用法、case判断

一.shell脚本中的逻辑判断 格式1:if 条件 ; then 语句; fi 格式2:if 条件; then 语句; else 语句; fi 格式3:if -; then - ;elif -; then -; else -; fi if:如果. then:然后. -gt:大于. -lt:小于. -eq:等于. -ne:不等于.noeq. -ge:大于等于. -le:小于等于. 格式1:如果满足条件a大于3,则输出ok.最常用. # if [ $a -gt 3 ]; then echo ok;

Shell脚本中的逻辑判断、文件目录属性判断、if的特殊用法、case判断

1.Shell脚本中的逻辑判断 格式1:if 条件 ; then 语句; fi格式2:if 条件; then 语句; else 语句; fi格式3:if -; then - ;elif -; then -; else -; fi逻辑判断表达式:if [ $a -gt $b ]; if [ $a -lt 5 ]; if [ $b -eq 10 ]等 -gt (>); -lt(<); -ge(>=); -le(<=);-eq(==); -ne(!=) 注意到处都是空格可以使用 &