HSIAO-YANG CHEN 发布的文章

#!/bin/sh
# Modify by HSIAO-YANG CHEN
# crontab: * * * * *  /bin/sh /usr/kickass.sh
#

#强信号 -60
STRONG=-60
#弱信号 -78
WEAK=-78


# 指定日志文件和5G频段设备MAC保存地址
logfile="/tmp/kickass.log"
dev5gmacfile="/usr/devmac_5g.db" ;


#默认自动添加计划任务  
crontabsfile="/etc/crontabs/root"
if [ -z $( grep -i $0 "$crontabsfile" )  ] ; then
    echo "* * * * *  /bin/sh /usr/kickass.sh" >>$crontabsfile
    echo "Add task scheduler to crontabs"
fi
#只能运行一个kickass任务
if [  "$( ps | grep -c "kick" )" -gt 3 ] ; then
    echo "shell script already running "
else

    datetime=`date +%Y-%m-%d_%H:%M:%S`
    if [ ! -f "$logfile" ]; then
        echo "creating kickass logfile: $logfile"
        echo "$datetime: kickass log file created." > $logfile
    fi
    #踢除wlan-MAC列表
    kicklist=""; while true ; do

        datetime=`date +%Y-%m-%d_%H:%M:%S`
        #从文件中读取5G频段的MAC地址
        if [ -f "$dev5gmacfile" ] ; then
            dev5gmac=$(cat "$dev5gmacfile")
        fi

        # wlanlist for multiple wlans (e.g., 5GHz/2.4GHz)
        wlanlist="" ; wlanlist=$(ifconfig | grep -i wlan | grep -i -v sta | awk '{ print $1 }')
        #echo "$wlanlist"

        #获取多张网卡的SSID,为后面2.4G强信号判定是否踢除5G设备
        ssid2g5g="" ;    for wlan in $wlanlist ; do 
            ssid2g5g="$ssid2g5g $(iw $wlan info | grep ssid | awk '{ print $2 }')"
        done
        #echo "$ssid2g5g"
        #loop for each wlan
        wlan="" ; for wlan in $wlanlist ; do

            maclist="" ; maclist=$(iw $wlan station dump | awk '/Station/{print $2}')

            #5G频段的网卡AP
            if [ "$(iw $wlan info | grep center1 | awk '{ print $2 }')" -gt "14"  ];then
                #loop for each associated client (station)
                for mac in $maclist ; do
                    #新增5G频段的设备MAC
                    if [ -z "$(echo $dev5gmac | grep -i "$mac")"  ] ; then
                            echo "$mac" >> $dev5gmacfile
                        echo  "$datetime: Add new 5G wifi $mac success! " >> $logfile
                    fi
                    #获取信号强度
                    signal=$(iwinfo $wlan assoclist  | awk 'BEGIN{IGNORECASE=1}/'$mac'/{print $2}')
                    #踢除弱信号设备,终端尝试连接2.4G频段
                    if [ "$signal"  -le "$WEAK" ] ; then
                        #匹配2次踢除设备记录,启动踢除设备
                        if [ -n "$(echo $kicklist | grep -i "$wlan-$mac.*$wlan-$mac")" ] ; then
                            ubus call hostapd.$wlan del_client '{"addr":"'"$mac"'", "reason": 5, "deauth": True, "ban_time": 100}' 
                            echo  "$datetime: Kick $wlan MAC:$mac signal:$signal dBm switch 2.4G!" >> $logfile
                            #踢除设备记录删减
                            kicklist=$(echo $kicklist |sed "s/$wlan-$mac//g")
                        else
                            #踢除设备记录新增      
                            kicklist="$kicklist$wlan-$mac"
                        fi
                    else
                            #踢除设备记录删减
                            kicklist=$(echo $kicklist |sed "s/$wlan-$mac//g")
                    fi
                done
            else
                #2.4G频段的网卡AP
                for mac in $maclist ; do
                    signal=$(iwinfo $wlan assoclist  | awk 'BEGIN{IGNORECASE=1}/'$mac'/{print $2}')
                    #踢除弱信号设备
                    if [ "$signal"  -le "$WEAK" ] ; then
                        #匹配2次踢除设备记录,启动踢除设备
                        if [ -n "$(echo $kicklist | grep -i "$wlan-$mac.*$wlan-$mac")" ] ; then
                            ubus call hostapd.$wlan del_client '{"addr":"'"$mac"'", "reason": 5, "deauth": True, "ban_time": 3000}' 
                            echo  "$datetime: Kick $wlan MAC:$mac signal:$signal dBm tool weak!" >> $logfile
                            kicklist=$(echo $kicklist |sed "s/$wlan-$mac//g")
                        else      
                            kicklist="$kicklist$wlan-$mac"
                        fi
                    #踢除强信号,终端尝试连接5G频段(判断条件:信号比STRONG值大,终端MAC记录在5G频段里,有2个相同SSID的AP)
                     elif [ "$signal" -gt "$STRONG" -a -n "$(echo $dev5gmac | grep -i "$mac")" -a -n "$( echo "$ssid2g5g" | grep -i  "$(iw $wlan info | grep ssid | awk '{ print $2 }').*$(iw $wlan info | grep ssid | awk '{ print $2 }')" )"  ] ; then
                        if [ -n "$(echo $kicklist | grep -i "$wlan-$mac.*$wlan-$mac")" ] ; then
                            ubus call hostapd.$wlan del_client '{"addr":"'"$mac"'", "reason": 5, "deauth": True, "ban_time": 100}' 
                            echo  "$datetime: Kick $wlan MAC:$mac signal:$signal dBm switch 5G!" >> $logfile
                            kicklist=$(echo $kicklist |sed "s/$wlan-$mac//g")
                        else      
                            kicklist="$kicklist$wlan-$mac"
                        fi

                    else
                        kicklist=$(echo $kicklist |sed "s/$wlan-$mac//g")
                    fi
                done
            fi
        done
        #监测周期时间
        sleep 2s
    done
fi

解决设备连接上2.4G频段后,不能自动切换回5G频段。
解决思路:

  1. 移动终端近距离连接上无线AP的5G频段,脚本将5G频段的设备MAC记录保存下来;
  2. 当连接上2.4G频段的移动终端,靠近无线AP时,当2.4G的信号强度高于-60dBm,且设备MAC符合5G频段的设备MAC记录,自动踢除2.4G频段的连接,让移动终端自动切换回5G频段;
  3. 当连接上5G频段的移动终端,远离无线AP时,当5G信号强度低于-75dBm,自动踢除5G频段的连接,让移动终端自动切换回信号强度较高的2.4G频段。

使用方法:

  1. 将脚本保存在/usr/目录下,且赋予可执行权限;
  2. 计划任务添加: * /bin/sh /usr/kickass.sh

脚本下载地址:kickass.zip

有遇到设置2.4G,却无法切换到2.4G频段的,可使用本补丁文件,恢复2.4G频段。

--- package/network/services/hostapd/Makefile
+++ package/network/services/hostapd/Makefile
@@ -28,6 +28,7 @@
     CONFIG_PACKAGE_hostapd-mini \
     CONFIG_WPA_RFKILL_SUPPORT \
     CONFIG_DRIVER_WEXT_SUPPORT \
+    CONFIG_DRIVER_11N_SUPPORT \
     CONFIG_DRIVER_11AC_SUPPORT \
     CONFIG_DRIVER_11AX_SUPPORT \
     CONFIG_WPA_ENABLE_WEP
@@ -74,6 +75,10 @@
 
 STAMP_CONFIGURED:=$(STAMP_CONFIGURED)_$(CONFIG_WPA_MSG_MIN_PRIORITY)
 
+ifneq ($(CONFIG_DRIVER_11N_SUPPORT),)
+  HOSTAPD_IEEE80211N:=y
+endif
+
 ifneq ($(CONFIG_DRIVER_11AC_SUPPORT),)
   HOSTAPD_IEEE80211AC:=y
 endif
@@ -85,6 +90,7 @@
 DRIVER_MAKEOPTS= \
     CONFIG_ACS=$(CONFIG_PACKAGE_kmod-cfg80211) \
     CONFIG_DRIVER_NL80211=$(CONFIG_PACKAGE_kmod-cfg80211) \
+    CONFIG_IEEE80211N=$(HOSTAPD_IEEE80211N) \
     CONFIG_IEEE80211AC=$(HOSTAPD_IEEE80211AC) \
     CONFIG_IEEE80211AX=$(HOSTAPD_IEEE80211AX) \
     CONFIG_DRIVER_WEXT=$(CONFIG_DRIVER_WEXT_SUPPORT) \

--- package/network/services/hostapd/Config.in
+++ package/network/services/hostapd/Config.in
@@ -78,6 +78,10 @@
     select KERNEL_WIRELESS_EXT
     default n
 
+config DRIVER_11N_SUPPORT
+    bool
+    default n
+    
 config DRIVER_11AC_SUPPORT
     bool
     default n

--- package/network/services/hostapd/src/src/utils/build_features.h
+++ package/network/services/hostapd/src/src/utils/build_features.h
@@ -7,6 +7,10 @@
     if (!strcmp(feat, "eap"))
         return 1;
 #endif
+#ifdef CONFIG_IEEE80211N
+    if (!strcmp(feat, "11n"))
+        return 1;
+#endif
 #ifdef CONFIG_IEEE80211AC
     if (!strcmp(feat, "11ac"))
         return 1;

补丁文件下载:06_recover_11N.zip

将以下代码保存成php后缀名,存放到可外网访问的php服务器下,可调用本地安装的wol程序,实现远程唤醒群晖。当然也可以唤醒其它支持网络唤醒的设备。根据自己实际需要设置好登录密码、mac地址和广播域。

<?php
#群晖远程唤醒
$passwd="1234567890"; //设置登录密码
$devmac="00:11:32:76:C8:69";//设置群晖的mac地址
$broadcast="172.0.255.255";//设置广播域172.0.X.X
    
header("Content-type:text/html;charset=gb2312");
echo "<title>群晖远程唤醒</title>";
echo "<pre>";

if(isset($_POST['btn']) and $_POST['passwd']==$passwd){
    $message=shell_exec("wol -i ".$broadcast." ".$devmac." 2>&1");
    echo "<B><br/><body style=\"text-align:center;\"><h1 style=\"color:red;\">群晖远程唤醒</h1></B><br/><h3>请稍等片刻再访问群晖……<pre>正在唤醒中:".$message."</h3><br/>";
    echo "<pre>";
}
else
{
    if(isset($_POST['passwd'])!="") {
        echo "<script>alert(\"密码错误!\");</script>";
    }
    echo "<B><br/><body style=\"text-align:center;\"><h1 style=\"color:red;\">群晖远程唤醒</h1></B><br/><h3>确定要唤醒群晖吗?</h3>";
    echo "<pre>";
    echo "<form  method=\"post\"> <h3>密码:<input type=\"text\" id=\"passwd\" name=\"passwd\"  required  minlength=\"4\" maxlength=\"10\" size=\"10\" /> <input type=\"submit\" name=\"btn\"   value=\"确认\"/></h3></form>";
}
    echo "</body>";
?>

唤醒登录.jpg 唤醒中.jpg
范例:http://yang1010.vicp.net/wol.php

相关资料来至:
1.github-【资料库】 https://github.com/gsuberland/lbfo_win10
2.原博主博客-【Re-enabling NIC Teaming (LBFO) in Windows 10 & other desktop SKUs, even after Microsoft removed it】 https://codeinsecurity.wordpress.com/2020/05/27/re-enabling-nic-teaming-lbfo-in-windows-10-desktop-skus-even-after-microsoft-removed-it/
3.github问题讨论区-【WIN32_EXIT_CODE : 1077 (0x435) #1】 https://github.com/gsuberland/lbfo_win10/issues/1

搬运优化补充了相关内容,经win10 x64 22H2和Win11 21H2验证可用。
具体安装步骤如下:
1.提取Windows Server 2022的install.wim镜像文件,存放工程目录下;
2.执行extract.bat文件,完成从install.wim镜像文件提取LBFO服务文件;
3.用管理员权限执行cmd命令:psexec -s -i cmd,进入system权限的cmd命令窗口,再执行install.bat,完成LBFO服务安装;
4.进入控制面板->网络和Internet->网络连接->找到“以太网”接口图标,鼠标右键“属性(R)”->以太网属性页,单击“安装(N)...”->选择网络功能类型页->选择“服务”-“添加(A)...”->选择网络服务页,单击“从磁盘安装(H)...”->从磁盘安装页,单击"浏览(B)..."->选择“C:\Windows\System32\DriverStore\FileRepository\mslbfoprovider.inf_amd64_f9d27a6b05ef21aa\mslbfoprovider.inf”文件->从磁盘安装页,单击"确认”,完成LBFO服务启用。
5.用管理员权限打开PowerShell命令行窗口,参照如下命令,完成VLAN网卡创建。

获取网络适配器信息

Get-NetAdapter

创建虚拟交换机:“Vbox”为虚拟交换机,"以太网" 为本地网络接口(根据自己实际修改)

New-NetLBFOTeam -Name "Vbox" -TeamNicName "Vbox"  -TeamMembers "以太网" -TeamingMode SwitchIndependent -LoadBalancingAlgorithm IPAddresses -Confirm:$false

创建VLAN网卡,案例是创建了Vlan7、Vlan8和Vlan9

Add-NetLbfoTeamNic -Team "Vbox" -VlanID 7 -Confirm:$false
Add-NetLbfoTeamNic -Team "Vbox" -VlanID 8 -Confirm:$false
Add-NetLbfoTeamNic -Team "Vbox" -VlanID 9 -Confirm:$false

移除VLAN网卡

Remove-NetLbfoTeamNic -Team "Vbox" -VlanID 9
Remove-NetLbfoTeamNic -Team "Vbox" -VlanID 8
Remove-NetLbfoTeamNic -Team "Vbox" -VlanID 7

移除虚拟交换机

Remove-NetLBFOTeam -Name "Vbox"

附件已经包含从Windows Server 2022提权的文件,解压后从步骤3往下做就可以了。
lbfo_win10-master.zip

如果有很多= A1 + B1格式的文本字符串,则需要将这些文本字符串转换为真实公式并在工作表中计算它们的值,不幸的是,没有直接的方法可以在Excel中解决。 但是,在这里我可以为您介绍一些有趣的技巧。
以下简短的VBA代码可以帮助您解决将文本转换为公式的问题,具体步骤如下:
1.按住 ALT + F11 键,然后打开 Microsoft Visual Basic for Applications窗口.
2.点击 插页 > 模块,然后将以下代码粘贴到 模块窗口.
VBA代码:将文本字符串转换为公式

Function Eval(Ref As String)
Application.Volatile
Eval = Evaluate(Ref)
End Function

3.保存此代码并返回到您的工作表,输入此公式 = Eval(C1) 放入空白单元格(C1 包含要转换为公式的文本字符串单元格),请参见屏幕截图:
doc-convert-text--to-formula1.png
4.然后按 输入 键,然后选择单元格D1,将填充手柄拖到要应用此公式的范围。 看截图:
doc-convert-text--to-formula2.png

范例字符串转公式.xlsm

转载地址:https://zh-cn.extendoffice.com/documents/excel/1683-excel-convert-text-string-to-formula.html