Bro脚本语法4-声明和语句(Declarations and Statements)
@(教程)[Bro]
Declarations
Name | Description |
---|---|
module | 改变当前模块 |
export | 从当前模块导出定义 |
global | 声明一个全局变量 |
const | 声明一个全局常量 |
type | 声明一个一用户自定义类型 |
redef | 重新定义一个全局值或者扩展一个用户自定义类型 |
function/event/hook | 声明一个 function/event/hook |
Statements
Name | Description |
---|---|
local | 声明一个局部变量 |
add, delete | 添加或删除元素 |
打印到标准输出或文件 | |
for, while, next, break | 遍历所有容器的元素(for), 条件循环(while). |
if | 表达式bool条件判断执行 |
switch, break, fallthrough | 计算表达式和匹配值执行语句 |
when | 异步执行 |
event, schedule | 调用或调度的事件处理程序 |
return | 从 function, hook, 或event 处理程序返回 |
声明
不能在 function, hook, event 处理函数中使用声明
必须在语句之前使用声明
module
关键字module 用于改变当前的module,这会影响任何随后全局标识符作用范围
例子:
module mymodule
如果一个全局的定义(global)声明在module的后面,那他的作用域在Bro脚本结束的地方或者在下一个module声明的位置,如果一个全局的声明在module的后面,但是在export 语句块中,那么它的作用域将扩展到最后一个load的bro脚本结束,但是在其他的module中它必须通过命名空间操作符(::)来进行引用
在一个bro脚本中,可以有多个module声明,同一个module也可以写在多个不同的bro脚本中
export
export 语句块将当前module中的一个或者多个声明(不能将语句块写在其中)导出,在其他module中,这些全局标识通过操作符”(::)”变得可见
例子:
export {
redef enum Log::ID += {
LOG};
type Info: record {
ts: time &log;
uid: sting &log;
};
const conntime = 30sec &redef;
}
注意,在导出块中括号是必须的,而且这个语句块也不需要用分号结束
global
声明一个全局变量
如果在声明的时候不指定类型,那么一定要赋一个初值,bro会实现类型推断,否则就一定要指定类型,或者在类型不能够准确推断的时候,也需要指定类型,例:
global pi = 3.14;
global host: set[addr];
global ciphers:table[sting] of sting = table();
在function ,event ,hook 外面的变量通常都需要用global 关键字(或者使用const 关键字);
在function ,event,hook 处理程序里面则不允许使用这个关键字,另外function 类型(不是函数体)也是可以通过global 关键字声明的.
global 关键字声明的变量作用域从声明的地方开始,到载入的脚本结束(同时,查看module 一节中的描述,当mudule改变的时候,对变量生命周期的改变)
const
const 用于声明一个常量
要求在声明的时候赋初值,同样的,类型可以被推断也可以准确指定
const