iNode安全检查
公司内部的使用的inode进行的网络验证,但是mac经常安全检查不通过,然后过了几分钟就断连了。很头大。
发现
我偶然发现如果连接网络成功之后,直接杀掉Inode进程,不影响网络。
那么就很简单了,直接写一个脚本,来运行inode,并自动清理掉进程。然后定时运行脚本,检测网络是否联通,异常重新执行脚本即可。
实践
这里兼容了sonoma系统 14.4以上系统无法使用airport命令了
#!/bin/bash
RED='\033[0;31m' # 红色
GREEN='\033[0;35m' # 绿色
NC='\033[0m' # 无颜色,用于重置颜色设置
# 定义一些变量来使脚本更容易维护和修改
expected_ssid="wifi的ssid名称"
service_path="/Applications/iNodeClient"
authen_service_name="AuthenMngService"
inode_monitor_name="iNodeMon"
airport_cmd="/System/Library/PrivateFrameworks/Apple80211.framework/Resources/airport"
# 以root权限检查
if [ "$(id -u)" != "0" ]; then
echo -e "${RED}This script must be run as root.${NC}"
exit 1
fi
# 检查网络连通性函数
network_check() {
local target="www.baidu.com"
if /sbin/ping -c 4 -W 5 "${target}" | grep '100.0% packet loss' >/dev/null 2>&1; then
echo -e "${RED}inode: Network is down or unstable.${NC}"
return 1 # 返回非零值来表示失败
else
echo -e "${GREEN}inode: Network is all ready.${NC}"
return 0 # 返回0来表示成功
fi
}
# 重新连接网络服务函数
reconnect() {
echo -e "${GREEN}inode: 1.关闭并删除相关进程${NC}"
# 关闭并删除相关进程
pkill -f "${authen_service_name}" && sleep 1
pkill -f "${inode_monitor_name}" && sleep 1
echo -e "${GREEN}inode: 2.启动服务${authen_service_name}${NC}"
# 启动服务
"${service_path}/${authen_service_name}" &>/dev/null &
# 等待AuthenMngService启动
until pgrep -f "${authen_service_name}" >/dev/null; do
sleep 1
done
echo -e "${GREEN}inode: 3.启动服务${inode_monitor_name}${NC}"
# 启动iNodeMon
"${service_path}/${inode_monitor_name}" &>/dev/null &
echo -e "${GREEN}inode: 程序启动已完成.${NC}"
}
get_ssid_by_airport() {
local ssid=$(${airport_cmd} -I | awk '/ SSID: / {print substr($0, index($0, $2))}')
echo -n "${ssid}"
}
get_ssid_by_wbutil() {
local ssid=$(wdutil info | grep ' SSID' | awk '/SSID/{print $3}')
echo -n "${ssid}"
}
get_ssid() {
# 获取系统产品版本号
product_version=$(sw_vers -productVersion)
# 定义目标版本为14.4
target_major_version=14
target_minor_version=4
# 拆分版本号为数组
IFS='.' read -ra version_parts <<<"$product_version"
major_version=${version_parts[0]}
minor_version=${version_parts[1]}
# 判断版本号是否大于等于14.4
if [ "$major_version" -gt "$target_major_version" ] || { [ "$major_version" -eq "$target_major_version" ] && [ "$minor_version" -ge "$target_minor_version" ]; }; then
echo $(get_ssid_by_wbutil)
else
echo $(get_ssid_by_airport)
fi
}
# 获取当前SSID
current_ssid=$(get_ssid)
current_ssid=$(echo -n "${current_ssid}" | tr -d '[:space:]')
echo -e "${GREEN}inode: 开始检查网络.${NC}"
echo -e "${GREEN}inode: 当前连接的wifi: ${current_ssid}.${NC}"
if [ "${current_ssid}" = "${expected_ssid}" ]; then
if network_check; then
echo -e "${GREEN}inode: 网络一切正常${NC}"
else
echo -e "${RED}inode: 网络重连.${NC}"
reconnect
fi
else
echo "没有连接到指定wifi: ${expected_ssid}. 当前为: ${current_ssid}"
fi