数据类型
Name(s) | Description |
---|---|
bool | |
count,int,double | 数字类型 |
time,interva | 时间类型,一个是绝对时间,一个是时间间隔,time无法指定,只能使用内置 |
string | 字符串 |
pattern | 正则表达式 |
port, addr, subnet | 网络;类型,顾名思义 |
enum | 枚举 |
table, set, vector, record | 集合类型 |
function, event, hook | 可执行类型 |
file | 文件类型,只用于写(还没搞懂,等搞懂再补) |
opaque | 还没搞懂,文档说是内置函数用的东西,什么时候用上了我再补 |
any | 任意类型 |
- int 与 count区别:
- int是64位有符号整数,count是64为无符号整数
-
支持运算符类型不同
-
time代表绝对时间,interva代表时间间隔
-
pattern
正则表达式,使用与flex词法分析器支持的模式相同的语法。模式支持两种类型的匹配,精确匹配和嵌入匹配。
相等关系运算符,例:
/foo|bar/ == "foo"
是true:
/foo|bar/ == "foobar"
是false。
在嵌入式匹配中,in运算符与一个 正则表达式(必须在左侧)和一个string一起使用,但是测试该模式是否出现在给定字符串内的任何位置。例如:
/foo|bar/ in "foobar"
产生true,而:
/^oob/ in "foobar"
为false,因为"oob"它没有出现在的开头"foobar"。 !in表达式将产生的否定in。
使用|运算符创建两个的(或)。例如:
/foo/ | /bar/ in "foobar"
true,
使用& 运算符,例如:
/foo/ & /bar/ in "foobar"
true,因为该模式/(foo)(bar)/出现在字符串中"foobar"。
指定正则表达式时,可以添加最终 i 说明符以将其标记为不区分大小写。例如,/foo|bar/i将匹配 "foo","Foo","BaR",等。
可以通过将不区分大小写的子模式包含在中来引入它(?i: \
- port
端口,无符号整数,支持比较符:== ,!=,<,<=, >,>=
当跨协议时比较顺序: unknown< tcp< udp< icmp,例如65535/tcp 小于0/udp (但是这样的表达式估计是没用,我是没想到为什么要比较端口的大小,也可能需要结合其他东西做入侵检测时使用,例如端口扫描)
- addr
ip地址,就是正常的ip地址形式,同时支持ipv4和ipv6 ,但是如果说前80位为0后16位为1其余32位为ipv4地址的ipv6地址被视为ipv4地址 下面是个做子网的例子
并检查是否包含在subnet使用in 或中!in:
-
subnet 子网 话不多说,举个例子:
192.168.1.0/24
-
enum 枚举,和c的枚举类型应该是一回事
-
table
table类型,分为两个组成部分,构造一个映射关系,相当于python中的dict, 两个部分indices和yield相对于dict的key, value。indices的值是原子类型或者是record类型,例:
table[port] of string
table类型,分为两个组成部分,构造一个映射关系,相当于python中的dict, 两个部分indices和yield相对于dict的key, value。indices的值是原子类型或者是record类型,例如:
table[port] of string
9. set
类似于table类型,只是没有yield部分,set类型的作用是维护元组的集合,用集合的索引表示
- record record类型是任意类型元素的一个集合,例如,下面的预定义conn_id类型,用于保存连接标识符,在zeek运行时候初始化,例:
-
vector 这玩意和table有点像,除了它的索引是从零开始的非负整数。
-
function
function 类型声明方式:
function( argument* ): type
argument就正常的方法接参数位置,type就是正常的返回类型
global greeting: function(name: string): string;
这里的greeting(这个玩意随便叫,自己起名) 看起来像是c或者c++的语法,先声明的方法名,然后后期进行定义,实现方式:
1.
function my_func()
{
print "my_func";
}
2.
greeting = function(name: string): string { return "Hi, " + name; };
print greeting("Dave");
zeek还支持匿名函数,实现方式:
local make_adder = function(n: count): function(m: count): count
{
return function (m: count): count
{
return n + m;
};
};
print make_adder(3)(5); # prints 8
local three = make_adder(3);
print three(5); # prints 8
<input type="button" value="点我啊!" id="sub">
<script>
//获得按钮元素
var sub=document.querySelector("#sub");
//给按钮增加点击事件。
sub.onclick=function(){
alert("当点击按钮时会执行到我哦!");
}
</script>
foo("test")
注:这里有一个问题,他的文档没有说明在调用的时候传递了已经设定默认值的参数后的值是谁,但是按我的想法,应该是传递的值
- event event在语法上和语义上与function基本上是一样的,但是event没有返回类型,并且无法在function中调用(zeek的文档说是不可调用,但是在后面有写在event、scgedule脚本中可以调用,所以我猜测应该是在function中无法调用),event例:
-
使用event脚本中的语句,立即对事件处理程序进行排队调用,例:
event password_exposed(user, password);
-
通过schedule脚本中的表达式,这个是延时调用,类似于定时器,例:
schedule 5 secs { password_exposed(user, password) };
zeek的event支持重载,原话:
Multiple alternate event prototype declarations are allowed, but the alternates must be some subset of the first, canonical prototype and arguments must match by name and type. This allows users to define handlers for any such prototype they may find convenient or for the core set of handlers to be extended, changed, or deprecated without breaking existing handlers a user may have written.
``` # Event Prototype Declarations global my_event: event(s: string, c: count); global my_event: event(c: count); global my_event: event();
Event Handler Definitions
event my_event(s: string, c: count) { print "my event", s, c; }
event my_event(c: count) { print "my event", c; }
event my_event() { print "my event"; } ``` 注:按照他的说法以及他的例子,我理解这玩意就是其他语言的重载
- hook
hook就是另一种类型的方法,有function和event的特征,支持重载,在调用方式上更像是function,可以通过执行break语句退出主体(这里的主体我不知道是当前的hook还是调用hook的地方),声明方式:
hook( argument* )
argument和function的一样.
重载实现例:
hook myhook(s: string, vs: vector of string) &priority=10
{
print "priority 10 myhook handler", s, vs;
s = "bye";
vs += "modified";
}
hook myhook(s: string, vs: vector of string)
{
print "break out of myhook handling", s, vs;
break;
}
hook myhook(s: string, vs: vector of string) &priority=-5
{
print "not going to happen", s, vs;
}
1. hook myhook("hi", vector("foo"));
2.if ( hook myhook("hi", vector("foo")) )
print "all handlers ran";
钩子的默认调用后会默认有一个bool的返回值,如果说是从头执行到尾的全部执行完了返回true,如果说是因为break而退出的就会返回false
- file
zeek支持写入文件(读取文件参考Input Framework),可以使用内置功能open和open_for_append打开文件,使用close关闭文件(这里其实和其他语言的文件读写一样,也得手动关闭),例:
注:zeek说是不赞成这种方法写log,写log要用Logging Framework。-
opaque 这个东西瞅zeek的文档的意思是实际表示/实现被有意隐藏,好处就是可以将功能集成到zeek而无需向脚本语言添加全新的类型,这个东西后期用的时候再补文档吧
-
any
应该就是js、java和c#中的var,zeek说是不建议使用,主要用的是zeek附带的一些内置函数和脚本使用
- void
zeek内部的类型(正常的脚本是没有这个关键字的),表示不存在的返回类型