UCI命令系统

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获取到的是同一个值。

发布了21 篇原创文章 · 获赞 11 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/hexf9632/article/details/100893086