Saltar al contenido
sudoquest@root
MikroTik

La consola y los scripts

Un refugio sin nadie en invierno: where y find, export a un archivo, scripts, el scheduler a su hora y netwatch que pasa al 4G si cae la fibra.

50 min de lectura

El Refugio Collado está a 2.000 metros y, de noviembre a mayo, no sube nadie. Su hEX tiene que arreglárselas solo: en ether1 llega la fibra; en ether2, un router 4G de respaldo; en ether3, el PC del guarda; y en ether4, la wifi de los huéspedes. Lo que hasta ahora hacías en Winbox, aquí lo hace el router por su cuenta: scripts, el scheduler (a su hora) y netwatch (cuando algo cae). Todo empieza en la consola.

La consola: where y find

En la consola te mueves por los menús como por carpetas (/ip route, .. para subir, / para la raíz), Tab completa y F1 dice lo que puede ir. print enseña una lista; con where, solo lo que cumple una condición: =, !=, ~ (lleva), <, >, con and, or, ! y paréntesis.

[admin@R-Collado] > /ip route print where gateway=203.0.113.1
Flags: A - ACTIVE; s - STATIC
Columns: DST-ADDRESS, GATEWAY, ROUTING-TABLE, DISTANCE
#    DST-ADDRESS  GATEWAY      ROUTING-TABLE  DISTANCE
;;; Fibra
0 As 0.0.0.0/0    203.0.113.1  main                  1
;;; Vigia
1 As 1.1.1.1/32   203.0.113.1  main                  1

find busca lo mismo, pero no enseña nada: devuelve las filas, para hacerles algo a todas de una vez. Va entre corchetes, como argumento de otra orden.

[admin@R-Collado] > /ip route disable [find gateway=192.168.8.1]

print count-only dice cuántas hay; print terse, una fila por línea, todo junto; y print proplist=name,running, solo esas columnas.

Ejercicio

Las rutas del 4G, de una vez

El operador del 4G avisa de que corta el servicio esta semana. Apaga todas las rutas que van por el 4G (gateway 192.168.8.1): son varias, y con find y where se apagan de una vez. Las de la fibra se quedan como están.

Encendiendo el router…

export e import: la copia en texto

export escribe la configuración como las órdenes que la crean: se lee, se compara y se pega en otro router. Sin nada, todo; desde un menú, solo lo suyo (/ip address export). Con file=, en vez de enseñarlo, lo guarda en un archivo .rsc (en Winbox, en Files).

[admin@R-Collado] > /export file=refugio
[admin@R-Collado] > /file print
Columns: NAME, TYPE, SIZE, LAST-MODIFIED
# NAME         TYPE       SIZE  LAST-MODIFIED      
0 skins        directory        2026-10-19 09:00:00
1 refugio.rsc  script      782  2026-10-19 09:00:00

import hace lo que lleva el archivo, línea a línea, como si lo escribieras tú.

[admin@R-Collado] > /import file-name=refugio.rsc
Script Error: failure: already have such address (/ip/address/add; line 9)

Ejercicio

La copia, en un archivo

Antes de que suba el último guarda, deja una copia de toda la configuración en un archivo del router: refugio.rsc. Es texto: se puede leer, y con import vuelve.

Encendiendo el router…

El lenguaje de scripts

Lo que empieza por dos puntos es del lenguaje: :put enseña algo, :log lo apunta en el log, :local y :global guardan valores. Las cuentas van entre paréntesis, y lo que devuelve una orden, entre corchetes.

[admin@R-Collado] > :put ("altura: " . 2000)
altura: 2000
[admin@R-Collado] > :put [/ip address get [find interface=ether3] address]
192.168.88.1/24
[admin@R-Collado] > :foreach i in=[/interface find] do={ :put [/interface get $i name] }
ether1
ether2
ether3
ether4
ether5
lo

Hay :if (…) do={…} else={…}, :for i from=1 to=3 do={…}, :len (cuánto mide algo), :pick (un trozo), :delay 2s (esperar) y :do {…} on-error={…} (si falla, hacer otra cosa).

Los scripts del router

Un script con nombre se guarda en /system script (en Winbox, System ▸ Scripts) y se hace con run (o con Run Script). Cada vez cuenta una más y apunta cuándo.

[admin@R-Collado] > /system script add name=estado source=":log info (\"Refugio: \" . [/system identity get name] . \" en marcha\")"
[admin@R-Collado] > /system script run estado
[admin@R-Collado] > /log print where topics~"script"
 2026-10-19 09:05:40 script,info Refugio: R-Collado en marcha

Ejercicio

El parte en el log

Crea un script, parte, que deje en el log cuántas interfaces tienen enlace, así: «Refugio: 5 interfaces con enlace». Que lo cuente él cada vez (si cae un cable, que diga uno menos), no que lleve el número escrito.

Encendiendo el router…

El scheduler: a su hora

/system scheduler (System ▸ Scheduler) hace algo a una hora (start-time) y luego cada interval. on-event es el nombre de un script o el código mismo. Con start-time=startup, al arrancar el router.

[admin@R-Collado] > /system scheduler add name=copia-noche start-time=03:00:00 interval=1d on-event=copia
[admin@R-Collado] > /system scheduler print
Columns: NAME, START-DATE, START-TIME, INTERVAL, ON-EVENT, RUN-COUNT
# NAME         START-DATE  START-TIME  INTERVAL  ON-EVENT  R
0 copia-noche  2026-10-19  03:00:00    1d        copia     0

Ejercicio

El silencio nocturno

En el refugio, de 23:00 a 07:00 hay silencio: la wifi de los huéspedes (ether4) se apaga a las 23:00 y vuelve a las 07:00, cada día. Con el scheduler, sin que nadie tenga que acordarse.

Encendiendo el router…

netwatch: cuando algo cae

/tool netwatch (Tools ▸ Netwatch) mira a un host cada interval: si deja de contestar, hace su down-script; si vuelve, su up-script. Con él, el refugio pasa al 4G solo. Cada uno puede llevar varias órdenes, separadas por punto y coma: desactivar la ruta y, además, apuntarlo con :log warning "…" (o :log info "…"). El refugio sale por la ruta por defecto activa con menos distance: la de la fibra (1) y, si está desactivada, la del 4G (2); si la desactivas a mano para probar, se queda así hasta que alguien la vuelva a activar.

La trampa: si vigilas 8.8.8.8 y apagas la ruta de la fibra, 8.8.8.8 vuelve a contestar… por el 4G, y netwatch cree que la fibra ha vuelto. Por eso se vigila un host al que solo se llega por la fibra: una ruta propia, 1.1.1.1/32 por la fibra, la vigía.

[admin@R-Collado] > /tool netwatch add host=1.1.1.1 interval=10s down-script="/ip route disable [find comment=Fibra]" up-script="/ip route enable [find comment=Fibra]"
[admin@R-Collado] > /tool netwatch print
Columns: TYPE, HOST, TIMEOUT, INTERVAL, STATUS
# TYPE    HOST     TIMEOUT  INTERVAL  STATUS 
;;; Warning: probe waiting startup-delay=5m; 5m remaining
0 simple  1.1.1.1           10s       unknown

Ejercicio

Si cae la fibra, el 4G

Cuando la fibra se queda muda, el enlace sigue arriba: el router no se entera y lo sigue mandando todo por ella. Vigila 1.1.1.1 (solo se llega por la fibra: ya tiene su ruta) con netwatch: si deja de contestar, desactiva la ruta de la fibra (comment=Fibra); si vuelve, actívala.

Encendiendo el router…

Cuando un script falla

Un script que falla para en la orden que falla, y lo apunta en el log (script,error): si lo lanzó el scheduler, con su nombre y la línea.

[admin@R-Collado] > /log print where topics~"error"
 2026-10-19 08:55:02 script,error executing script
2026-10-19 08:55:02 script,error,debug (scheduler:arranque) no such item (/interface/enable; line 1)

Ejercicio

El arranque que falla

Tras el último corte de luz, la wifi de los huéspedes no volvió: el instalador dejó un script que la enciende al arrancar (el scheduler lo lanza en startup), pero falla. Mira el log, arregla el script y comprueba que, al arrancar, la wifi vuelve y el log dice «Refugio en marcha».

Encendiendo el router…

Lo del tema, en Winbox

Para En la consola En Winbox
Lo que cumple algo /ip route print where gateway=… El buscador (Find) de cada lista
La copia en texto /export file=refugio New Terminal (y Files para verla)
Un script /system script add name=… source=… System ▸ Scripts ▸ +
Hacerlo /system script run estado Run Script
A su hora /system scheduler add start-time=… interval=… on-event=… System ▸ Scheduler ▸ +
Si algo cae /tool netwatch add host=… down-script=… up-script=… Tools ▸ Netwatch ▸ +
Lo que pasó /log print where … Log