Do it:
usb in:
- Check PCI Status
- Start ADB Service(-a)
- Check ADB Auth
- Start WiFi-ADB
ADB Forward TO OpenWrt- Update Custom doamin
- down ap wifi interface
usb out
- check usb status
- start ap wifi network
- update gateway
Do it:
usb in:
usb out
2024-12-02 18:28:45 Skip unbind. Exiting... | |
2024-12-02 18:28:45 Skip unbind. Exiting... | |
2024-12-02 18:28:45 Binding device... | |
2024-12-02 18:28:45 Device already bound, skipping... | |
2024-12-02 18:28:45 Device already bound, skipping... | |
2024-12-02 18:28:45 Device already bound, skipping... | |
2024-12-02 18:28:48 Lock File /tmp/99-usb-monitor.flag deleted. | |
2024-12-02 18:28:48 Binding device... | |
2024-12-02 18:28:48 Device already bound, skipping... | |
2024-12-02 18:28:48 Device already bound, skipping... | |
2024-12-02 18:28:48 Device already bound, skipping... | |
2024-12-02 18:28:48 Device already bound, skipping... | |
2024-12-02 18:29:08 values i:ZFlip4 GW_IP:192.168.250.246 found. | |
2024-12-02 18:29:08 Route not change... | |
2024-12-02 18:29:18 domain update 192.168.250.246... |
#!/bin/sh | |
# USB设备插入监控脚本 | |
# 定义设备标志文件路径 | |
DEVICE_FLAG="/tmp/99-usb-monitor.flag" | |
DEVICE_LOG="/tmp/99-usb-monitor.log" | |
WIFI_Interface_Name=wwan # 无线AP网卡的名字,不填写则默认 wwan | |
USB_Interface_Name=ZFlip4 # USB网卡的名字,不填写则默认 ZFlip4 | |
USB_PCI_Name="SAMSUNG SAMSUNG_Android" # lsusb 命令找到 Android 品牌信息,不填写则开启无线调试 | |
USB_ADB_Port="59486" # 无线调试端口号,不填写则默认5555,USB_PCI_Name 为空则不开启无线调试 | |
CustomHost=zflip4.lan # 自定义hosts 网络 -> DHCP/DNS -> 自定义劫持域名 | |
# echo "$(date '+%Y-%m-%d %H:%M:%S') ACTION:$ACTION DEVTYPE:$DEVTYPE..." >>"${DEVICE_LOG}" | |
getGateway() { | |
interface="${1}" | |
GW_IP="$(ifstatus ${interface} | grep 'nexthop' | sed 's/.*"nexthop": "\([^"]*\)".*/\1/')" | |
# 如果GW_IP为空,则退出脚本 | |
if [ -z "$GW_IP" ] || [ -z "$interface" ]; then | |
echo "$(date '+%Y-%m-%d %H:%M:%S') restart i:${interface} ..." >>"${DEVICE_LOG}" | |
ifup "${interface}" | |
exit 0 | |
fi | |
echo "$(date '+%Y-%m-%d %H:%M:%S') values i:${interface} GW_IP:${GW_IP} found." >>"${DEVICE_LOG}" | |
} | |
updateGateway() { | |
if ip route show default | grep -q "${GW_IP}"; then | |
echo "$(date '+%Y-%m-%d %H:%M:%S') Route not change..." >>"${DEVICE_LOG}" | |
return | |
fi | |
if ip route show default; then | |
ip route replace default via "${GW_IP}" | |
else | |
ip route add default via "${GW_IP}" | |
fi | |
} | |
if [ "${DEVTYPE}" == "usb_device" ] && [ "${ACTION}" == "add" ] && [ -f "${DEVICE_FLAG}" ]; then | |
# 如果文件存在,表示是历史残留,删除 | |
if ! ps | grep -eq "$(cat ${DEVICE_FLAG})"; then | |
rm -f "${DEVICE_FLAG}" | |
echo "$(date '+%Y-%m-%d %H:%M:%S') Lock File ${DEVICE_FLAG} deleted." >>"${DEVICE_LOG}" | |
fi | |
exit 0 | |
fi | |
if [ "${DEVTYPE}" == "usb_interface" ]; then | |
# 判断是否已经处理过该事件 | |
if [ -f "${DEVICE_FLAG}" ]; then | |
# 如果文件存在,表示已经执行过,不再执行 | |
echo "$(date '+%Y-%m-%d %H:%M:%S') Device already bound, skipping..." >>"${DEVICE_LOG}" | |
exit 0 | |
fi | |
case "$ACTION" in | |
"add") | |
( | |
# 延迟等待 (例如 20 秒) | |
echo $$ >"${DEVICE_FLAG}" | |
sleep 5 | |
# 在延迟后执行的操作,例检查是否加载好设备 | |
if [ -n "${USB_PCI_Name}" ] && ! lsusb | grep -q "${USB_PCI_Name}"; then | |
echo "$(date '+%Y-%m-%d %H:%M:%S') Device ${USB_PCI_Name} not found, skipping..." >>"${DEVICE_LOG}" | |
exit 0 | |
fi | |
# 检测adb是否已启动 | |
if [ -n "${USB_PCI_Name}" ] && ! ps | grep "adb -a" | grep -qv grep; then | |
export ADB_VENDOR_KEYS=/root/.android/adbkey | |
adb kill-server | |
adb -a -P 5037 fork-server server | |
echo "$(date '+%Y-%m-%d %H:%M:%S') Start adb server..." >>"${DEVICE_LOG}" | |
sleep 3 | |
fi | |
# 检测设备是否已授权 | |
if [ -n "${USB_ADB_Name}" ] && ! adb devices | grep -qE "${USB_ADB_Name}\s+device"; then | |
echo "$(date '+%Y-%m-%d %H:%M:%S') Devices ${USB_ADB_Name} not good..." >>"${DEVICE_LOG}" | |
exit 0 | |
fi | |
# 检测设备是否已开启 无线调试 | |
if [ -n "${USB_ADB_Name}" ] && ! adb shell "netstat -tuln | grep -q ${USB_ADB_Port:-5555}"; then | |
adb tcpip "${USB_ADB_Port:-5555}" || ( | |
sleep 3 | |
adb tcpip "${USB_ADB_Port:-5555}" | |
) || ( | |
echo "$(date '+%Y-%m-%d %H:%M:%S') adb tcpip ${USB_ADB_Port:-5555} error..." >>"${DEVICE_LOG}" | |
exit | |
) | |
fi | |
# 检测设备是否已开启端口转发 | |
# if ! adb forward --list | grep -q 59486; then | |
# adb forward tcp:59486 tcp:59486 || ( | |
# sleep 3 | |
# adb forward tcp:59486 tcp:59486 | |
# ) || ( | |
# echo "$(date '+%Y-%m-%d %H:%M:%S') adb forward error..." >>"${DEVICE_LOG}" | |
# exit 0 | |
# ) | |
# fi | |
# echo "$(date '+%Y-%m-%d %H:%M:%S') adb forward done..." >>"${DEVICE_LOG}" | |
# 更新路由 | |
sleep 15 | |
# 检测无线AP网卡状态,运行中则停止 | |
if ifstatus "${WIFI_Interface_Name:-wwan}" | grep -q '"up": true'; then | |
ifdown "${WIFI_Interface_Name:-wwan}" | |
echo "$(date '+%Y-%m-%d %H:%M:%S') ${WIFI_Interface_Name:-wwan} down..." >>"${DEVICE_LOG}" | |
fi | |
# 获取USB网卡网关地址 | |
getGateway "${USB_Interface_Name:-ZFlip4}" | |
# 检测默认网关是否是USB网卡 | |
if ip route show default | grep -q "${GW_IP}"; then | |
echo "$(date '+%Y-%m-%d %H:%M:%S') Route not change..." >>"${DEVICE_LOG}" | |
else | |
updateGateway "${USB_Interface_Name:-ZFlip4}" # 更新默认网关为USB网关 | |
fi | |
# 自定义挟持域名 | |
if [ -n "${CustomHost}" ]; then | |
uci set dhcp.CustomHost='domain' | |
uci set dhcp.CustomHost.name="${CustomHost}" | |
uci set dhcp.CustomHost.ip="$GW_IP" | |
uci set dhcp.CustomHost.comments='CustomHost' | |
uci commit dhcp | |
/etc/init.d/dnsmasq reload | |
/etc/init.d/frpc reload | |
fi | |
# 等待10秒,避免重复执行 | |
sleep 10 | |
echo "$(date '+%Y-%m-%d %H:%M:%S') domain update ${GW_IP}..." >>"${DEVICE_LOG}" | |
rm -f "${DEVICE_FLAG}" | |
) & | |
;; | |
"remove") | |
( | |
sleep 5 # 经过测试,重启基本秒检测到 | |
if ifstatus "${USB_Interface_Name:-ZFlip4}" | grep -q '"up": false'; then | |
# 启动无线网卡 | |
ifup "${WIFI_Interface_Name:-wwan}" | |
sleep 5 # 等待无线AP连接网络 | |
getGateway "${WIFI_Interface_Name:-wwan}" | |
updateGateway | |
echo "$(date '+%Y-%m-%d %H:%M:%S') update route to ${WIFI_Interface_Name:-wwan}..." >>"${DEVICE_LOG}" | |
fi | |
rm -f "${DEVICE_FLAG}" | |
) & | |
;; | |
*) | |
# ACTION 不合法,退出脚本 | |
echo "$(date '+%Y-%m-%d %H:%M:%S') Skip $ACTION. Exiting..." >>"${DEVICE_LOG}" | |
exit 0 | |
;; | |
esac | |
# 如果文件不存在,执行绑定操作 | |
touch "${DEVICE_FLAG}" | |
echo "$(date '+%Y-%m-%d %H:%M:%S') Binding device..." >>"${DEVICE_LOG}" | |
fi |