2009年12月

使用Git hook来校验push用户名的合法性

Git和CVS一个很大的不同是,它没有一个完善的权限控制系统


即使采用了Gitosis工具,它实际上是通过公钥来控制某台服务器的权限


用户在使用git前,依然需要设置user.name来控制提交时的用户名


但即使你没有设置,会有一个默认的空用户名或者是自己的登录用户名,如root


这样通过git log就很难看到对应的代码到底是哪个人员修改的了


不过,可以通过hook来初步解决这个问题


在git目录下的hooks目录里,新建一个pre-receive的hook,代码如下:



折叠复制代码




  1. while read old new name; do

  2. name=$(git log -1--pretty=format:%aN $new)

  3. email=$(git log -1--pretty=format:%ae $new)

  4. user_prefix=`echo $name | awk -F'_' '{print $1}'`

  5. check_user=`echo $GIT_VALID_USER | grep -c $user_prefix`

  6. if [ "$check_user" == "0" ]

  7. then

  8. echo "Username $name denied, please set user.name"

  9. exit 43

  10. else

  11. exit 0

  12. fi

  13. done




需要在服务器上设置一个环境变量GIT_VALID_USER,保存合法的用户名列表


当用户名校验不通过,则返回一个非0的值即可


如果需要严格的用户名校验,即提交的user.name必须是gitosis里配置的对应Client的用户名


则可以在/usr/local/lib/python2.5/site-packages/gitosis-0.2-py2.5.egg/gitosis/serve.py中第202行增加如下代码:


os.environ['GIT_USER']=user


然后在hook里校验name是否等于这个环境变量的值即可


但由于我们有一些公共的服务器,可能很多开发人员都会在上面push代码,所以不能使用此严格的校验方式


只能使用上述的有效用户名列表的验证方式

昕昕讲故事

不知从什么时候开始,昕昕迷上了“听故事”和“讲故事”


晚上睡觉前,躺在被窝里,一遍一遍的让宝宝妈妈给他讲故事听


讲的故事就那么2,3个,讲完一遍又一遍,非还得让不停的讲


直到把宝宝妈烦的不行了,不给他讲了,他就自己“呜呜”的哭了


没办法,只能继续给他讲,直到他最后睡着了


这几天,他有时候就自己抱着本书,一页一页的翻书


看到自己以前学过的,自己就开始背


别看人家是反着拿书,但只要是学过的,他都认识


有时候,他还让爸爸妈妈或者巧虎坐在他身边,煞有其事的给我们讲书


宝宝的记忆确实很好,一首诗只要教他几遍


人家基本就能背下来了,而且过几天照样还能背出来


现在家里的一些儿诗,差不多能背20来首了吧


但这小子就是不识数,几个指头怎么教,他都不认识...

Ubuntu下使用pexpect自动ssh和scp

Ubuntu下,使用Gnome自带的Terminal时


如果需要Ssh登录很多台服务器,或者从其它服务器上Scp传文件时,每次都需要输入密码


这个和SecureCRT相比,确实很不方便


除非要把公钥逐个的拷贝到各个服务器上来实现rsa验证,但对于很多台服务器来说,也很麻烦


另外,由于Ubuntu默认的locale是utf8,而服务器上一般都是gbk的,如果默认登录的话,中文有可能会乱码


可以使用luit和pexpect配合完成自动登录的任务,需要把各服务器的用户名,密码,编码类型存储在配置文件中


然后,使用pexpect来自动输入用户名,远程到各服务器上,以下是代码片段:



折叠复制代码




  1. self.cmd="luit -encoding "+self.characters+" ssh " + self.userid + "@" + self.host  

  2. try:  

  3.     p=pexpect.spawn(self.cmd)  

  4.     i=p.expect(['password:', 'continue connecting (yes/no)?'],timeout=5)  

  5.     if i == 0:  

  6.         p.sendline(self.password)  

  7.     #如果host已经在known_hosts里,则直接就输入密码  

  8.     elif i == 1:  

  9.         p.sendline("yes")  

  10.         #接下来应该就是输入密码了,但一定还要expect一下,因为在password之前可能还有其它的  

  11. 提示信息  

  12.         p.expect(['password:'])  

  13.         p.sendline(self.password)  

  14.     p.interact()  

  15. except pexpect.TIMEOUT:  

  16.     print 'Connection timeout'  

  17. except pexpect.EOF:  

  18.     print 'Connection exit'  

  19.     p.close()  

  20. except Exception,e:  

  21.     print "Connection close",e  





Gnome-terminal中粘帖快捷键

在使用Gnome默认的Terminal后


看了一下它的快捷键设置,发现粘帖是用Shift+Ctrl+V


为了同SecureCrt的快捷键一致


于是,我自作聪明的把它的快捷键给改成了Shift+Insert


每次都先选中文字,然后Ctrl+Shift+C复制,然后再Shift+Insert


昨天,听杨大侠说终端默认的是选中文字后,就可以直接Shift+Insert粘帖了


而我把Shift+Insert的快捷键给覆盖了,所以造成还需要先复制一下,真晕...


把粘帖的快捷键给改成默认的后,就可以直接选中Shift+Insert粘帖了


但是,它选中后,默认似乎是放在终端的Primary缓冲区中,而不是剪贴板中


所以,在其它的文本编辑器中,要想粘帖选中的文字,是需要用鼠标中键的...


而在终端中,Shift+Insert则是直接粘帖缓冲区中的数据

Ubuntu下使用电信的3G上网卡

我使用的上网卡型号是ZTE AC2726


插上U盘后,默认会把当前的上网卡识别成U盘


使用lsusb查看,如下:


Bus 005 Device 006: ID 19d2:fff5 ONDA Communication S.p.A.


需要装一个中兴的驱动包,下载地址:


http://www.ztemt.com.cn/ennewzte/service/ziliao.action


以下内容,参考http://forum.ubuntu.org.cn/viewtopic.php?f=116&t=202430&start=0


安装驱动时提示无法载入ztemt.ko模块,根据TuXHaT所说,该模块与Linux自带USB串口驱动usbserial.ko差不多,因此我直接使用了usbserial.ko,这样的话,只需将DEB包中的ztemtEVDO.sh,10- ztemtEVDO.rules,ztemtvcdromd分别copy到/lib/udev/,/etc/udev/rules/,/sbin下即可,DEB包中大部分是一个拨号程序。以root身份运行ztemtvcdromd,然后插入网卡,这时网卡已被正确的识别为Modem,使用lsusb来查看,ID号显示的是0x19d2:0xfff1


然后,编辑/etc/wvdial.conf文件,如下



折叠复制代码




  1. Phone=#777

  2. Username=ctnet@mycdma.cn

  3. Password=vnet.mobi

  4. New PPPD=yes

  5. Modem=/dev/ttyUSB0

  6. Baud=921600

  7. SetVolume=0

  8. Dial Command=ATDT

  9. Init1=ATZ

  10. FlowControl=Hardware(CRTS CTS)

  11. Stupid Mode=1




最后,使用wvdial来拨号后就可以上网了


也可以安装gnome-ppp拨号工具,来进行拨号上网


 


 


 

火红太阳当头照

下午,昕昕睡醒起床后


跑到了阳台上,开始玩沙子了


姥姥怕他冷,就和他说:


昕昕,进来吧,外面冷


这小子来了这么一句话:


不冷,火红的太阳当头照


呵呵,那是前几天刚叫他背的诗里的一句话


没想到,他给用到这了...

折腾了两天“Ubuntu”

周末两天,从杨大侠那弄了一个Ubuntu的liveusb包


把ubuntu的iso给镜像到u盘中,实现从u盘安装


想当年,为了装个Redhat7,我买了好几张光盘


不禁感叹,软件技术真是日新月异阿,现在装个系统,盘都不用自己刻了,更不用去买了...


安装过程倒是很简单,一路就完成了


装好后,在配置连接家的无线路由器时,出了一些问题


虽然能连上,但上不了网,ifconfig了一下,发现是ip地址不对


我的无线路由器设置的是dhcp方式,于是,就改了一下Ubuntu的连接属性


结果,改成dhcp方式后,根本就连不上了,郁闷....


后来,又折腾了好久,又莫名其妙的连上了,也能上网了,到现在还没明白是哪的问题...


接着开始折腾vpn和电信的上网卡,参考杨同学的blog,又上网看了其他人的文章


倒是很顺利的给装上了


使用的感觉:gnome的xwindow界面还是挺炫的,尤其是开启了桌面特性后,安装软件也很方便


直接用apt-get install联网安装,或者从别处拷贝cache文件,自己通过dpkg-scanpackages建立本地源直接安装


当然也可以自己下载.deb文件来安装,或者直接下载src文件编译安装


不过,因为免费,所以windows下的很多东西还是无法使用,所以只能搞个双系统了

手机PushMail

用139邮箱的pushmail功能有一段时间了


总体感觉还是不错的,当有新邮件时,会自动连接GPRS,下载邮件


上网看了一些关于PushMail的基础知识,了解到了一些东西:



  1. 139的PushMail和Blackberry的Push原理类似,似乎都是采用短信触发客户端进行邮件收取动作。也即用户邮箱收到新邮件时,移动运营商会向手机发送一条短信,用户收到短信后,触发PushMail的客户端,连接gprs来下载邮件。我用的是WM系统,在注册表里可看到以下东西:
    [HKEY_LOCAL_MACHINESoftwareMicrosoftShellEventNetworkWDP16000PushSms]

    Command=WindowsPushSms.exe

    Class=PushSms

    WDP Port=1025
    看起来是使用了1025端口来接受那条短信的

  2. Ip PushMail:它的特点是手机会保持一个固定的IP地址,邮件服务器收到新邮件后会在第一时间根据IP地址将邮件推送到手机客户端上。好像尚邮采用的是IP push 的方式,支持目前市场上的全部主流手机平台,所有开通pop功能的邮箱,还可加密传送安全可靠,但是要达到实时Push效果的话,需要时刻在线,所以,这种方式比较耗电

  3. 很多“伪PushMail”:类似于手机上的pop客户端,定时不停的到服务器上去检测是否有新邮件到达,相当的耗电


相比而言,139邮箱的PushMail总体还算不错,不用时时在线,却能实时的收到邮件。

Apache2 403 Forbidden错误

最常见的问题就是需要访问的目录没有设置权限


只需要加一段directory的设置即可,见:



折叠复制代码




  1. <Directory"/opt/ysz/vip_static_file">

  2. AllowOverride None

  3. Options None

  4. Order allow,deny

  5. Allow from all

  6. </Directory>




今天,在部署一个应用时,发现对应的目录中有个软链接目录无法访问


报错403 Forbidden,但其它的正常的文件和目录都可以正常访问


开始尝试把软链接对应的真实目录也给加上相应的directory设置,但还是不行


后来,查看了apache2的参考手册,发现了Options的FollowSymLinks这个属性


它就是来控制允许服务器在此目录中使用符号连接,加上这个选项后,软链接目录就可以正常访问了


Options Indexes FollowSymLinks


另外,需要注意,该软链接对应的实际目录属性应该为755以上才可以访问的


其中,Indexs属性用来控制允许显示目录下的文件列表,正常情况下,不应该加这个Indexs选项的


 

Ant增量编译的陷阱

之前,曾经写过通过rsync和ant来部署java代码,见:www.tech126.com/?p=88/


但却忽略了一个问题,当服务器的时间不准确时,那么rsync过去后,可能会对ant编译的结果造成影响


因为,ant缺省是增量编译的:


The source and destination directory will be recursively scanned for Java source files to compile. Only Java files that have no corresponding .class file or where the class file is older than the .java file will be compiled.


就是说,只有build目录下没有对应的class文件,或者class文件的时间比src的时间old时,才会编译对应的java文件


如果我们部署时,服务器的时间不准确,比当前时间晚上一定的时间,比如一个小时,或一天


那么有可能,我们本次修改的java文件就没有被rsync到对应的服务器上,或者即使rsync过去了,但仍然没有被ant编译


可能就会造成明明修改了java文件,但部署后在对应的服务器上却没有体现修改的内容


上午,在passport部署时,就出现了这个郁闷的问题,后来仔细分析了一下,发现正是41.239的服务器时间不正确导致的


所以,最好在服务器上加一个ntpdate的cron,来定期同步服务器的时间,保证其正确性

最新文章

最近回复

  • feifei435:这两个URI实际是不一样的
  • zsy: git push origin 分支 -f 给力!
  • 冼敏兵:简单易懂,good fit
  • Jack:无需改配置文件,看着累! # gluster volume se...
  • Mr.j:按照你的方法凑效了,折腾死了。。。。
  • zheyemaster:补充一句:我的网站路径:D:\wamp\www ~~菜鸟站长, ...
  • zheyemaster:wamp2.5(apache2.4.9)下局域网访问403错误的...
  • Git中pull对比fetch和merge | 炼似春秋:[…] 首先,我搜索了git pull和git fe...
  • higkoo:总结一下吧, 性能调优示例: gluster volume s...
  • knowaeap:请问一下博主,你维护的openyoudao支持opensuse吗

分类

归档

其它