找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
广告投放联系QQ68610888
查看: 1798|回复: 5

一次shell脚本的bug记录

[复制链接]
     前段时间做openwrt的lighttpd页面的时候,用户时候的时候出现了问题,一个用户的状态里面,有些字段有两个。
我的脚本里面有根据用户的ip地址找出mac地址来,具体脚本是这样的

  1. cat /tmp/dhcp.leases| grep "$REMOTE_ADDR" | awk '{print $4}'
复制代码


       我到x86上面cat /tmp/dhcp.leases 看到用户的ip地址为192.168.2.7,里面匹配的出来的mac地址有两个,
一个是用户自己的mac地址还有一个是192.168.2.77对应的mac地址。看脚本以后才知道grep "$REMOTE_ADDR"这句
192.168.2.7
192.168.2.77
都匹配,所以才会出问题。


后面通过请教搜索的时候可以加个空格,这样根据ip地址来匹配才不会出现上面的问题。


改进的shell
  1. cat /tmp/dhcp.leases| grep "$REMOTE_ADDR " | awk '{print $4}'
复制代码


感谢分享。收藏了。
回复

使用道具 举报

思考了。看看
回复

使用道具 举报

 楼主| | 显示全部楼层
本帖最后由 zeng362424 于 2020-6-3 15:56 编辑

linux shell 根据子网掩码获取掩码位数输入 test.sh 255.255.255.0
输出 24
  1. #!/bin/sh

  2. #maskdigits.sh mask
  3. maskdigits () {
  4. a=$(echo "$1" | awk -F "." '{print $1" "$2" "$3" "$4}')
  5. for num in $a;
  6. do
  7. while [ $num != 0 ];do
  8.   echo -n $(($num%2)) >> /tmp/num
  9.   num=$(($num/2))
  10. done
  11. done
  12. echo $(grep -o "1" /tmp/num | wc -l)
  13. rm /tmp/num
  14. }
  15. maskdigits $1
复制代码

回复

使用道具 举报

 楼主| | 显示全部楼层
本帖最后由 zeng362424 于 2020-6-3 15:56 编辑

linux shell IP地址字符串(.分隔)转数字,数字转IP地址以及ip地址&子网掩码
输入 test.sh 192.168.10.9 255.255.255.0输出 192.168.10.0
  1. #!/bin/sh

  2. function ip2num() {
  3.      local ip=$1
  4.      local a=$(echo $ip | awk -F '.' '{print $1}')
  5.      local b=$(echo $ip | awk -F '.' '{print $2}')
  6.      local c=$(echo $ip | awk -F '.' '{print $3}')
  7.      local d=$(echo $ip | awk -F '.' '{print $4}')
  8.      echo "$(( (a<<24)+(b<<16)+(c<<8)+d ))"
  9. }

  10. function num2ip() {
  11.      local num=$1
  12.      local a=$((num>>24))
  13.      local b=$((num>>16&0xff))
  14.      local c=$((num>>8&0xff))
  15.      local d=$((num&0xff))
  16.      echo "$a.$b.$c.$d"
  17. }


  18. ip=$(ip2num $1)
  19. echo $ip

  20. mask=$(ip2num $2)
  21. echo $mask

  22. ip=$[$ip&$mask]
  23. #out="$out$[$si&$sm]"
  24. echo $ip
  25. ip_str=$(num2ip $ip)

  26. echo $ip_str
复制代码

回复

使用道具 举报

 楼主| | 显示全部楼层
zeng362424 发表于 2020-6-3 15:55
linux shell IP地址字符串(.分隔)转数字,数字转IP地址以及ip地址&子网掩码
输入 test.sh 192.168.10.9  ...

输入 test.sh 192.168.10.1 255.255.255.0
输出 192.168.10.0
  1. get_netseg ()
  2. {
  3.         ip=$1
  4.         mask=$2
  5.         out=''
  6.         for index in {1..4}; do
  7.                 si=$(echo $ip | cut -d "." -f $index)
  8.                 sm=$(echo $mask | cut -d "." -f $index)
  9.                 if [ $index -ne 1 ];then
  10.                         out="$out."
  11.                 fi
  12.                 out="$out$[$si&$sm]"
  13.         done
  14.         echo $out
  15.         #return $out
  16. }
  17. get_netseg $1 $2
复制代码

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

欢迎大家光临恩山无线论坛上一条 /1 下一条

有疑问请添加管理员QQ86788181|手机版|小黑屋|Archiver|恩山无线论坛(常州市恩山计算机开发有限公司版权所有) ( 苏ICP备05084872号 )

GMT+8, 2024-5-12 08:07

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

| 江苏省互联网有害信息举报中心 举报信箱:js12377 | @jischina.com.cn 举报电话:025-88802724 本站不良内容举报信箱:68610888@qq.com 举报电话:0519-86695797

快速回复 返回顶部 返回列表