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 |
| cd /etc/hotplug.d | |
| for x in *; do | |
| [ -d "$x" ] || continue | |
| cat > "$x/$x.sh" <<EOF | |
| #!/bin/sh | |
| log_dir="/root/logs/\$(TZ=UTC-8 date "+%Y.%-m")" | |
| [ -d "\$log_dir" ] || mkdir -p "\$log_dir" | |
| echo -e "[\$(TZ=UTC-8 date "+%y/%m/%d %H:%M:%S")] \$(env | grep -vE 'HOME|PATH|TERM|USER|SHLVL|LOGNAME|PWD' | sort | tr '\n' ' ')" >> "\$log_dir/$x.log" | |
| EOF | |
| chmod +x "$x/$x.sh" | |
| done |