这几天在用libvlc的时候看到它在terminal里面输出彩色字体觉得挺好玩的,以为是用ncurses实现的,后来一查原来用ANSI C的转义字符就可以实现,不过好现只在linux下有效吧, windows神马的貌似不行,把项目终端凌乱的输出信息整理了一下,关键字符也都用彩色显示,看上去舒服多了,写一下用法以防止以后忘了再去查。
先把控制码列出来(从网上搜来的):
\033[0m 关闭所有属性
\033[1m 设置高亮度
\033[4m 下划线
\033[5m 闪烁
\033[7m 反显
\033[8m 消隐
\033[30m----\33[37m 设置前景色
\033[40m----\33[47m 设置背景色
\033[nA 光标上移n行
\033[nB 光标下移n行
\033[nC 光标右移n行
\033[nD 光标左移n行
\033[y;xH 设置光标位置
\033[2J 清屏
\033[K 清除从光标到行尾的内容
\033[s 保存光标位置
\033[u 恢复光标位置
\033[?25l 隐藏光标
\033[?25h 显示光标
背景色:
40:黑 41:深红 42:绿 43:黄色 44:蓝色 45:紫色 46:深绿 47:白色
前景色:
30:黑 31:红 32:绿 33:黄 34:蓝色 35:紫色 36:深绿 37:白色
控制字符是打开某种样式,输出完成时需要再关闭样式才能使terminal恢复到原来状态,简单例子:
printf("\e[32m%s\e[0m\n", "hello world");
\033和\e是一回事,使用\e会更简单一些,输出为绿色字体,如下图:

\e[32m为打开绿色前景色样式,\e[0m为关闭所有样式,如果未关闭,则所有输出字体均为绿色前景色,如下代码:
printf("\e[32m%s\e[0m\n", "hello world");
输出效果如下:

绿色高亮代码如下:
printf("\e[32m\e[1m%s\e[0m\n", "hello world");
输出效果如下:

另外光标移动的控制码在输出类似于下载进度的信息时用得到。
在shell中也可以直接用echo输出,需要加-e选项打开转义字符解释,如输出高亮的绿色字体为:
echo -e "\e[32m\e[1mhello world\e[0m"
其它的我也没怎么看,觉得也就改变字体颜色和移动光标位置能用得到,觉得挺好玩的就写下来以后忘了查一查。
昨晚想写个抓飞信协议包的脚本,结果刚写了一点就去看电影了,今天把它给完善了一下贴出来,也顺便可以帮助大家更好地理解飞信协议,也为了更多的人能够加入到openfetion的开发中来。
其实不是我不懂“工欲善其事必先利其器”这个道理,只是之前在写openfetion的时候我只能跑到windows下去抓包,windows里面的什么vbs之类的脚本我也不会写,就用最笨的办法用wireshark把数据包抓出来然后复制到txt中,现在在linux下可以抓openfetion的数据包,它的包格式与官方飞信相同(这句是废话,要不然也不可能实现互联互通)。
简单地说一下这个脚本,其实不用说它也很简单,就这么几行,飞信在登录的时候需要向一台sipc服务器注册,随后主要的数据包都是与这台服务器之前交换的,而这台服务器我想肯定也是分布式架构了,不同的飞信号会对应于自己的sipc服务器,而服务器的地址是通过配置文件传递给客户端的,客户端在注册之前先向nav.fetion.com.cn这个地址POST一个http请求,随后服务器会响应一个大的xml,之前版本的openfeion并没有对这些数据做本地缓存,所以在每次登录的时候都需要获取这个配置文件,所以经常会有用户反应卡在“正在下载配置文件”这一步进行不下去了,现在的方法是在本地把需要用到的字段做了缓存,再次登录的时候用缓存版本号查询服务器,如果版本号是最新则会返回一个很小的xml结构,速度当然也会比完全下载快得多。
接着说这个脚本,请求到配置文件之后便会得到飞信号对应的sipc服务器地址,之后就用tcpdump来抓取通往这个地址的包和来自这个地址的包,然后就简单做了一下解析。
#!/bin/sh
#written by @levin108
#This script is used to capture the packets of fetion client,and help to anlysis fetion protocol.
#You need to have openfetion installed in your computer,or maybe libfetion,I don't know,whatever...
if [ $UID -ne 0 ]; then
echo "perminission denied,you must be root to run this script"
exit 1
fi
if [ $# == 0 ]; then
echo -n "please input the mobile number:"
read mobileno
else
mobileno=$1
fi
if [ ${#mobileno} -ne 11 ];then
echo "wrong mobile number"
exit 1
fi
protocol_version="4.0.2510"
config_uri="http://nav.fetion.com.cn/nav/getsystemconfig.aspx"
config_body="<config><user mobile-no=\"$mobileno\"/> \
<client type=\"PC\" version=\"$protocol_version\" \
platform=\"W5.1\"/><servers version=\"0\"/> \
<parameters version=\"0\"/><hints version=\"0\"/></config>"
echo "Getting fetion sipc servr address..."
config_xml=`curl -d "$config_body" -A "IIC2.0/PC $protocol_version" $config_uri 2> /dev/null`
proxy_endpoint=`echo $config_xml | sed 's/.*<sipc-proxy>\([^<]*\).*/\1/'`
proxy_ip=`echo $proxy_endpoint | sed 's/:[0-9]*$//'`
proxy_port=`echo $proxy_endpoint | sed 's/.*://'`
echo "Sipc server address : $proxy_ip:$proxy_port"
echo "Start capturing,now start your fetion client and login."
echo
tcpdump -n -A -l -t -s 0 tcp and host $proxy_ip \
and port $proxy_port or host nav.fetion.com.cn 2>/dev/null | awk '
/^IP/{
if($NF == 0) {
is_data_seg = 0;
} else {
printf("\n%s ----> %s\n", $2, $4)
printf("-----------------------------------\n\n")
# whether it is a data segment
is_data_seg = 1;
# eth/ip/tcp header length
bytes_before_protocol = 52;
}
}
!/^IP /{
if(is_data_seg) {
if(length($0) < bytes_before_protocol) {
bytes_before_protocol -= length($0)
next;
}
if(length($0) >= bytes_before_protocol &&
bytes_before_protocol != 0) {
$0 = substr($0, bytes_before_protocol);
bytes_before_protocol = 0;
}
print $0
}
}
'
说实话,自己脚本能力太差了,于是利用周末的时候读了读《sed&Awk》,记得什么时候在byr上看到一贴子,是个统计最常用的10个命令的一句话脚本,于是自己写了一个,不过看上去挺臃肿的,如下:
#! /bin/sh
cat ~/.bash_history | awk -F" +" '{ print $1 }' | sort | awk '
!/^$/{
if(cur != $1) {
if(cur != "")
print sum , cur
sum =0
}
cur = $1
sum ++
}' | sort -nr | awk '
BEGIN{
printf("%-20s%s\n" , "Command" , "Frequency")
print "-------------------------------"
}
{
if(NR <= 10)
printf("%-20s%d\n" , $2 , $1)
}'
输出如下:
Command Frequency
-------------------------------
make 65
ls 49
awk 49
cd 42
sed 31
gvim 25
sudo 23
cat 19
echo 17
man 11
没怎么写过脚本,想统计一下自己的代码,于是就简单写了个。
玩linux这么久了写过最多的脚本居然还是js,哈,以后得加强之方便的练习了
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| #!/bin/sh
number=0
count()
{
for file in *
do
if [ -d $file ]; then
cd $file
count
cd ..
elif echo $file | grep "\.[ch]$" > /dev/null; then
pot=$(wc -l $file | cut -d" " -f1)
number=`expr $number + $pot`
echo $pot $file
fi
done
}
count
echo line total:$number |
补充一下删除目录下所有隐藏的.swp文件(vi给生成的,vi不小心关闭的时候就会残留下来,烦死了)
1
| find . -name "*.swp" -exec rm {} \; |
Recent Comments