'Unix/Linux' Category

  • 通过python实现mutipart/form发送数据到paste.ubuntu.org.cn

    September 16, 2009

    paste.ubuntu.org.cn是国内很多linuxer喜爱的“在线剪贴板”,在跟网友交流时把代码、截图等发在这里,然后把网址发送给对方即可,而且对多种常见代码支持语法高亮,功能简单贴心。(不用像某网友在这个博客上篇帖子里面那样,在留言里面贴一大堆乱哄哄的代码……=。=) 虽说方便,但平时要发送文件时候还是要打开浏览器,再贴代码或者选择文件,多少有点繁琐,所以打算用python写个上传脚本,跟nautilous结合的话,上传截图就方便多了。 首先问球猫要了个ubpaste的perl的脚本,虽然我不懂perl,但发现上传部分只有10来行代码嘛……看来挺简单的,可能用urllib随便弄一下就可以了……结果发现,不行!paste.ubuntu.org.cn用的是mutipart/form协议方式的上传,而python标准库里面没有直接支持这种协议(perl却有……而且自动支持……所以几行代码搞定=。=)…… 查了一下资料后自己写了个class来实现mutipart的boundary,才知道用http来发送文件,特别是上传大文件是这么麻烦的事情……不过还好,不算很复杂,但是整个脚本下来居然有150行代码了……=。= 现在还不能直接拿来当nautilous script用,因为第一个参数是读入文字而不是文件,还在犹豫用bash来重新封装(使用curl一行就搞定上面所说的上传了)……[懒ing]

  • 深入了解校园网802.1x认证的EAP协议(3)——联想802.1x认证细节

    August 24, 2009

    联想的认证协议是我写的这几个802.1x实现里面相对简单的版本,没有太多古古怪怪的信息头信息尾部。 我们学校并没有使用过联想协议的认证系统,而是受了一位网友的邀请才写的,所以我连联想官方客户端的样子都没看到过,一直是由那网友抓包后发送过来,而我猜测地将其套入到此前我写的神州数码的认证程序里面,经过几天的调试,确实能用,虽然并不完全了解认证报文的每个细节。 PT实现的联想Linux客户端项目主页:http://code.google.com/p/zlevoclient/ 以下的说明是基于EAP协议过程的补充描述,如果不清楚EAP,可先读深入了解校园网802.1x认证的EAP协议(1)——EAP的总体流程。 认证过程报文的细节描述: EAPOL-Start、EAPOL-Logoff设置长度为0的协议包头,然后紧接6个意义不明的字节(可能是版本号之类),直接复制即可: {0x00, 0x00, 0x2f, 0xfc, 0x03, 0x00}; EAP-RESPONSE-Identity长度为5(头部) + username_length,无特别,跟EAP标准一致, EAP-RESPONSE-MD5_Challenge长度为6(头部) + 16(MD5值) + username_length,在MD5值之后,先紧接用户名,然后是4字节的本机IP地址,以及9个意义不明的字节,直接复制:{0x00, 0x00, 0x2f, 0xfc, 0x00, 0x03, 0x01, 0x01, 0x00}; EAPOL-KEEP-ALIVE当认证成功后,需要每60秒发送一次该报文,否则会断线;该报文的b:EAPOL 报文类型为0xFC,帧长值为12,其携带信息的前8字节在实际中似乎是随机变化,找不出其规律,不过实际上全部设0也可;后4字节则是本机IP。 在部分版本中,如吉林大学珠海学院,每隔5分钟(可能就在第五个EAPOL-KEEP-ALIVE发出之后)服务器会重新发来EAP-REQUEST-Identity,程序需要正确应答,特别要设置各个应答报文中的e:EAP通信id。 关于服务器返回的数据包,Success和Failure通常包含有中文编码的信息,标志是,EAP报文结束后,紧接0x00002ffc(大概0x18、0x19),其后接着是一个字节的报文长度,再后就是gb2312编码的中文信息。 由于协助我测试的湖南人文科技学院的网友他们的系统是纯手工设置网卡IP的,所以我也不清楚是否有像其他品牌的协议那样有动态静态IP位之类的信息位,如果发现这个版本的程序不能通过认证,可以自己抓包分析,或邮件联系PT。

  • 手动加入的Cairo-Dock的启动器无法成为窗口任务的解决

    August 22, 2009

    CairoDock的图标分为Launcher和TaskBar,但是也能同时是某程序的Launcher和TaskBar,而且这样比较方便实用。但是经常会遇到,手动加入的Launcher点击了之后,CairoDock会打开另外一个TaskBar来管理程序的窗口[在我的系统里面,Shiretoko版的Firefox根Chromium都出现这情况,不过我添加的Launcher不多],这是因为这个Launcher没有正确识别到程序窗口的WM_CLASS。可以打开Modify this Launcher,在Extra parameters的Class of the program里面手动修改程序的窗口类名称。 要获得程序的窗口类,可借用xprop,直接在终端里面运行xprop,鼠标会变成十字,在程序的窗口上面单击,然后就会在终端里面刷出一大片信息,留意后面几行的WM_CLASS,比如Chromium的就是 WM_CLASS(STRING) = "chromium-browser", "Chromium-browser" 把Launcher的Class of the program改成Chromium-browser,就works fine了!

  • 简单配置nginx+fastcgi后端的WordPress服务器

    July 24, 2009

    Update: nginx+php的环境可以更快捷的方法完成,参看Nginx + PHP (via php-fpm) on Ubuntu 环境最佳实践 比起传统的LAMP Web服务构架,nginx替换Apache能够在同样硬件配置情况下提高10倍的并发性能;PT尝试在Arch下用nginx简单搭建一个让wordpress运行的LNMP环境的笔记:(实际上nginx+fastcgi的架构在目前看来性能并不高,甚至比apache+mod_cgi差,也许nginx做前端服务,apache做后端处理合适一点[误]) Update:nginx+fastcgi跑服务的组合通常用在一些低端的vps上,其内存甚至不到100M,所以apache等庞物是不适合的。按下文方法启动的fcgi只有一个worker进程,而且nginx配置当中没有fastcgi的缓冲,所以会有性能低下的感觉,其实可以通过PHP_FCGI_CHILDREN环境变量等来进行优化。另外推荐使用这里提到的启动脚本来启动php-cgi。参考一些nginx调优方案,再加上一些Wordpress Cache之类的,一台64M的vps足够跑上一打wordpress博客了。 安装nginx。 nginx在源里面,很简单就安装完成; 1 /etc/rc.d/nginx start 启动nginx的服务,因为有默认的配置,这时用浏览器看看http://localhost,可见到nginx的错误页了,完成; 安装php 安装php也是从源里来的,至于运行php,按arch wiki推荐的方法是使用fcgi,顺便装上,运行: 1 cgi-fcgi -start -connect localhost:9000 /usr/bin/php-cgi nginx的默认目录在/srv/http/nginx,在里面新建一个index.php,包含简单的代码: 1 2 3 <?php phpinfo(); ?> 然后我们要让nginx使用php来解释这个文件,编辑/etc/nginx/conf/nginx.conf 配置nginx的重点就是这个文件,但先不管,在适当的地方贴入这段: location ~ \.php$ { root html; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } 重启一下nginx 1 [...]

  • Unix单实例后台守护进程的“规范方法”

    June 2, 2009

    此前的笔记《Linux程序已运行实体的检测以及其PID的获得》通过Linux里面的bash命令来获取正在运行的同名进程的pid,正如网友AzureSky提醒说实际上平常此类程序所用的方法都是文件锁,比如dhclient、apt-get系列、pacman诸如此类,都是通过往/var/run里面写入一个包含自身pid的xx.pid文件,同时加上排他锁,只要当前进程还在,新的进程就不可能再加锁,也就能检测出是否单实例了。(AzureSky博客另外整理出APUE的一个实现) 至于后台运行,都是通过fork来生成新进程,虽然还需要setsid等的调用以确保子进程正常运行,不过这里暂不详细讨论,重点关注文件排他锁和生成的后台进程的“规范方法“(参考《Unix环境高级编程 APUE 第二版》)。 整个过程是这样的: 打开文件; 获得该文件的锁的状态; 如果没有锁,则给该文件加上自己的锁并写入自己的pid*;否则获得锁着该文件的进程的pid 如果能够顺利加上锁,则生成子进程;子进程等待父进程退出后马上给文件加上自己的锁; *其实写不写入pid对整个过程影响不大,只是惯例如此。 过程并不复杂,纠结的地方就是,文件锁是针对进程而言的,在生成后台进程的过程中,父进程和子进程虽然说拥有共同的文件描述字之类的资源,但由于是两个完全不同的进程,文件锁并不会继承过去。只有当父进程完全退出,失去对文件的锁操作后,子进程才能重新获得锁。 文件锁的调用fcntl函数的cmd参数里面有F_SETLK和F_SETLKW两个,后者是阻塞式的调用,就非常适合上述子进程等待父进程退出以获得锁的情形。 PT根据《APUE 2nd》F14.5、F14.6 整理出来的一份示例代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 [...]

  • Arch笔记之:U盘中文乱码

    June 1, 2009

    似乎装了HAL的Arch就能自动挂在U盘了,然而U盘目录里面的中文文件全部是???,很明显是编码问题。我用的是en_US环境,不知道有没有关系。 网上不少说法是修改/etc/udev/rules.d/里面的挂载规则,抄了别人的脚本试了下,很不完善,删掉。 本来就能自动挂载了,只是编码问题而已,应该不用改rules吧!重新以编码问题搜索,终于看到解决方案: 运行gconf-editor(类似Win的注册表编辑器的东东,没有就装上),在System->Storage->vfat的mount_options里面添加一条“iocharset=utf8”,好,大功告成!

  • Linux程序已运行实体的检测以及其PID的获得

    May 25, 2009

    程序中经常需要有这么一个功能:只允许本程序的单个实例运行,即不能多次运行一个程序。检测某个进程是否在运行,在shell中可以很轻松的用命令ps -A|grep xxx找出来,但对于程序来说,该怎么检测呢?我参考了aecium程序的方法:同样调用ps -A|grep xxx。也许会存在更先进的方法,比如dbus、系统信号量之类的技术,总之这个不会是最好的方法,不过且看看其技巧。 首先要获得当前进程的名字以便传给grep,一般通过main的argv[0]可得到运行时的程序名,不过要注意的是,通过路径运行的程序如./a.out,argv[0]也是./a.out的。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 [...]

  • 玩转libnotify

    May 22, 2009

    Ubuntu 9.04一个特性就是新的通知机制Notify OSD,让人一眼看上去很酷的样子,其实只是基于libnotify的调用,别看又DBUS又OSD那么复杂,其实一点都不神秘,跟PT来: 1 2 3 4 5 6 7 8 #!/usr/bin/python #coding:utf-8   import pynotify   pynotify.init ("PT-Title") n = pynotify.Notification ("PT的贺电", "PT再次发来贺电") n.show () 没看错,就是这么几句Python,保存成文件运行试试: 哈哈,很简单吧! 如果你安装了libnotify-bin包,shell里面会有notify-send这个工具: notify-send "PT的贺电" "PT发来贺电" 差不多的效果,我就不抓图了,自己试试! 当然除了python,libnotify还能在很多种语言的库实现,我用aptitude search libnotify搜索了一下,很明显有libinotify-ruby,libnotify-dev,libnotifymm-dev分别是ruby、C、C++方式的绑定,不过,python的pynotify是Ubuntu 9.04里面默认安装的呢…… 详细的开发还是看看Ubuntu的Notification Development Guidelines吧,注意在后部分有很多example的噢!!!

Page optimized by WP Minify WordPress Plugin

 
Powered by Wordpress and MySQL. Theme by Shlomi Noach, openark.org