2015-04-02 Thursday 23:16:18
自动给文件的某个pattern前加上某段文本
在cnzz.com上注册了个帐号,想统计一下这个博客的访问流量。需要给每个html文件加上一段代码,肯定不能手动呀,首先想到用 sed :
$ sed -i '/regexpattern/ i text' index.html
然后希望写到makefile中,每次生成完html文件后就执行这条sed命令。但是不知道怎么在makefile里跨行执行shell代码。于是退而求其次,写到了一个外部脚本里,然后在makefile的all规则中加上这个脚本的名字。还有如果要插入的文本是在另一个文件中,需要:
$ sed -i '/regexpattern/ r text.txt' index.html
命令行自动登录校园网
最开始尝试了用 curl -F 做表单提交,但是没有成功。网上搜到了说用 Firefox 的 Firebug 和 Firecurl 插件,可以得到每一步对应的curl命令。然后到 Firecurl 的下载页面又说:don’t use this — use Chrome Developer Tools' "Copy as cURL", which is much more complete
可是最终这种方法的到的curl命令也不能成功登录。
继续Google,找到了github上有人三年前写的https://github.com/tianyang-li/TUNET[Python脚本],挺简单的,没有用表单提交,直接跟cgi交互。
于是写了个 shell 版的。。
#!/bin/bash
case "$1" in
login)
username=${2:wdd13}
password=$(echo -n $3 | md5sum | cut -d' ' -f1)
curl -d "username=${username}&password=${password}&drop=0&type=1&n=100" http://net.tsinghua.edu.cn/cgi-bin/do_login
;;
logout)
curl http://net.tsinghua.edu.cn/cgi-bin/do_logout
;;
*)
curl -d 'action=check_online' http://net.tsinghua.edu.cn/cgi-bin/do_login
;;
esac
2015-04-04 Saturday 19:58:45
HTTP2
-
https handshake
-
http/2和SPDY协议传的是二进制的,而http/1.1传的是文本。快速。
-
TLS everywhere
-
http/1.1是应用层协议,而http/2是会话层和应用层协议,不是完全替代1.1,而是进行了扩展。
-
HPACK
-
http/2的header压缩协议
-
没有前缀匹配,(为了安全)
-
名称和值对于算法来说是不透明的
-
编码端决定哪一部分被压缩
-
静态表,动态表,huffman
-
不选用gzip是为了防止 CRIME 。CRIME会引诱浏览器把不同的文本内容发给目标网站,观察压缩后的header变化,如果对于某个特定的内容,header变小了,说明注入的内容中有与用户的cookies相同的部分,据此来推测出用户的cookie,劫持用户的会话。
-
一些边界情况
-
处理大的header
-
作为http/1.1的代理
-
负载均衡时的优势。
-
Server push。预测用户的需要,在client发出请求前就做出回应。
-
减少了TCP连接,使服务器能够处理更多的并发。
-
FAQ上的问题
-
http/1.1的问题是,一个http请求会导致多个TCP连接同时发送请求。
-
与十几年前相比,现在的网页包含了更多的内容,例如js脚本,css信息,多媒体资源,而现在的http/1.1只能允许TCP一次发出一个资源请求。
-
以SPDY为基础。
-
http/1.1中,浏览器会为每个来源网站建立四到八个连接,如果一个网站包含多个来源,连接可能会更多,这些连接容易触发TCP的拥塞控制和重传。http/2只需要一个连接。
-
关于server push,目前的情况是,客户端先收到html文档,解析后,如果其中有嵌入的JS脚本或者CSS样式,则再次发出请求。
-
2015-04-09 Thursday 09:49:58
Java和C\++的new
Java中没有指针的概念,可以在new的时候初始化,C++似乎不可以。
int a[] = new int [] {8, 0, 5, 1}
[source, C]
int *a = new int[4];
Bash中的方括号
单层方括号是标准的shell,bash会支持双层方括号,功能更多。http://mywiki.wooledge.org/BashGuide/Practices#Bash_Tests
var=''
[ "$var" == '' ] && echo True
[[ $var == '' ]] && echo True
[[ $var =~ pre+ ]] && echo True
[[ $var = pre* ]] && echo True
2015-04-11 Saturday 15:23:15
php简单运行
<?php
$input = $_GET["param"];
echo "<div>".$input."</div>"
?>
存为a.php,然后进入到该目录下,运行 php -S localhost:8000
,然后在浏览器中输入 localhost:8000/a.php?param=Hello PHP
localhost:8000/a.php?param=<script>alert(/xss/)<script>
Cookies
Ctrl+Shift+i
调出浏览器的控制台,然后可以执行JavaScript脚本,例如查看当前的页面的Cookie: document.cookie
* 修改document.cookie
** document.cookie是一个string,以分号隔开的 key=value 值对。直接给它赋值并不会覆盖掉之前的值,而是添加到原来值之后。例如cookie里本来有一个 name=bigeast 的值,想要删除或者修改它,需要知道Set-Cookie时,它的一些属性信息,例如domain, path等,这些信息在document.cookie中是看不到的,但可以通过调试窗口找到。要删除一个cookie,只需设置好正确的domain, path, 然后把它的expires值设成过去的一个时间就可以了。
document.cookie = "name=whatever; domain=.google.com; path=/; expires=Thu, 2 Aug 2001 20:47:11 UTC;"
Set-Cookie时如果加上HttpOnly字段,则该cookie不能被JavaScript读取。
top
top命令的显示结果跟以前不一样已经有一段时间了,有了颜色,还有跟 htop 类似的CPU占用率动态显示,但我之前经常用的 C
, M
将进程按cpu占用率或者内存占用排序的功能不在了。今天终于忍不住查了下到底怎么回事。原来这个变化是去年11月份, procps-ng 的一次升级后开始的。
4888:[2014-11-17 09:33] [PACMAN] upgraded procps-ng (3.3.9-3 -> 3.3.10-1)
wiki上有https://bbs.archlinux.org/viewtopic.php?id=189757帖子讨论这个,而且有人给出了恢复到原来配置的方案:
remove your ~/.toprc (if any) start "top" press z press V press 1 press y press m m press t t t press W this will write a ~/.toprc fairly similar to what you are used to.
查看了下 procps-ng 下的命令,原来 pgrep 和 pkill 都是,还有 free pidof pmap ps pwdx uptime vmstat watch 等。 pwdx 之前没见过,是查看一个进程的当前工作目录的。
ngrep
查看http头,可以用万能的 tcpdump, 还有更合适的 ngrep 。
# To print all IPv4 HTTP packets to and from port 80, i.e. print only packets that contain data, not, for example, SYN and FIN
# packets and ACK-only packets. (IPv6 is left as an exercise for the reader.)
$ tcpdump 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'
$ ngrep -q -W byline "GET|POST HTTP"
$ ngrep -q -W byline tsinghua.edu.cn tcp port 80
JavaScript
js-beautify, js24 。网站中的JS脚本一般都是经过模糊处理的,就是把变量名替换成单字符的,单行,这种工具叫做 JavaScript Obfuscator
2015-04-17 Friday 09:43:15
i3wm + Virtualbox + Windows7 多屏显示
现在有两台显示器,已经用xrandr做了多屏显示:
xrandr --output DVI-0 --mode 1280x1024 & xrandr --output DVI-1 --mode 1920x1080 & xrandr --output DVI-0 --left-of DVI-1 &
但是最后一条命令好像不起作用,每次都要手动运行一遍,两台显示器才显示不同的内容。
由于我现在需要用Windows中的VS来debug,通常是开两个VS窗口,一个编码端,一个解码端,然后两边同时F10看哪里开始不一样。虽然27寸的显示器可以显示两个,如果Virtualbox支持多屏就好了。一查果然有这个功能,需要在设置里的Video选项中选定窗口个数,然后进入Windows虚拟机后,在桌面右键,然后选择分辨率,设置另外一个显示器的参数就好了。
然后可以把其中的一个通过i3的命令移到另外一个显示器上,这样虽然会有i3的border,但是已经大体上已经差不多算是多屏了吧!
对了,今天才注意到Virtualbox的 Host
键,就是切换键盘事件在主机和虚拟主机之间的分配,例如要把Virtualbox窗口用i3的快捷键移动到另外一个显示器上,快捷键会先被虚拟机捕获,所以命令是无效的。这时就按一下右边的 Ctrl
键,再运行i3快捷键就好了。
还有Virtualbox的多屏其实还是一个屏做了扩展,例如Windows的任务栏只会在一个里面显示。先这么着吧。
urxvt里用tmux多屏,桌面i3多屏,虚拟机Virtualbox多屏,再多我就吃不消了。。
发现一个特性,如果screen1, screen2上都有好几个i3标签页,而且各有Virutalbox的多窗口中的一个,如果鼠标screen1的Virtualbox窗口移动到screen2时,会自动定焦到screen2中的Virtualbox窗口!
另外!Virtualbox的多个窗口可以从左边可右边拖动窗口到另外一个中去,只是一边是连续地进入,另一边有点不连续但是可以做到!!
只是两个窗口时,Host + f
全屏模式不好用了。
SIGINT, SIGTERM, SIGQUIT, SIGKILL
-
SIGINT
Ctrl-c
-
SIGTERM 程序终止,可以等待程序关闭临时文件。
-
SIGQUIT
Ctrl-\
退出前保存coredump文件。 -
SIGKILL 不可捕获,立即终止。
2015-04-19 Sunday 10:45:38
获取本机的外部IP
可以通过一些外部的服务,例如:
$ curl icanhazip.com $ curl ifconfig.me
但是这些服务可能并不稳定,而OpenDNS就比较让人放心一些,速度也比较快:
$ dig +short myip.opendns.com @resolver1.opendns.com
还有一个 ifcfg.me 的服务,提供user-agent, method等信息的查询。
$ curl 'ifcfg.me/?' $ curl ifcfg.me/all $ curl ifconfig.me/all.json
还有个查询显示器分辨率的服务: whatismyresolution.com,这个是什么原理呢?
最常用的命令
history | awk '{CMD[$4]++;count++;} END { for (a in CMD )print CMD[ a ]" " CMD[ a ]/count*100 "% " a }' | grep -v "./" | column -c3 -s " " -t |sort -nr | nl | head -n20
其中的$4跟history的输出格式有关,就是让这个指向命令所在的域就好了。
2015-04-24 Friday 21:22:16
xinitrc
xinitrc里的配置其实一直是有问题的,例如 setxkbmap -option caps:escape & 总是无效,还有xrandr命令也不能正确配置显示器,每次都要手动。今天解决了一下。
exec setxkbmap -optioin caps:escape &
要加上 exec
。但是有的命令不需要,例如 fcitx , goldendict , xcompmgr ,还有设置桌面背景的 feh 。所以还是搞不懂,先这么着吧。
然后xrandr是加了exec也不会正常工作的,要在 /etc/X11/xorg.conf.d/ 下面加一个文件:
Section "Monitor" Identifier "DVI-1" Option "PreferredMode" "1920x1080" Option "Primary" "true" EndSection Section "Monitor" Identifier "DVI-0" Option "PreferredMode" "1280x1024" Option "LeftOf" "DVI-1" EndSection
Virtualbox的问题
再次更新后出错!! dkms的问题,之前都不知道它是什么也没出现什么问题啊!
回退,失败。无数次失败后,还是看了日志,里面有一条是:
00:00:00.302028 ERROR [COM]: aRC=NS_ERROR_FAILURE (0x80004005) aIID={431685da-3618-4ebc-b038-833ba829b4b2} aComponent={ExtPack} aText={Failed to locate the module 'VDPluginCrypt' in extension pack 'Oracle VM VirtualBox Extension Pack'}, preserve=false
但是这个扩展包我都没有听说过,到Archlinux的wiki上搜,才知道是AUR中的一个包,装好后就可以了。但是为什么之前从来没有这个包的时候也没出现过问题呢!!
2015-04-28 Tuesday 00:20:36
GDB
coolshell.cn博客上干货还是挺多的,重要的是上面会有很多作者自己翻译过来重新整理的文章。
逆向调试,就是不小心next过了,可以返回。 * GDB的 Reversable Debugging * VS的 Historical Debugging * bash脚本调试
$ bash -x script.sh #但是 man bash 没有找到 -x 选项。 $ pacman -S bashdb
-
ldd的安全问题
autopep8
pep8能够检查python代码的风格是否符合PEP8规范,但是不能自动纠正。