关于讲课
今天扮演了一下内部认证讲师评审的学员,我几乎没有关心讲课的内容,只是在观察一些讲课的技巧和注意事项。每次讲完,评委都会给出一些意见和建议,对我来讲也是一次难得的学习机会,在观察别人的授课的过程中,我也深深地发现自己授课的水平简直就是烂到家了,以后要多学习,多锻炼。
这次听课使我有幸看到了传说中的邹立巍老师的讲课的风范,他的授课水平我很是赞叹;这次授课,他没有将太多深奥的东西,但就一点点linux的权限的知识便非常好地体现出了他讲课的水平。回头想想我当时将的东西,虽然比他讲的内容有深度,也更实用,但是我讲的就缺点多多,问题多多;所以说,像这样的内部讲师评审不需要讲太NB的东西,重要的是你对授课技巧的掌握。
下面简要地列几点注意事项:
- 不要总是随意地走动(也不要一动不动)
- 要面带微笑
- 要会使用道具
- 衣着要整洁
- 要让听众知道所讲的东西对他们有用
- 不要总是说这个东西对自己多么的有用,自己总是怎么做的(在你没有被公认之前,这些属于自大)
- 语调要根据内容的需要做到抑扬顿挫,如果一堂课下来都是一个音调,学生会睡觉的
windows通过netsh设置防火墙
netsh advfirewall firewall>add rule
提供的许多参数无效。请查看帮助获取正确语法。
用法: add rule name=<string>
dir=in|out
action=allow|block|bypass
[program=<program path>]
[service=<service short name>|any]
[description=<string>]
[enable=yes|no (default=yes)]
[profile=public|private|domain|any[,…]]
[localip=any|<IPv4 address>|<IPv6 address>|<subnet>|<range>|<list>]
[remoteip=any|localsubnet|dns|dhcp|wins|defaultgateway|
<IPv4 address>|<IPv6 address>|<subnet>|<range>|<list>]
[localport=0-65535|<port range>[,…]|RPC|RPC-EPMap|IPHTTPS|any (default=any)]
[remoteport=0-65535|<port range>[,…]|any (default=any)]
[protocol=0-255|icmpv4|icmpv6|icmpv4:type,code|icmpv6:type,code|
tcp|udp|any (default=any)]
[interfacetype=wireless|lan|ras|any]
[rmtcomputergrp=<SDDL string>]
[rmtusrgrp=<SDDL string>]
[edge=yes|deferapp|deferuser|no (default=no)]
[security=authenticate|authenc|authdynenc|authnoencap|notrequired
(default=notrequired)]
备注:
– 将新的入站或出站规则添加到防火墙策略。
– 规则名称应该是唯一的,且不能为 "all"。
– 如果已指定远程计算机或用户组,则 security 必须为
authenticate、authenc、authdynenc 或 authnoencap。
– 为 authdynenc 设置安全性可允许系统动态协商为匹配
给定 Windows 防火墙规则的通信使用加密。
根据现有连接安全规则属性协商加密。
选择此选项后,只要入站 IPSec 连接已设置安全保护,
但未使用 IPSec 进行加密,计算机就能够接收该入站连接的第一个 TCP 或
UDP 包。
一旦处理了第一个数据包,服务器将重新协商连接并对其进行升级,以便所
有后续通信都完全加密。
– 如果 action=bypass,则 dir=in 时必须指定远程计算机组。
– 如果 service=any,则规则仅应用到服务。
– ICMP 类型或代码可以为 "any"。
– Edge 只能为入站规则指定。
– AuthEnc 和 authnoencap 不能同时使用。
– Authdynenc 仅当 dir=in 时有效。
– 设置 authnoencap 后,security=authenticate 选项就变成可选参数。
示例:
为不具有封装的 messenger.exe 添加入站规则:
netsh advfirewall firewall add rule name="allow messenger"
dir=in program="c:\programfiles\messenger\msmsgs.exe"
security=authnoencap action=allow
为端口 80 添加出站规则:
netsh advfirewall firewall add rule name="allow80"
protocol=TCP dir=out localport=80 action=block
为 TCP 端口 80 通信添加需要安全和加密的入站规则:
netsh advfirewall firewall add rule
name="Require Encryption for Inbound TCP/80"
protocol=TCP dir=in localport=80 security=authdynenc
action=allow
为 messenger.exe 添加需要安全的入站规则:
netsh advfirewall firewall add rule name="allow messenger"
dir=in program="c:\program files\messenger\msmsgs.exe"
security=authenticate action=allow
为 SDDL 字符串标识的组 acmedomain\scanners 添加
经过身份验证的防火墙跳过规则:
netsh advfirewall firewall add rule name="allow scanners"
dir=in rmtcomputergrp=<SDDL string> action=bypass
security=authenticate
为 udp- 的本地端口 5000-5010 添加出站允许规则
Add rule name="Allow port range" dir=out protocol=udp localport=5000-5010 action=allow
netsh advfirewall firewall>
更多参考资料: http://technet.microsoft.com/zh-cn/library/cc776229%28WS.10%29.aspx
windows通过netsh设置路由
查看路由:
设置路由
显示网络配置信息:
设置http代理:
windows 上通过netsh设置端口代理
实例一: 在windows上启动一个8181端口来代理phpor.net的80端口的服务
删除端口代理:
当然,你可能记不住这么长的命令,可以如下方式使用:
>netsh
>? // 查看可以使用的命令
…
>interface // 这里你可以不拼写完,只要不会和其他命令产生歧义就行,如: interf
>? // 查看可以使用的命令
…
>portproxy
>?
…
>set v4tov4 listenport=8181 connectaddress=phpor.net connectport=80
>show all
…
注意: 目前只支持tcp的端口代理。
这里又意外发现一处windows的错误:
=================================================
netsh还可以完成很多东西,有时间再看
通过ssldump来分析ssl协议过程
ssldump下载: http://www.rtfm.com/ssldump/ssldump-0.9b3.tar.gz
ssldump安装:
./configure && make && make install
make的时候可能会有错误:
net/bpf.h 找不见 ; 通过 ldconfig -p | grep pcap 发现已经安装了pcap的so文件, 使用rpm查了一下该so文件所属的rpm包,再通过rpm -ql libpcap-0.8.3-12.el4_6.1 发现存在类似头文件: /usr/include/pcap-bpf.h
于是,修改ssldump代码中包含的头文件:
<net/bpf.h> 修改为 <pcap-bpf.h>
于是,编译成功
使用:
./ssldump -i eth0 -k /etc/ssl/crt/private.key -nn -d port 443
..
…
…
apache 的任务分配模型
我们知道,Apache可以同时接受很多请求,在Apache的pre-fork模型中,有m个Apache的子进程随时等待着处理请求,这时,有n个请求过来了,那么,这n个请求是如何分配到m个进程来处理的呢?
首先,即使是n个请求同时到达,到操作系统层也会串行化后再提交到应用程序的。
情况一:
假设我们的Apache只listen一个IP:port, 则:
第一步:
父进程在fork子进程之前,会:
socket(…) = s;
listen(s,…) = 0;
这样就产生了一个listen指定ip:port 的文件描述符fd(s); Apache父进程在fork子进程时会将该fd(s)遗传给每一个子进程
第二步:
每个子进程都会处于: accept(s,…) 状态,等待接受请求,这些子进程在s上排队,先到先得,得到请求后,开始处理请求,处理完请求后继续accept(s,…) 等待请求; 这样,如果每个请求的处理时间相同,则,每个子进程能处理的任务基本是平均分配的。
情况二:
假设我们的Apache同时listen了同一个IP上的80和443端口,则:
第一步:
父进程在fork子进程之间,会:
socket(…) = s80;
listen(s89,…) = 0;
socket(…) = s443;
listen(s443,…) = 0;
semget(…) = semaphore;
产生s80, s443 两个fd (如果是epoll模型,则是创建一个epoll)和一个信号量semaphore
第二步:
因为accept不能同时在两个socket上排队,所以直接进入accept状态就不行了,所以就用到了“同步IO多路技术”,一般有三种实现: select、poll、epoll,其中epoll是最为高效的一种,这里已epoll为例说明。因为epoll只能同时accept多个socket,但是没法让多个进程在epoll的多个socket上排队;所以还得引入一个信号量的概念,信号量是解决同步与互斥问题的,常用的一种实现为semop(…); 这样多个Apache的子进程通过semop在父进程产生的信号量semaphore上排队,这样,保证同时只有一个进程处于可以接受请求的状态,接受到请求之后,退出队列,然后由下一个子进程接受请求。基本流程如下:
shell + awk 做日志监控
今天使用shell + awk 写了一个日志监控脚本,主要功能如下:
1. 没10分钟分析1次, 分析前10分钟的日志
2. 分析前10分钟日志中各种错误的数量及占比,来决定是否发送报警短信,很多错误号需要做特殊处理,有些错误号还要忽略
主要温习了下面知识:
1. shell中函数的定义
参考资料: http://www.cnblogs.com/chengmo/archive/2010/10/17/1853356.html
2. awk按照比较漂亮的格式写在shell文件中,不需要单独写awk脚本,使得一个shell脚本就可以干活了
3. awk中的数组似乎不能明确初始化一个空数组,awk中的数组都是关联数组
4. awk错误调试,这个是最有意义的了,如下图:
5. shell中的函数必须在调用前定义,但是我们不喜欢先看到一堆函数后才能看到主流程,办法为:
第一: 要么将函数定义到其他文件中,然后主流程的文件包含该函数文件
第二: 要么定义一个main函数,只需把main函数的调用放在文件尾部就行了,main的定义写在文件开始
gdb 调试core文件
gdb调试core文件:
# gdb program core
注意,不要直接 gdb core 或者gdb -c core 这样你将看不到调用栈的
问题:
1. gdb program core时 ,先做了什么使得能看到调用栈的?
2. core文件的格式是什么?core能为gdb提供什么有用的信息呢?
查询含有某些uid的日志
1. 使用getline从文件初始化一个数组
2. 使用 key in arr 的方式来匹配
[root@login test]# cat uid
123
456
789
[root@login test]# echo -e "123 man\n456 b\nc"|awk -v file=uid ‘BEGIN{i=0;while(getline uid <file) arr[uid]=true;} {if($1 in arr) print $0;}’
123 man
456 b