找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3802|回复: 10

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

[复制链接]
发表于 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 [/ip dhcp-client get [/ip dhcp-client find where interface=("wlan".$i)] status]
:if ($status="bound") do={
:set newip [/ip dhcp-client get [/ip dhcp-client find where interface=("wlan".$i)] gateway]
:set oldip [/ip route get [/ip route find dst-address=0.0.0.0/0 static=yes active=yes distance=1 comment=("tel-".$i)] gateway]
:set oldip [pick $oldip 0 12]}
:if ($newip != $oldip) do={
/ip route set [/ip route find comment=("tel-".$i)] gateway=($newip."%".("wlan".$i))
/ip route set [/ip route find comment=("tel-"."$i$i$i")] gateway=($newip."%".("wlan".$i))}}}
}




1.png
2.png
3.png
4.png
5.png
routeros
发表于 2022-3-18 11:23:06 | 显示全部楼层
本帖最后由 cspm333 于 2022-3-18 11:27 编辑

您script寫的太複雜了,dhcp-c裡有自己的script欄,也有特有的變數可利用。
Snap16.jpg
Snap18.jpg
  1. :foreach i in=tel-1,tel-111 do={/ip route set [find comment=$i] gateway="$"gateway-address"%wlan1"}
复制代码

如上,這樣wlan1 dhcp更新時自己會跑script。無需放在排程時時盯著gateway。

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

使用道具 举报

 楼主| 发表于 2022-3-18 12:20:29 | 显示全部楼层
cspm333 发表于 2022-3-18 11:23
您script寫的太複雜了,dhcp-c裡有自己的script欄,也有特有的變數可利用。

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

使用道具 举报

发表于 2022-3-18 16:12:21 | 显示全部楼层
本帖最后由 cspm333 于 2022-3-18 16:21 编辑

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

使用道具 举报

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

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


script.png

点评

漏了字,這個才正確 :set oldip [:pick $oldip 0 [find $oldip "%"]]  发表于 2022-3-18 19:08
:set oldip [:pick $oldip 0 [find $old "%"]]  发表于 2022-3-18 19:07
routeros
回复

使用道具 举报

 楼主| 发表于 2022-3-18 20:32:38 | 显示全部楼层
e_zhangiso 发表于 2022-3-18 17:26
找到原因,:set oldip 这个不起作用,如何提取附图,红框中第一位到"%"之间的数值

还是提取不出来,如附图:
{
:local oldip
:set oldip [/ip route get [/ip route find dst-address=0.0.0.0/0 static=yes  distance=1 comment="tel-2"] gateway]
:set oldip [:pick $oldip 0 [find $oldip "%"]]
:put $oldip
}
}



script_2.png
routeros
回复

使用道具 举报

发表于 2022-3-19 00:13:03 | 显示全部楼层
本帖最后由 cspm333 于 2022-3-19 00:14 编辑

2022-03-19 00-10-04 的螢幕擷圖.png
失誤是因抓出的值屬性為array,轉成str就沒問題了。

routeros
回复

使用道具 举报

 楼主| 发表于 2022-3-19 11:31:53 | 显示全部楼层
cspm333 发表于 2022-3-19 00:13
失誤是因抓出的值屬性為array,轉成str就沒問題了。

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

使用道具 举报

发表于 2022-3-19 21:58:53 | 显示全部楼层
我的是在/ip dhcp-client里面的脚本,自动更改静态路由的网关。你可以参考一下。


{
:local rmark
:local markk
:local test [/ip route find where comment="tr069ip"]
set rmark [/ip dhcp-client get [/ip dhcp-client find interface=ether9-tr069] gateway]
set markk [/ip route get $test gateway]
:if ( $rmark != $markk) do={{/ip route set $test gateway= $rmark}
:log error "TR069网关地址不一致已更新" } else={
:log error "TR069网关地址一致不需要更新"
}}
routeros
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|Archiver|手机版|小黑屋|软路由 ( 渝ICP备15001194号-1|渝公网安备 50011602500124号 )

GMT+8, 2024-4-19 20:57 , Processed in 0.220545 second(s), 6 queries , Gzip On, Redis On.

Powered by Discuz! X3.5 Licensed

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表