OpenWRT19.07_命令行_重撥wan_重啟路由
轉載注明來源: 本文鏈接 來自osnosn的博客,寫於 2020-10-19.
寫OpenWRT的腳本時,需要用到一些重啟命令
以下的命令中的參數"wan",是基於wan口的名稱為"WAN"
ssh 登錄到openwrt上。 執行以下命令:
- 重啟路由
/sbin/reboot
, ssh 連接立刻就會斷開。 - 重啟所有網絡
/etc/init.d/network restart
, 這個命令會導致 ssh 連接卡住(約卡3-5秒),等到網絡重啟之后,ssh才會恢復。本機執行沒有問題。- 因為
network restart
先會ifdown -a
把所有網絡/網卡都停掉,再全部網卡重新啟動。
- 因為
- 重撥wan
/sbin/ifup wan
, 等於ifdown wan && ifup wan
。這個命令執行很快,ssh連接不卡,且立即就返回。wan口大約10秒后就換了個IP,對應的wan6也會換IP。- 這個 ifup 命令,最終是通過
ubus call network.interface down '{"interface":"wan"}'
+ubus call network.interface up '{"interface":"wan"}'
執行的。 - 顯式的執行
/sbin/ifdown wan && /sbin/ifup wan
也是沒有問題的。 - 實際使用中,僅執行
ifup wan
,有時發現ipv4不會變,僅ipv6變。所以為了更換IP,ifdown wan;sleep 2;ifup wan
更好。
- 這個 ifup 命令,最終是通過
- 在web界面Interfaces頁面,點擊WAN對應的 "Restart" 按鍵。其實執行的就是
/sbin/ifup wan
- 在web界面Interfaces頁面,點擊WAN對應的 "Stop" 按鍵。其實執行的就是
/sbin/ifdown wan
- 重啟wifi
/sbin/wifi down && /sbin/wifi up
實際使用
- 在Linux中創建一個 key, 用
ssh-keygen -t rsa -b 1024 -f opwrt
, 然后把 opwrt.pub 中的內容 copy 到 路由器的/etc/dropbear/authorized_keys
文件中。- shell腳本,重啟路由器就執行
ssh -i opwrt root@192.168.1.1 "/sbin/reboot"
- shell腳本,重撥wan口就執行
ssh -i opwrt root@192.168.1.1 "/sbin/ifup wan"
- python3腳本,
import subprocess
然后subprocess.getoutput('ssh -i opwrt root@192.168.1.1 "/sbin/ifup wan" ')
- 另: 以上的 ssh 可以再帶上一個參數
ssh -o "ConnectTimeout=5"
- shell腳本,重啟路由器就執行
- 在路由器中,
- 寫shell腳本,直接就執行
reboot
或者ifup wan
。 - lua 腳本,首先
require("luci.sys")
, 然后執行luci.sys.exec("/sbin/ifup wan")
- 寫shell腳本,直接就執行
- windows 的 bat 批處理
- 可以考慮用 putty的命令行版 plink.exe 去ssh登錄執行命令。(可以用 puttygen.exe 去生成key,放到authorized_keys中 )
其他1
- 如果頻繁掉線,可以考慮修改這兩個配置項。(修改方法,自行搜索)
- network -> interface -> WAN (pppoe) -> EDIT -> Advanced Settings ->
LCP echo failure threshold
和LCP echo interval
網絡 -> 接口 -> WAN (pppoe) -> 編輯 -> 高級設置 ->LCP 響應故障閥值
和LCP 響應間隔
- /etc/ppp/option 中的
lcp-echo-failure
和lcp-echo-interval
- network -> interface -> WAN (pppoe) -> EDIT -> Advanced Settings ->
- 有時會出現(偶爾),wan連接正常,但無法訪問網絡。可以考慮寫個腳本,定時執行。
- 思路是:
先訪問一下百度,看是否正常,再訪問一下搜狗,再訪問一下163。如果三個站都無法訪問,就執行ifup wan
重撥。
測試訪問幾個站,自己決定,測試哪幾個站,自己挑選。用shell編程即可,裝個完整版wget,用wget訪問,判斷返回值,就知道訪問是否成功。
記得設置timeout參數,wget的默認timeout好像是60秒,太長了。
還要設置重試次數大於2,防止第一次訪問因dns查詢返回太慢而失敗。 - 以下給出一個例子參考,需要
opkg install wget ca-bundle
支持。
然后放入 crontab 中定時執行*/10 * * * * /bin/sh /root/chk_net_redail.sh
- 思路是:
#!/bin/sh
# filename: /root/chk_net_redail.sh
# 4=network error/refused/timeout/dns err/
# need "opkg install wget ca-bundle"
count=0
URLs='http://baidu.com http://163.com http://www.qq.com http://sogou.com'
for host in $URLs ; do
#echo $host
# wget -t2 這個參數要>=2, 防止第一次訪問dns解析超時,而導致失敗
wget -q -T3 -t3 --method=HEAD --max-redirect=0 "$host"
if [ 4 -eq $? ]; then
echo $(date +%F_%T%z) $host 'error.' >> /root/log.redail
count=$((count+1))
else
break
fi
done
URL_cnt=$(echo $URLs|wc -w)
if [ $count -ge $URL_cnt ]; then
echo $(date +%F_%T%z) redail >> /root/log.redail
ifdown wan; sleep 1; ifup wan
fi
其他2
- 如果覺得openwrt中跑的定時任務太多,不想擠在一起,同時執行。
可以參考【Openwrt_Linux_crontab任務_順序執行腳本】