免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4588 | 回复: 1
打印 上一主题 下一主题

[学习共享] 一个小标点引发一串匪夷所思的问题........ [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-01-03 22:39 |显示全部楼层 |倒序浏览
本帖最后由 wwr 于 2013-01-05 20:48 编辑

今天在写有关通过shadow文件确定账号是否符合安全标准的脚本:检查账户有效期、检查账户是否设置密码等等。
首先看看这个检查账户有效期的脚本,主要是截取shadow文件第八段,判断账户的过期时间,并echo警告信息。
  1.         while IFS=: read -r f1 f2 f3 f4 f5 f6 f7 f8
  2.           do
  3.           if [ ! -z $f8 ]
  4.           then
  5.         expd="`date -d "1970-01-01+$f8 day" '+%Y-%m-%d'`"
  6.         echo -e "$ATT The account: $f1 will expried at $expd. Please contact your administrator!"
  7.         else echo -e "Checking account $f1 expire date.                $OK"
  8.         fi
  9.         done</etc/shadow
复制代码
我们来执行一下
  1. [root@butter ~]# ./secure.sh
  2. ........
  3. Checking account gopher expire date.            [  OK  ]
  4. ***Attention***    The account: john will expried at 2013-03-04. Please contact your administrator!
  5. Checking account nobody expire date.            [  OK  ]
  6. .....
  7. [root@butter ~]# cat /etc/shadow|grep john
  8. john:$6$hX2SaZv8$TZbICUPboyu2XmVVgYOfDFqvR7sKJeD0N5D2pvmxo3H8bmVl8eCroOLcJYEw6.uvkfQwgg/8b2wV1dvszi79a.:15708:0:99999:7::15768:
复制代码
一切顺利,只要对这个账户设定的密码过期时间,他都能准确的根据第八段时间计算出过期时间。

接着我们来检查账户是否设置密码。其实和上面的脚本几乎一样,唯一改变的是替换成第二字段,只要第二字段不为空我们就认为他是有密码的。脚本内容如下
  1.         while IFS=: read -r f1 f2 f3 f4 f5 f6 f7 f8
  2.           do
  3.           if [ -z $f2 ]
  4.           then
  5.         echo -e "$WAR The account: $f1 has empty password! Please contact your administrator!"
  6.         fi
  7.         else -e "Checking whether the  account $1 has set a password         $OK"
  8.         done</etc/shadow
复制代码
结果执行之后离奇的出现错误
  1. ./secure.sh: line 4: [: too many arguments
复制代码
脚本内容完全是参照检查账户有效期的那个来修改的,而且没有任何错别字。但就是无法解释。
我试图让脚本不进行判断,只输出$f2的内容:
  1. [root@butter ~]# cat secure.sh
  2. while IFS=: read -r f1 f2 f3 f4 f5 f6 f7 f8
  3. do
  4. echo $f2
  5. done</etc/shadow
  6. [root@butter ~]# ./secure.sh
  7. $2y$10$ULX4kt.sVMbsjg0bBwj8FuCF9Exy2GzxnpgbCOZLf.Jtj5FQ7.DjC
  8. ALL_LINE Desktop Documents FLAG UNIQ_LINE autoinst.xml bin inst-sys passwd passwd2 secure.sh st
  9. ALL_LINE Desktop Documents FLAG UNIQ_LINE autoinst.xml bin inst-sys passwd passwd2 secure.sh st
  10. ALL_LINE Desktop Documents FLAG UNIQ_LINE autoinst.xml bin inst-sys passwd passwd2 secure.sh st
  11. ALL_LINE Desktop Documents FLAG UNIQ_LINE autoinst.xml bin inst-sys passwd passwd2 secure.sh st
  12. .............
复制代码
除了第一行显示正常的密码字段以外其余的全是奇怪的内容……

后来我又检查了一下/etc/shadow文件:
  1. [root@butter ~]# cat /etc/shadow
  2. root:$2y$10$ULX4kt.sVMbsjg0bBwj8FuCF9Exy2GzxnpgbCOZLf.Jtj5FQ7.DjC:15705::::::
  3. bin:*:15385::::::
  4. daemon:*:15385::::::
  5. lp:*:15385::::::
  6. mail:*:15385::::::
  7. news:*:15385::::::
  8. uucp:*:15385::::::
  9. games:*:15385::::::
  10. man:*:15385::::::
复制代码
仿佛发现了些什么…………



原来,系统默认账户下的第二字段是星号,表示账户无法登录。
而在脚本中,星号又是一个通配符,刚才通过echo看到的一串奇怪的内容其实是我当前目录下的文件,你现在也可以试试"echo *"输出结果等于"ls"。
恍然大悟了吧!立马重新修改脚本,把刚才判断语句中的$f2给加个双引号。再跑一下。
Bravo!成功了!

  1. [root@butter ~]# cat secure.sh
  2.         while IFS=: read -r f1 f2 f3 f4 f5 f6 f7 f8
  3.         do
  4.         if [ -z "$f2" ]
  5.         then
  6.         echo -e "$WAR The account: $f1 has empty password! Please contact your administrator!"
  7.         else echo -e "Checking the  account $1 has set a password      $OK"
  8.         fi
  9.         done</etc/shadow
  10. [root@butter ~]# ./secure.sh
  11. Checking the  account  root has set a password       [  OK  ]
  12. ..........
  13. ***Warning***    The account: tom has empty password! Please contact your administrator!
  14. ........
  15. [root@butter ~]# cat /etc/shadow|grep tom
  16. tom::15708:0:99999:7:::
复制代码

论坛徽章:
0
2 [报告]
发表于 2013-01-04 17:18 |显示全部楼层
回复 5# aqbssh

不是bug,只是比较神奇的情况吧
   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP