【继续求助】找到一个用来显示网络信息的shell脚本,求完善
Tofloor
poster avatar
zwq133
deepin
2017-11-26 22:28
Author
拔到一个显示网卡信息的shell脚本,苦于没有编程知识,有几项无法实现。这个脚本想用于conky调用,请大神不吝赐教,谢谢!
  1. #! /bin/sh

  2. default_route=$(ip route show)
  3. default_interface=$(echo $default_route | sed -e 's/^.*dev \([^ ]*\).*$/\1/' | head -n 1)
  4. address=$(ip addr show label $default_interface scope global | awk '$1 == "inet" { print $2,$4}')

  5. #网络名称


  6. #网卡接口

  7.   
  8. #ip 地 址
  9. ip=$(echo $address | awk '{print $1 }')
  10. ip=${ip%%/*}
  11.   
  12. #广播地址(这个不需要)
  13. #broadcast=$(echo $address | awk '{print $2 }')
  14.   
  15. #子网掩码
  16. mask=$(route -n |grep 'U[ \t]' | head -n 1 | awk '{print $3}')
  17.   
  18. #默认网关
  19. gateway=$(route -n | grep 'UG[ \t]' | awk '{print $2}')
  20.   
  21. #dns
  22. dns=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}')

  23. #MAC地址
  24. MAC=

  25. #网卡速率
  26. txqueuelen=

  27. echo 网络名称:
  28. echo 网卡接口:
  29. echo ip 地 址: $ip
  30. echo 子网掩码: $mask
  31. #echo 广播地址: $broadcast
  32. echo 默认网关: $gateway
  33. echo 首选 DNS: $dns
  34. echo MAC 地址: $mac
  35. echo 网卡速率:  $txqueuelen
Copy the Code
如果有多个网卡,那么要同时显示所有网卡的信息,又该如何写呢?
Reply Favorite View the author
All Replies
avatar
azs
deepin
2017-11-27 05:27
#1
lz 可以使用Python来写这个程序,而不是臃肿的shell脚本
Reply View the author
avatar
zwq133
deepin
2017-11-27 05:34
#2
https://bbs.deepin.org/post/149000
lz 可以使用Python来写这个程序,而不是臃肿的shell脚本

对于这种小脚本,shell和python区别应该不大吧!

重点是,python我也不会,层主有高招么?求赐教!!
Reply View the author
avatar
azs
deepin
2017-11-27 05:40
#3
如果用Python, 可以使用一些类库来减少你的工作,比如 netifaces ,psutil 可以用来获取网卡的信息。减少你的工作
Reply View the author
avatar
zwq133
deepin
2017-11-27 06:42
#4
https://bbs.deepin.org/post/149000
如果用Python, 可以使用一些类库来减少你的工作,比如 netifaces ,psutil 可以用来获取网卡的信息。减少你 ...

关键的问题,不会啊~~
Reply View the author
avatar
azs
deepin
2017-11-27 08:05
#5
可以去百度,Google, 如果你的英文水平尚可的话看文档是没有问题的,如果英文不是很好,可以尝试翻译一下
Reply View the author
avatar
RucLinux
deepin
2017-11-27 13:35
#6
address=$(ip addr show label $default_interface scope global | awk '$1 == "inet" { print $2,$4}')
这行应该就是取网卡信息的命令。 你把 | awk '$1 == "inet" { print $2,$4}' 这段删除了就能显示所有的网卡信息了。awk是过滤的,

#! /bin/sh

default_route=$(ip route show)
default_interface=$(echo $default_route | sed -e 's/^.*dev \([^ ]*\).*$/\1/' | head -n 1)
address=$(ip addr show label $default_interface scope global )
echo ${address} > inet.log
#上边这行就是显示你的网卡全部信息
#网络名称


#网卡接口

  
#ip 地 址
ip=$(echo $address | awk '{print $1 }')
ip=${ip%%/*}
  
#广播地址(这个不需要)
#broadcast=$(echo $address | awk '{print $2 }')
  
#子网掩码
mask=$(route -n |grep 'U[ \t]' | head -n 1 | awk '{print $3}')
  
#默认网关
gateway=$(route -n | grep 'UG[ \t]' | awk '{print $2}')
  
#dns
dns=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}')

#MAC地址
MAC=

#网卡速率
txqueuelen=

echo 网络名称:
echo 网卡接口:
echo ip 地 址: $ip
echo 子网掩码: $mask
#echo 广播地址: $broadcast
echo 默认网关: $gateway
echo 首选 DNS: $dns
echo MAC 地址: $mac
echo 网卡速率:  $txqueuelen

得到网卡全部信息后再进行一次awk就可以了。或者直接用grep

Reply View the author
avatar
zwq133
deepin
2017-11-28 00:53
#7
https://bbs.deepin.org/post/149000
这行应该就是取网卡信息的命令。 你把 | awk '$1 == "inet" { print $2,$4}' 这段删除了就能显示所有的网卡 ...

昨晚上已经可以显示了,电脑的网卡字段不一样,改一下就可以了
Reply View the author
avatar
zwq133
deepin
2017-11-28 00:54
#8
https://bbs.deepin.org/post/149000
这行应该就是取网卡信息的命令。 你把 | awk '$1 == "inet" { print $2,$4}' 这段删除了就能显示所有的网卡 ...

昨晚上已经可以显示了,电脑的网卡字段不一样,改一下就可以了
Reply View the author
avatar
RucLinux
deepin
2017-11-28 03:07
#9
https://bbs.deepin.org/post/149000
昨晚上已经可以显示了,电脑的网卡字段不一样,改一下就可以了

我昨晚在这个基础上写了一个,看看有没有效果。谢谢。
源码地址:http://www.myzhenai.com.cn/post/2842.html



Reply View the author
avatar
zwq133
deepin
2017-11-28 04:52
#10
本帖最后由 zwq133 于 2017-11-27 21:14 编辑
https://bbs.deepin.org/post/149000
我昨晚在这个基础上写了一个,看看有没有效果。谢谢。
源码地址:http://www.myzhenai.com.cn/post/2842. ...

我先拔下来研究研究!!肯定还有问题需要咨询你!希望到时候不要嫌我烦,哈哈!!!
哭了,为毛我运行的时候会语法错误啊。。。。。。


Reply View the author
avatar
RucLinux
deepin
2017-11-28 06:37
#11
https://bbs.deepin.org/post/149000
我先拔下来研究研究!!肯定还有问题需要咨询你!希望到时候不要嫌我烦,哈哈!!!
哭了,为毛我运行的时 ...

我没有用过conky,不知道如何, 你可以先在终端里运行这个脚本试试, 将脚本保存为 ip.sh
sh ip.sh
或者
./ip.sh
Reply View the author
avatar
zwq133
deepin
2017-11-28 07:04
#12
https://bbs.deepin.org/post/149000
我没有用过conky,不知道如何, 你可以先在终端里运行这个脚本试试, 将脚本保存为 ip.sh
sh ip.sh
或者

就是在终端里运行就报语法错误


conky调用我已经搞定了,现在就差这个了,不晓得为啥在我机器上你这个脚本就无法正常运行
Reply View the author
avatar
RucLinux
deepin
2017-11-28 07:34
#13
https://bbs.deepin.org/post/149000
就是在终端里运行就报语法错误

对不起,是我书写代码时候不严谨,脚本的文件头是错的。 在Red Hat的发行版里 bash文件的文件头可以使用 #! /bin/sh 但在Debian里 bash已经改变成了 #! /bin/bash。
我写完代码后没有在Debian里调试。然后原来的代码里有一处符号错误, 那个提示的就是符号的错误。还有就是 ifconfig在Debian里必须要root权限执行, 所以这个脚本你得要sudo执行
sudo ./tinte.sh

#! /bin/bash
#***************************************************************************************************************************************************#
# Author: RucLinux                                                                                             #  
# Web: http://www.myzhenai.com.cn http://www.myzhenai.com http://www.haikou-china.com http://jiayu.mybabya.com #
#***************************************************************************************************************************************************#
#网卡接口
indx=$(ifconfig -a|grep encap|awk -F " " '{ print $1 }')
OLD_IFD="$IFD"
IFD=" "
arr=${indx}
IFD="$OLD_IFD"
for d in ${arr[@]}
do
na=$(echo ${d:0:3})
if [ ${na} == "eth" ]; then
name=$(ethtool -i ${d}|grep driver:|awk -F "driver:" '{ print $2 }')
txqueuelen=$(ethtool ${d}|grep Speed:|awk -F "Speed:" '{ print $2 }')
mac=$(ifconfig ${d} | sed -n '/HWaddr/ s/^.*HWaddr *//pg')
fi
ma=${arr[@]}:
md=$(echo ${ma}|sed 's/:/ /g')
done

#ip=`ifconfig | awk -F'[ ]+|:' '/inet addr/{if($4!~/^192.168|^172.16|^10|^127|^0/) print $4}'`
#服务器上的多个IP地址
ip=$(ifconfig -a|grep inet|grep -v 127.0.0.1|grep -v inet6|awk '{print $2}'|awk -F ":" '{ print $2 }')

#子网掩码
mask=$(ifconfig -a|grep ${ip}|awk -F "Mask:" '{ print $2 }')
#默认网关
gateway=$(route -n | grep 'UG[ \t]' | awk '{print $2}')
#dns
dns=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}')

echo 网络名称: ${name}
echo 网卡接口:  ${md}
echo ip 地 址: ${ip}
echo 子网掩码: ${mask}
#echo 广播地址: $broadcast
echo 默认网关: ${gateway}
echo 首选 DNS: ${dns}
echo MAC 地址: ${mac}
echo 网卡速率:  ${txqueuelen}



Reply View the author
avatar
zwq133
deepin
2017-11-28 08:22
#14
本帖最后由 zwq133 于 2017-11-28 00:51 编辑
https://bbs.deepin.org/post/149000
对不起,是我书写代码时候不严谨,脚本的文件头是错的。 在Red Hat的发行版里 bash文件的文件头可以使用  ...

哦,好的,感谢你耐心指导!
不过现在又有一个问题:

这种情况,是不是和发行版的原因有关呢?
难道Red Hat的发行版里的ifconfig和Debian里的显示方式不一样?或者说,两个发行版里的“grep”语法不一样?


Reply View the author
avatar
RucLinux
deepin
2017-11-28 11:53
#15
https://bbs.deepin.org/post/149000
哦,好的,感谢你耐心指导!
不过现在又有一个问题:

这种情况我也不知道, 基本上Linux里的一些组件和代码是一样的,不一样的也就是那么几种。deepin是基于debian开发的,类似于这种命令应该都是通用的才是。

因为系统里的服务的版本不一样,环境不一样,各种不确定因素,所以也不好排查。

我的脚本里最基本的也就是那几个命令 ifconfig grep sed ethtool

你把 encap driver:  Speed: inet 127.0.0.1 inet6 这些关键词用半角符号下的单引号引起来看看,是grep这个命令出错,因为我不知道你的环境,所以没法排查。

Reply View the author
avatar
zwq133
deepin
2017-11-28 22:40
#16
https://bbs.deepin.org/post/149000
这种情况我也不知道, 基本上Linux里的一些组件和代码是一样的,不一样的也就是那么几种。deepin是基于de ...

研究了一下,Red Hat系和Debian系的一些命令不一样,导致你的脚本在我这里无法正常运行,比如“ethtool”这个命令,在deepin里就不存在,就算安装了它,也无法运行,郁闷啊!
Reply View the author
avatar
RucLinux
deepin
2017-11-29 01:08
#17
https://bbs.deepin.org/post/149000
研究了一下,Red Hat系和Debian系的一些命令不一样,导致你的脚本在我这里无法正常运行,比如“ethtool” ...

ifconfig
然后看一看你eth开头的那个网卡名称

ethtool ethx
然后执行看看提示什么?

这些命令在Linux下应该都是通用的。deepin应该也是支持 ifconfig ethtool grep等命令的。
Reply View the author