Openwrt的uci接口

2023-11-04

UCI是Unified Configuration Interface的缩写,翻译成中文就是统一配置接口,用途就是为OpenWrt提供一个集中控制的接口。OpenWrt实现的这个工具,能够让你的不管是Lua还是PHP程序,或者SHELL程序或C程序,只要执行命令传输参数就能达到修改系统参数的目的,请参考本文后面的命令行实用工具

系统的配置应该简单直接,UCI的设计初衷即是这样的,它是NVRAM-based配置方法的继承者(基于NVRAM的配置方法起源于OpenWrt的White Russian系列,该版本目前不再更新,最后发布于2007年,版本号为0.9)。UCI可以视为OpenWrt系统功能设置的主要用户配置接口,通常来说这些配置与系统的功能关联性较大,想像一样我们平常所使用的路由器或嵌入式设备中的WEB界面中的那些配置项,就是路由器或嵌入式设备系统所集成了的功能。常见的例子如路由器的网络接口设置,无线参数设置,logging设置和远程登录设置等。

UCI目前已经支持有一小部分应用程序,因而对这些应用程序的控制会变得更加简单一些。这些第三方应用程序都会有自己的配置文件,不同的语法,不同的文件位置,如

/etc/network/interfaces

/etc/exports

/etc/dnsmasq.conf

或/etc/samba/samba.conf

由于UCI统一配置接口的出现,对这些第三方应用程序的配置只需要修改UCI的配置文件即可,就不必再去找不同的目录,写不同的语法了。当然,你安装的大多数第三方应用程序都没有提供UCI配置接口,很可能是因为这些应用程序本身就不需要向普通用户提供应用程序接口,配置文件是给开发者使用的,从这个角度上来看,没有提供UCI接口反而更好。因而,OpenWrt包维护人员只选定了一小部分必需的程序实现了UCI配置接口,下面有列出(Therefore, only a few selected programs which benefit from availability of a centralised configuration have been made UCI-compatible by the OpenWrt package maintainers (see the UCI configuration file list below))。

许多第三方程序是根据它自己对应于/etc/config下的UCI配置文件的选项去设置程序的原始配置文件,这样就实现了程序对UCI配置的兼容,然后执行一次/etc/init.d脚本完成一次配置。因而当你启动一个某个程序的UCI兼容的进程脚本时,该脚本应该不只是修改/etc/config下对应的UCI配置文件,同时也应该覆盖程序自己的原配置文件。比如Samba/CIFS程序,其原配置文件是在/etc/samba/smb.conf,而对应的UCI文件是/etc/config/samba,当/etc/config/samba文件被修改了之后,需要运行一次

/etc/init.d/samba start

之后UCI文件中的设置才会更新到原配置文件中去。

除此之外,应用程序的配置文件常常是存放在RAM而不是FLASH中,因为它不需要每次修改参数之后就去写非易性闪存了,而只在应用改变的时候它才会根据UCI文件去写非易性闪存(原文:In addition, the application's configuration file is often stored in RAM instead of in flash, because it does not need to be stored in non-volatile memory and it is rewritten after every change, based on the UCI file.)。

OpenWrt的wiki里有一篇文章NotUCI Configuration列举了一些与UCI不兼容的自带程序,而其它的第三方程序,你得自己去查阅程序的说明了。

一般规则

UCI的配置文件被分割成/etc/config下的多个独立的文件,各个文件按名字含义对应系统的不同的功能配置。你可以通过文本编译器或者uci实用程序去修改这些配置文件,同时uci还提供了C语言/脚本/Lua等语言的应用程序接口,WEB配置页面例如Luci就是利用了uci所提供的API而实现对UCI配置文件的修改的。

不管你是采用文本编辑器还是通过命令行的方式修改了UCI配置文件,相应的服务或应用程序不会自动更新状态,这时你都必须调用一次/etc/init.d (re)start才能使刚刚对UCI配置文件的修改生效。许多兼容UCI的程序采用这样的方法来应用更新:在init.d脚本执行流中去修改自己程序的配置文件。具体说来,init.d脚本先去修改自己程序的原配置文件中的信息(如/etc/samba/smb.conf),之后重启一次应用程序,应用程序就会去读自己的配置文件(刚刚被init.d更新过的)再启动,这样应用程序的状态就更新了。仅仅重启应用程序,而不执行init.d脚本的话,/etc/config下的UCI配置文件是不会应用于应用程序的,新配置也就不生效了。

 举个例子:

先登录到路由器的WEB页面把WiFi给禁用掉,这个时候你的手机搜索到你的路由器发送的SSID了,我这儿是NGTestRouter。

这时我们准备通过使用文本编辑器修改UCI再应用的方法来现使能WiFi,步骤如下:

编辑wireless文件把disabled这个项注释掉(也就是enable WiFi了)

#vi /etc/config/wireless

然后运行一次

#/etc/init.d/network restart

这时你的手机又可以看到NGTestRouter这个热点了!

UCI配置文件

(请参考原链接http://wiki.openwrt.org/doc/uci#configuration.files

文件语法

uci配置文件通常包含有一个或多个语句。所谓段(section),包含有一个或多个option语句,这些语句定义了实际的值。

下面是一个简单的配置文件:

package 'example'

config 'example' 'test'
        option   'string'      'some value'
        option   'boolean'     '1'
        list     'collection'  'first item'
        list     'collection'  'second item'
  • config 'example' 'test'表示一个段的开始,其中example是段的类型,test为段的名字。段也可以没有名字,像config 'example',但是必须要有类型,类型指示了uci程序怎么去处理后面的option内容;
  • option 'string' 'some value'和option 'boolean' '1'两个语句定义了段内的两个标识符的值,虽然它们一个是string一个是boolean,但是在语法没有任何区别。boolean后面可以跟'0', 'no', 'off', 'false'中的一个作为否的值,或者'1', 'yes', 'on', 'true'作为逻辑是的值;
  • 后面两行以list开头的语句,是为某个有多种选项值的option所定义的,在同一option中的选项值,它们应该有同样的名字,在这里的名字为collection。最张这两个值为收纳到同一个list表中,表中出现的顺序即你这里所定义的;
  • 标识符option和list是为了更易读而加上的,没有它们也是可以的;
  • 如果某个option没有但它不是必须的,那么uci处理程序会假定一个默认值;如果该option是必须的,而文件中没有定义,那么uci会报错或者显现出奇怪的结果;

语句中的标识和值可不必使用引号引起,除非你的字段值含有空格或者tab键。如果使用引号,那你可以随意使用单引号或者双引号。比如这样子:

option example value
option 'example' value
option example "value"
option "example" 'value'
option 'example' "value"

不过不能这样子(引号混用,字段中有空格但未用引号引起来):

option 'example" "value' (quotes are unbalanced)
option example some value with space (note the missing quotes around the value)

UCI的文件名和标识符(像option example value中的example即为标识符,value为option的值)可以使用a-z, 0-9和下划线_组合的任意字符串,不允许使用横杠线-,而option的值可以傅任意字符(像空格这样子的字段值需要用引号引起)。

 

命令行实用工具

 修改配置的一种方法是直接去修改UCI配置文件。不过,UCI配置文件读和写操作都可以通过uci命令行实用工具来完成,因而如果你自己去写一个脚本来解析或写入UCI配置文件不是一个明智的选择,既浪费时间又不一定写得好。以下介绍如何使用uci命令行实用工具,并伴有一些实例参考:

在学习该工具前需要注意:uci会把先读到UCI文件,其中不认识的所有命令参数和注释会被删除!所以,像uhttpd这样安装地有详细注释的文件,在使用uci操作之后其中的注释就会被抹掉的。OpenWrt的默认WEB界面Luci就是采用了uci来写UCI文件

用法

执行下面命令查看

root@OpenWrt:~#uci

 

例子

设置一个值

把uhttpd的监听端口从80换成8080

root@OpenWrt:~# uci set uhttpd.main.listen_http=8080 
root@OpenWrt:~# uci commit uhttpd 
root@OpenWrt:~# /etc/init.d/uhttpd restart 
root@OpenWrt:~#

导出整体配置信息

root@OpenWrt:~# uci export httpd 
package 'httpd' 

config 'httpd' 
    option 'port' '80' 
    option 'home' '/www' 

root@OpenWrt:~#

显示一个给定配置的树

root@OpenWrt:~# uci show httpd 
httpd.@httpd[0]=httpd 
httpd.@httpd[0].port=80 
httpd.@httpd[0].home=/www 
root@OpenWrt:~#

显示一个option的值

root@OpenWrt:~# uci get httpd.@httpd[0].port 
80 
root@OpenWrt:~#

追加list的一个条目

uci add_list system.ntp.server='0.de.pool.ntp.org'

替换一个list

uci delete system.ntp.server 
uci add_list system.ntp.server='0.de.pool.ntp.org' 
uci add_list system.ntp.server='1.de.pool.ntp.org' 
uci add_list system.ntp.server='2.de.pool.ntp.org'

UCI路径

假设有下面的UCI文件

# /etc/config/foo 
config bar 'first' 
    option name 'Mr. First' 
config bar 
    option name 'Mr. Second' 
config bar 'third' 
    option name 'Mr. Third'

那么下面三组路径的执行得到的值分别各自相等

# Mr. First 
uci get foo.@bar[0].name 
uci get foo.@bar[-0].name 
uci get foo.@bar[-3].name 
uci get foo.first.name 

# Mr. Second 
uci get foo.@bar[1].name 
uci get foo.@bar[-2].name 
# uci get foo.second.name 本条语句不工作,因为second没有定义 

# Mr. Third 
uci get foo.@bar[2].name 
uci get foo.@bar[-1].name 
uci get foo.third.name

如果show,则会得到这样的值

# uci show foo 
foo.first=bar 
foo.first.name=Mr. First 
foo.@bar[0]=bar 
foo.@bar[0].name=Mr. Second 
foo.third=bar 
foo.third.name=Mr. Third

执行uci show foo.@bar[0]得到

# uci show foo.@bar[0] 
foo.first=bar 
foo.first.name=Mr. First

查询输出

root@OpenWrt:~# uci -P/var/state show network.wan
uci: Entry not found
network.loopback=interface
network.loopback.ifname=lo
network.loopback.proto=static
network.loopback.ipaddr=127.0.0.1
network.loopback.netmask=255.0.0.0
network.loopback.up=1
network.loopback.connect_time=10749
network.loopback.device=lo
network.lan=interface
network.lan.type=bridge
network.lan.proto=static
network.lan.netmask=255.255.255.0
network.lan.ipaddr=10.0.11.233
network.lan.gateway=10.0.11.254
network.lan.dns=8.8.8.8
network.lan.up=1
network.lan.connect_time=10747
network.lan.device=eth0
network.lan.ifname=br-lan

添加防火墙规则

这个例子不仅演示了如何添加TCP SSH防火墙规则,同时也演示uci的negative (-1)语法。

root@OpenWrt:~# uci add firewall rule 
root@OpenWrt:~# uci set firewall.@rule[-1].src=wan 
root@OpenWrt:~# uci set firewall.@rule[-1].target=ACCEPT 
root@OpenWrt:~# uci set firewall.@rule[-1].proto=tcp 
root@OpenWrt:~# uci set firewall.@rule[-1].dest_port=22 
root@OpenWrt:~# uci commit firewall 
root@OpenWrt:~# /etc/init.d/firewall restart

获取SSID

root@OpenWrt:~# uci get wireless.@wifi-iface[-1].ssid
NGTestRouter

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Openwrt的uci接口 的相关文章

  • OpenWrt目录结构及编译过程

    OpenWrt代码有8个固定的顶层目录以及7个编译时创建的临时目录 顶层目录 docs docs目录 用于存放开发文档 编译时不需要 包含了整个宿主机的文件源码的介绍 里面还有Makefile为目标系统生成docs 使用make C doc
  • 解决GO语言编译程序在openwrt(mipsle架构)上运行提示Illegal instruction问题

    RT 最近在研究openwrt mipsle架构 上运行go语言编译出来的程序 一运行就报 Illegal instruction 这样的错误 百度和Google搜索了一遍 得出两种解决方案 PS 更新一遍 当时写这个文档的时候没有发现Go
  • 编译 openwrt 及初始配置-及部分排错

    主机为 ubuntu 14 x64 硬件 优酷土豆宝 cpuMT7620A 内存128M flash 32M 有2个源 用哪个也可以 git clone https github com openwrt openwrt git git cl
  • 取消GL.iNet路由器视频的密码

    每次路由器访问192 168 8 1 8083 action stream时总是无法访问 但是先进入192 168 8 1登录以后再去刷新视频就可以出来 即使取消外网登录验证也还是没效果 最后发现广大网友的意见是重新刷固件 先去GL iNe
  • 青龙脚本 小黄鸟配合虚拟机抓变量 软件集

    鉴于很多青龙脚本变量 真机很难抓到 需要小黄鸟配合虚拟机抓变量 为方便网友 把相关3个软件分享 以单个文件形式 1 小黄鸟 https wwm lanzouy com i5vWT01qi6na 2 虚拟机 https wwm lanzouy
  • 基于openwrt,aria2下载器安装与配置

    迅雷下载不好用 所以用这个下载器aria2 需要安装软件 在可用软件列表中安装aria2和luci app aria2 安装完后有可能需要重启路由器 需要注意的问题 1 aria2只是一个下载工具 并没有图形界面 2 文件下载的位置 在ar
  • PHP启动warning:PHP Startup: Unable to load dynamic library 'curl.so'

    高通ar9531上面 openwrt1806这个版本 通过opkg安装了官方的php及其扩展 但新的板子php启动的时候报了warning 没有太仔细看 但是后面运行cgi程序时 发现了问题 回头看warning日志 PHP Warning
  • 基于openwrt平台搭建局域网技术验证之二

    1 测试目的 验证l2tp服务器模式的可行性 提供vpn l2tp模式的服务器功能 供客户端连接访问内网 2 参考资料 参考连接1 https www jianshu com p ccf8f2cca70e 参考连接2 https openw
  • opkg 更新软件

    opkg 不同的版本存在不同的配置文件 一般常用的是 etc opkg conf etc opkg customfeeds conf 和 etc opkg distfeeds conf三个 这三个配置文件将会影响opkg运行时软件资源的取向
  • 红米ac2100 刷openwrt以及刷回记录

    redmiac2100 刷机 参考 手动升级漏洞固件 https wwx lanzoux com i6iqxhqp98f 或者百度网盘链接 https pan baidu com s 1H355Ym9p TLrVOux2w2b7Q 提取码
  • OpenWrt后台管理启用https-OpenSSL

    OpenWrt 默认使用http 访问管理后台 这样不安全 推荐修改为 https 访问 加密数据传输 本文介绍配置步骤 1 卸载旧的ssl软件包 root OpenWrt opkg remove luci ssl px5g px5g mb
  • Openwrt按键检测分析-窥探Linux内核与用户空间通讯机制netlink使用

    首先看一下Openwrt系统中关于按键功能的使用和修改 以18 06版本为例 按键功能实现在脚本中 比如18 06 package base files files etc rc button reset bin sh lib functi
  • openwrt下使用SDK编译ipk包遇到Package hiOpenwrt is missing dependencies for the following libraries: libc.so.

    openwrt下使用SDK编译ipk包遇到Package hiOpenwrt is missing dependencies for the following libraries libc so 6 问题 缺少 libc so 6 库 但
  • openwrt设置定时重启(天/周/月)

    1 进入openwrt管理页面 找到 系统 计划任务 编辑命令行 点击 保存 2 系统 启动项 中找到cron 确认状态为 开启 点击 重启 使计划生效 或重启系统 说明 一定要设置延时 防止无限重启 每天凌晨1点45分 延时70秒后自动重
  • OpenWrt的SR9000有线网卡驱动

    SR9000芯片的有线网卡驱动可以直接使用kmod usb net CDC ether 若为编译 可采取如下措施 make menuconfig kernel module usb support kmod usb net CDC ethe
  • UCI提供给shell和lua使用的配置接口

    转自 http m blog csdn net article details id 47989493 1 uci提供给shell使用的配置借口有两套 1 config get用来读取一个config值 命令格式如下 config getv
  • 刷新完固件后opkg update报错的解决方法

    刷新完固件后opkg update报错的解决方法 一 更改设备ip 当你使用lan口接入局域网后 如果你ping不通局域网上的其他设备ip 那么需要更改ip vim etc config network 修改lan口的ip为局域网下同一网段
  • jshn - 如何解析 json 包

    我想知道如何在openwrt上轻松解析json 我有 jhsn 来解析 json 这是我的程序 sh 脚本 download weather wget api openweathermap org data 2 5 weather id 2
  • 通过 SNMP 访问路由表

    如果我尝试查找安装了 openWRT 的 Linksys WRT54G 的路由表 我需要哪个 MIB 那应该是MIB II SNMP 对象 ID OID 为 1 3 6 1 2 1 4 21 可转换为ip ipRouteTable 这对我在
  • 安装“opkg”?

    我正在尝试将软件包安装到我的 OpenWrt SDK 中 为此 您必须通过键入以下内容来使用 OPKG 包管理器 opkg update opkg install

随机推荐

  • MySql范围查找时,索引不生效问题原因

    1 问题描述 本文对建立好的复合索引进行排序 并取记录中非索引字段 发现索引不生效 例如 有如下表 DDL语句为 CREATE TABLE employees emp no int 11 NOT NULL birth date date N
  • pandas 常见绘图总结

    pandas 常见绘图总结 文章目录 pandas 常见绘图总结 前言 一 设置字体和显示中文 二 pandas 可视化 0 25 3版本 1 线形图 2 条形图 2 1 垂直条形图 2 2 水平条形图 3 饼图 4 散点图 4 1 普通散
  • TensorFlow实现梯度下降法求解一元和多元线性回归问题

    使用TensorFlow求解一元线性回归问题 import tensorflow as tf import numpy as np import matplotlib pyplot as plt 设置字体 plt rcParams font
  • Vue触发兄弟级组件中的某个方法

    要求 页面上有两个兄弟级组件 假如我点击组件 1 中的按钮 需要触发组件 2 中的某个方法 在这里 以购物车页面为例 我选择商品列表中的某个商品选中状态 在结算组件中根据列表中是否有未选中状态判断全选状态 效果 第一步 在父级页面引入两个兄
  • infura上部署以太坊智能合约

    Infura是一个托管的以太坊节点集群 可以将你开发的以太坊智能合约发布到infura提供的节点上 而无需搭建自己的以太坊节点 可能你还不了解Infura 但如果你使用过MetaMask 那么就已经接触过Infura了 因为它是MetaMa
  • 除了负载均衡,Nginx 能做的真是太强大了!

    Nginx应该是现在最火的web和反向代理服务器 没有之一 她是一款诞生于俄罗斯的高性能web服务器 尤其在高并发情况下 相较Apache 有优异的表现 那除了负载均衡 她还有什么其他的用途呢 下面我们来看下 一 静态代理 Nginx擅长处
  • 赛普拉斯 12864_如何使用赛普拉斯自动化辅助功能测试

    赛普拉斯 12864 In my previous post I covered how to add screenshot testing in Cypress to ensure components don t unintention
  • 免疫受体 AIRR 分析平台 immuneML 简介

    前言 免疫系统在肿瘤分型和治疗中发挥着重要的作用 TCR 和 BCR 都属于适应性免疫受体 Adaptive immune receptor repertoires AIRR AIRR 组成信息结合 MHC 年龄 性别等 在基于受体库的预测
  • USB设备的Vendor ID和Product ID是什么?有什么样?接到不同的pc他们的ID还是一样的吗?

    USB设备的Vendor ID 厂商识别码 和Product ID 产品识别码 是用来标识USB设备的两个数字代码 Vendor ID是由USB Implementers Forum颁发给厂商的唯一标识码 而Product ID则是由厂商自
  • ITM机制-不用串口也能printf

    在PC上编写过C语言的人都知道 printf可以向控制台输出 scanf可以从控制台获取输入 这里的printf scanf都是标准库函数 利用这些函数 我们可以很方便的调试程序 printf的方式有很多种 一般情况下 我们可以使用串口或其
  • 像素鸟html代码,flappy-bird方块版(用小方块替代像素鸟)

    实例简介 flappy bird方块版 实例截图 核心代码 Initialize Phaser and creates a 400x490px game var game new Phaser Game 400 490 Phaser AUT
  • IDEA找不到vue插件下载,使用外部安装vue.js插件的方法

    setting plugins中找不到Vue js插件 使用IDEA时打开Setting gt Plugins找不到vue js插件 看其他网友Marketplace和Installed找不到还会提示Browse repositories
  • 新手学编程必会的100个代码

    前言 我记得刚开始接触编程的时候 觉得太难了 也很好奇 写代码的那些人也太厉害了吧 全是英文的 他们的英文水平一定很好吧 他们是怎么记住这么多代码格式的 而且错了一个标点符号 整个程序都会有影响 一个程序几千行 错一个标点符号都不行这也太难
  • python 代码 给点云增加随机噪音同时保留原有点云

    微信 394467238 有的时候我们需要把原有的点云数据扩充一下 让它的鲁棒性更强 思路很简单 就是先生成一个随机的正态分布的噪音 然后加到点云原有的XYZ数据上面 直接放代码 代码已经运行过了 没有问题 代码中的 std 就是正态分布的
  • 记录一下mac mini 2018 的折腾过程

    更新 昨天手贱在外置雷电SSD中安装了苹果内置SSD的驱动 随即就造成了外置显卡的挂载不上 又折腾了大概三个小时 随后想到了应该是操作系统内部资源竞争 造成不挂载外置显卡 随后删除了内置SSD的驱动 然后才挂载外置显卡成功 还有一点就是 外
  • SendMessage()窗体之间发消息

    SendMessage调用一个窗口的窗口函数 将一条消息发给那个窗口 一 父窗口向子窗口发消息 1 接收方 1 1头文件里面声明消息 define MSG UPDATE LEFT CHILD WM USER 600 1 2消息映射 在头文件
  • halcon基本图像操作

    halcon基本图像操作 阈值分割 取某一个阈值下的某一个区域 获取中心点位置 形态学 膨胀 腐蚀 开运算 闭运算 综合使用 开运算和检测轮廓 字符识别 资源路径 F halcon halconStudy 阈值分割 灰度值 读取图像 转灰度
  • 在线接口测试工具(神器)

    前方高能 请注意 想必大家都用过POSTMAN 进行接口的测试吧 那么接下来我告诉你 你用了这个工具以后 你就不会再想去用POSTMAN了 话不多说了 直接上代码吧 还是那句话 我会尽可能详细的去演示操作过程 避免大家走弯路 123456
  • MySQL阅读网上MySQL文章有感的杂记

    前言 本篇文章将会记录各大MySQL文章的一些有意思的内容摘取 以及一些问题的提问 并且持续更新 并且MySQL专栏将会记录MySQL常考的场景题等实战 问题归类 1 MySQL从加锁范围上分为哪三类 2 全局锁加锁方法的执行命令是什么 主
  • Openwrt的uci接口

    UCI是Unified Configuration Interface的缩写 翻译成中文就是统一配置接口 用途就是为OpenWrt提供一个集中控制的接口 OpenWrt实现的这个工具 能够让你的不管是Lua还是PHP程序 或者SHELL程序