e_zhangiso 发表于 2022-3-18 09:09:15

条件未满足,为什么脚本一直被执行

本帖最后由 e_zhangiso 于 2022-3-18 09:11 编辑

基本路由设置见附图。当DHCP-Client获取的网关IP发生变化时,我编辑了一个脚本来修改IP路由。实际使用中发现即使不满足条件,IP Route的网关还是会被反复修改。为什么?请大神指教

{
:local newip
:local oldip
:local status
:local x "2"
:for i from=1 to=$x do={
:set status status]
:if ($status="bound") do={
:set newip gateway]
:set oldip gateway]
:set oldip }
:if ($newip != $oldip) do={
/ip route set gateway=($newip."%".("wlan".$i))
/ip route set gateway=($newip."%".("wlan".$i))}}}
}




cspm333 发表于 2022-3-18 11:23:06

本帖最后由 cspm333 于 2022-3-18 11:27 编辑

您script寫的太複雜了,dhcp-c裡有自己的script欄,也有特有的變數可利用。

:foreach i in=tel-1,tel-111 do={/ip route set gateway="$"gateway-address"%wlan1"}
如上,這樣wlan1 dhcp更新時自己會跑script。無需放在排程時時盯著gateway。

另外因變數含特殊字元,
不能用$gateway-address宣告,gateway-address會被當字串....要使用$"gateway-address"才正確。

e_zhangiso 发表于 2022-3-18 12:20:29

cspm333 发表于 2022-3-18 11:23
您script寫的太複雜了,dhcp-c裡有自己的script欄,也有特有的變數可利用。




感谢大神提供更加简洁的解决方案,实测OK,我的脚本目的是,不管WLAN运行不运行,只要网关不变就不修改,但实际使用中,会一直修改,那个判断不相同IP的条件:if ($newip != $oldip) do={好像不起作用,高手如能分析是什么原因,可提高大众认知,在此先谢过.

cspm333 发表于 2022-3-18 16:12:21

本帖最后由 cspm333 于 2022-3-18 16:21 编辑


道理很簡單,ip相同但屬性不同...比對注定會因屬性不同的關係進行更新。
所以比對時不能只比對gateway ip,屬性也要轉換才行。

e_zhangiso 发表于 2022-3-18 17:26:32

cspm333 发表于 2022-3-18 16:12
道理很簡單,ip相同但屬性不同...比對注定會因屬性不同的關係進行更新。
所以比對時不能只比對gateway ip ...

找到原因,:set oldip 这个不起作用,如何提取附图,红框中第一位到"%"之间的数值


e_zhangiso 发表于 2022-3-18 20:32:38

e_zhangiso 发表于 2022-3-18 17:26
找到原因,:set oldip 这个不起作用,如何提取附图,红框中第一位到"%"之间的数值




还是提取不出来,如附图:
{
:local oldip
:set oldip gateway]
:set oldip [:pick $oldip 0 ]
:put $oldip
}
}



cspm333 发表于 2022-3-19 00:13:03

本帖最后由 cspm333 于 2022-3-19 00:14 编辑


失誤是因抓出的值屬性為array,轉成str就沒問題了。

e_zhangiso 发表于 2022-3-19 11:31:53

cspm333 发表于 2022-3-19 00:13
失誤是因抓出的值屬性為array,轉成str就沒問題了。

非常感谢,测试通过,实际布署中采纳大神的建议,使用/ip dhcp-client运行时执行脚本,这种方法对设备的性能消耗最小

57068368 发表于 2022-3-19 21:58:53

我的是在/ip dhcp-client里面的脚本,自动更改静态路由的网关。你可以参考一下。


{
:local rmark
:local markk
:local test
set rmark gateway]
set markk
:if ( $rmark != $markk) do={{/ip route set $test gateway= $rmark}
:log error "TR069网关地址不一致已更新" } else={
:log error "TR069网关地址一致不需要更新"
}}
页: [1]
查看完整版本: 条件未满足,为什么脚本一直被执行