#!/bin/bash
#设置全局变量
dev_name=""
ip=""
# 输出错误信息并且返回错误码 结束脚本执行
exit_str() {
echo $1
exit $2
}
# 判断是否有管理员的权限
is_root() {
test $UID -ne 0 && exit_str "请使用sudo运行此脚本!" 1
}
# 获取网卡设备名
get_dev_name() {
dev_name=$(ifconfig | egrep 'enp|eth' | cut -d\ -f1)
test -z "$dev_name" && exit_str "网卡设备找不到, 请检查网卡是否启动!" 2
dev_name=${dev_name%:*}
test "x$1" = "xout" && exit_str $dev_name 0
}
# 查看网线是否连通 mii-tool
is_dev_ok() {
test -z "$ip" || return
test -z "$dev_name" && get_dev_name
mii-tool $dev_name 2> /dev/null | grep 'link ok' &> /dev/null \
|| exit_str "$dev_name: 网线没有插好,请检测!" 3
}
# 查看本机IP地址
get_ip() {
test -z "$ip" || return
test -z $dev_name && get_dev_name
export LANG=en_US.UTF-8
export LANGUAGE=en_US:en
local ipMsg=$(ifconfig $dev_name)
ip=${ipMsg#*addr:}
ip=${ip%% Bcast:*}
test -z "$ip" && exit_str "$dev_name: 没有设置本机IP地址!" 4
test "x$1" = "xout" && exit_str $ip 0
}
# ping操作 需要传递要ping的参数
mping() {
test -z "$1" && return 1
ping -c 1 $1 &> /dev/null && return 0 || return 1
}
# 主函数,全程检测网络情况
main() {
is_root
is_dev_ok
get_ip
# ping网关
gwip=${ip%.*}.1
mping $gwip || exit_str "$gwip: 网关ping不通!" 5
# ping域名解析服务器(DNS) 223.5.5.5 / 8.8.8.8
mping 223.5.5.5 || exit_str "请检查路由表是否设置默认网关!" 6
# ping域名(百度)
mping www.baidu.com || exit_str "请检查是否正确指定DNS解析服务器!" 7
echo "你的网络没有任何问题!"
}
# 让程序接受参数,根据不同的参数做不同功能
# ping子命令 调用mping
# ip子命令 调用get_ip
# dev子命令 调用get_dev_name
run_command() {
case "$1" in
ping)
test -z "$2" && exit_str "ping子命令必须指定目标!" 100
mping $2
exit $?
;;
ip)
test -z "$2" && get_ip out
ip=$2
main
;;
dev)
# 如果有第二个参数代表设置设备名
test -z "$2" && get_dev_name out
dev_name=$2
main
;;
*)
echo "暂不支持 $1 子命令功能!"
;;
esac
}
# 根据参数运行主函数
test -z "$1" && main || run_command $@
#设置全局变量
dev_name=""
ip=""
# 输出错误信息并且返回错误码 结束脚本执行
exit_str() {
echo $1
exit $2
}
# 判断是否有管理员的权限
is_root() {
test $UID -ne 0 && exit_str "请使用sudo运行此脚本!" 1
}
# 获取网卡设备名
get_dev_name() {
dev_name=$(ifconfig | egrep 'enp|eth' | cut -d\ -f1)
test -z "$dev_name" && exit_str "网卡设备找不到, 请检查网卡是否启动!" 2
dev_name=${dev_name%:*}
test "x$1" = "xout" && exit_str $dev_name 0
}
# 查看网线是否连通 mii-tool
is_dev_ok() {
test -z "$ip" || return
test -z "$dev_name" && get_dev_name
mii-tool $dev_name 2> /dev/null | grep 'link ok' &> /dev/null \
|| exit_str "$dev_name: 网线没有插好,请检测!" 3
}
# 查看本机IP地址
get_ip() {
test -z "$ip" || return
test -z $dev_name && get_dev_name
export LANG=en_US.UTF-8
export LANGUAGE=en_US:en
local ipMsg=$(ifconfig $dev_name)
ip=${ipMsg#*addr:}
ip=${ip%% Bcast:*}
test -z "$ip" && exit_str "$dev_name: 没有设置本机IP地址!" 4
test "x$1" = "xout" && exit_str $ip 0
}
# ping操作 需要传递要ping的参数
mping() {
test -z "$1" && return 1
ping -c 1 $1 &> /dev/null && return 0 || return 1
}
# 主函数,全程检测网络情况
main() {
is_root
is_dev_ok
get_ip
# ping网关
gwip=${ip%.*}.1
mping $gwip || exit_str "$gwip: 网关ping不通!" 5
# ping域名解析服务器(DNS) 223.5.5.5 / 8.8.8.8
mping 223.5.5.5 || exit_str "请检查路由表是否设置默认网关!" 6
# ping域名(百度)
mping www.baidu.com || exit_str "请检查是否正确指定DNS解析服务器!" 7
echo "你的网络没有任何问题!"
}
# 让程序接受参数,根据不同的参数做不同功能
# ping子命令 调用mping
# ip子命令 调用get_ip
# dev子命令 调用get_dev_name
run_command() {
case "$1" in
ping)
test -z "$2" && exit_str "ping子命令必须指定目标!" 100
mping $2
exit $?
;;
ip)
test -z "$2" && get_ip out
ip=$2
main
;;
dev)
# 如果有第二个参数代表设置设备名
test -z "$2" && get_dev_name out
dev_name=$2
main
;;
*)
echo "暂不支持 $1 子命令功能!"
;;
esac
}
# 根据参数运行主函数
test -z "$1" && main || run_command $@