1 UCI命令
一个众所周知的原因,在Linux下各种软件包有各种不同的配置脚本,每个配置脚本的语法格式和操作方式不同,这样的设计虽然可以体现出各软件包自身的优势,同时也增加了学习曲线。在这一点上OpenWrt的UCI无疑处理的更胜一筹。UCI是集中式配置信息管理接口(Unified Configuration Interface)的缩写,他是OpenWrt引进的一套配置参数管理系统。UCI管理了OpenWrt下最主要的系统配置参数并且提供了简单、容易、标准化的人机交互接口。UCI中已经包含了网络配置、无线配置、系统信息配置等作为基本路由器所需的主要配置参数。同时UCI也可以帮助开发人员快速的建立一套基于OpenWrt的智能路由产品控制界面。
2 UCI的文件和流程
UCI的配置文件全部存储在/etc/config目录下。
root@OpenWrt:/# ls /etc/config/
dhcp dropbear firewall network system wireless
目前已有大量软件包支持UCI模式管理,但不是所有的软件包,支持的软件包是这样来完成启动的(以samba举例):
1). 启动脚本/etc/init.d/samba
2). 启动脚本通过UCI分析库从/etc/config/samba获得启动参数
3). 启动脚本完成正常启动
由于UCI的数据文件较为简单,并且具备了很nice的直接观感,所以配置文件既可以使用UCI命令进行修改,也可以使用VI编辑器直接修改文件。但如果两种方式都使用时需要注意UCI命令修改会产生缓存,每次修改好要尽快确认保存避免出现冲突。
最常见的几个UCI配置作用说明:
文件 | 作用 |
---|---|
/etc/config/dhcp | 面向LAN口提供的IP地址分配服务配置 |
/etc/config/dropbear | SSH服务配置 |
/etc/config/firewall | 路由转发,端口转发,防火墙规则 |
/etc/config/network | 自身网络接口配置 |
/etc/config/system | 时间服务器时区配置 |
/etc/config/wireless | 无线网络配置 |
3 UCI的文件语法
UCI文件语法举例:
config 'section-type' 'section'
option 'key' 'value'
list 'list_key' 'list_value'
config 'example' 'test'
option 'string' 'some value'
option 'boolean' '1'
list 'collection' 'first item'
list 'collection' 'second item'
config 节点,以关键字 config 开始的一行用来代表当前节点
section-type 节点类型
section 节点名称
option 选项,表示节点中的一个元素
key 键
value 值
list 列表选项,表示列表形式的一组参数。
list_key 列表键
list_value 列表值
config 节点语法格式:
config 'section-type' 'section'
config 节点(后文统一称为节点)原则
- UCI 允许只有节点类型的匿名节点存在
- 节点类型和名字建议使用单引号包含以免引起歧义
- 节点中可以包含多个 option 选项或 list 列表选项。
- 节点遇到文件结束或遇到下一个节点代表完成。
option 选项语法格式:
option 'key' 'value'
option 选项(后文统一称为选项)原则
- 选项的键与值建议使用单引号包含
- 避免相同的选项键存在于同一个节点,否则只有一个生效
list 列表选项语法格式:
list 'list_key' 'list_value'
list 列表选项(后文统一称为列表)原则
- 选项的键与值建议使用单引号包含
- 列表键的名字如果相同,则相同键的值将会被当作数组传递给相应软件
UCI 的语法容错:
option example value
option 'example' value
option example "value"
option "example" 'value'
option 'example' "value"
UCI 无法容忍的语法:
option 'example" "value'
option example some value with space
尽量使用常规字符去处理器 UCI,特殊字符有可能会破坏数据结构的完整性。
4 UCI 命令读写配置
语法格式:
uci [<options>] <command> [<arguments>]
读写规则:
- UCI 读取总是先读取内存中的缓存,然后再读取文件中的
- 进行过增加,修改,删除操作后要执行生效指令,否则所做修改只存留在缓存中
1. 读取类语法
取得节点类型:
uci get <config>.<section>
取得一个值:
uci get <config>.<section>.<option>
显示全部 UCI 配置:
uci show
显示指定文件配置:
uci show <config>
显示指定节点名字配置:
uci show <config>.<section>
显示指定选项配置:
uci show <config>.<section>.<option>
显示尚未生效的修改记录:
uci changes <config>
匿名节点显示(如果所显示内容有匿名节点,使用-X 参数可以显示出匿名节点的 ID):
uci show -X <config>.<section>.<option>
2. 写入类语法
增加一个匿名节点到文件:
uci add <config> <section-type>
增加一个节点到文件中:
uci set <config>.<section>=<section-type>
增加一个选项和值到节点中:
uci set <config>.<section>.<option>=<value>
增加一个值到列表中:
uci add_list <config>.<section>.<option>=<value>
修改一个节点的类型:
uci set <config>.<section>=<section-type>
修改一个选项的值:
uci set <config>.<section>.<option>=<value>
删除指定名字的节点:
uci delete <config>.<section>
删除指定选项:
uci delete <config>.<section>.<option>
删除列表:
uci delete <config>.<section>.<list>
删除列表中一个值:
uci del_list <config>.<section>.<option>=<string>
生效修改(任何写入类的语法,最终都要执行生效修改,否则所做修改只在缓存中,切记!):
uci commit <config>
5 举例
1、导出整个配置
2、查看所有配置项的值
3、查看特定配置项的值
4、查询网络接口的状态
5、添加防火墙规则
这是一个添加SSH端口转发到防火墙规则的例子,和’-1’使用的一个例子。
注意:
对于获取(设置同理)option的值,分两种情况,这边做一个解释:
配置文件为/etc/config/demo,内容如下:
1、节点有名称的情况。那么可以通过以下命令获取:
uci get <configFileName>.<sectionName>.optionName
如:
uci get demo.test1.op1 //获取到的值为123
uci get demo.bind.bindip //获取到的值为192.168.1.124
2、节点没有名称的情况。那么需要通过以下命令获取:
uci get <configFileName>.@<sectionType>[N].optionName
如:
uci get demo.@ssr[-1].server //获取到的值为1.2.3.8,-1代表最后一个配置
uci get demo.@ssr[0].server //获取到的值为1.2.3.4,0代表第一个配置
uci get demo.@ssr[1].server //获取到的值为1.2.3.5,1代表第二个配置
uci get demo.@ssr[2].server //获取到的值为1.2.3.6,2代表第三个配置
uci get demo.@ssr[3].server //获取到的值为1.2.3.7,3代表第四个配置
uci get demo.@ssr[4].server //获取到的值为1.2.3.8,4代表第五个配置
如果只有一个配置的情况下,那么下标-1和0获取到的是同一个值。