2010-7-26 Updated: 支持侦测繁忙服务器。 Code: 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 #!/bin/bash LOCAL_PORT=7070 auto_login_ssh () { expect -c "set timeout -1; spawn ssh [...]
Vim has been so graceful that I like to have any text editing work done in her, especially coding and blogging. As a Firefox user, I previously use scribefire to write to my wordpress blog, actually I was working with HTML, I don't like WYSIWYG editing, which always creates dirty codes. However, scribefire is not [...]
我的U盘是跟钥匙系一起的,最近两次因为U盘插在公司机器上下班后忘了拿,结果回家后在门口游荡,郁闷的等室友回来才有家门进,于是要做这么个东西,关机前检测到没拔U盘,要猛叫猛叫。 原理倒是不复杂,研究了下,检测U盘可以读取/proc/bus/usb/devices,如果主机上插有U盘,会出现Driver=usb-storage这一行的。 然后是关机脚本的运行。Linux关机时候会执行level 0的init脚本,比如对于Debian/Ubuntu,就是/etc/rc0.d下的文件,我工作机跑的是Archlinux,专门为用户自定命令提供了/etc/rc.local.shutdown文件,作为/etc/rc.shutdown的hook,前者不会因为initscripts包的升级安装被覆盖。 至于让主机会叫,当然是主机喇叭了,这里可没有外放音箱。查了下发现beep这个程序,安装后发现功能还不少,可以定制beep的音调,时长等,可玩性很高。于是先找了音谱频率对照表,按把美剧《24小时》里面CTU内常用的电话铃声谱了出来,大概是EEGC 或者 EEC^C的样子,不过因为主板蜂鸣器的结构区别,通常不同频率的音量有些不同。 另外当然也应该有点视觉提示啦,在init script里面,终端支持的东西多着呢,按终端颜色代码,让终端打印红色加粗闪烁体,足够显眼了。 最终效果是这样的: 1 2 3 4 5 6 7 8 9 10 #!/bin/bash # # /etc/rc.local.shutdown: Local shutdown script. # while [[ `cat /proc/bus/usb/devices | grep usb-storage` ]]; do echo -e "\033[43;31;1;5m!!!!!! Unplug Your USB Driver or I'll Keep SCREAMING !!!!!!! \033[0m" beep -f 659.3 -l [...]
用于shell脚本无交互的ssh自动登陆 ssh连接远程主机时候询问密码,跟su、sudo命令的默认行为一样,是不从stdin读入数据的,据称是为安全考虑,但是有时候在脚本当中确实需要无人守值的登陆。 搜索一下不难找到类似的例子,使用expect来完成密码应答: 1 2 3 4 5 6 7 8 9 10 #!/bin/bash auto_login_ssh () { expect -c "set timeout -1; spawn -noecho ssh -o StrictHostKeyChecking=no $2 ${@:3}; expect *assword:*; send -- $1\r; interact;"; } auto_login_ssh passwd user@host StrictHostKeyChecking=no参数让ssh默认添加新主机的公钥指纹,也就不会出现出现是否继续yes/no的提示了。 expect很不错,上述代码基本可以达到要求了,能够当翻墙用的ssh -D自动登陆,执行远程命令等等,但是如果作为一个非交互的远程工具,应该说还差一点,不能返回整个连接执行过程是否成功。 使用expect后,程序的exit status是expect的,而不是ssh的,所以如果遇上连接不到的主机、密码错误等情况,expect也一样是正常退出,$?为0,所以需要对expect的代码稍加修改; 1 2 3 4 5 6 7 8 9 10 [...]
整系统的备份,应该很多人会想起Ghost,其实开源界有其相应的实现,比如CloneZilla、Partimage,或者原始点的dd,对备份Linux来说,这些Linux原生的工具显然要比需要DOS/WinPE环境的Ghost要更加“原汁原味”,而且开源版的工具功能一点也不少,一样可以网络传输等,而且支持多种格式(或者说格式无关,dd),不过本文关注的,是一个更加原始的方法,tar。 tar的历史都好几十年了,它的用法没有改变,而且相信未来很几十年内都不会变,而且作为一个日常常用的压缩解压工具,很多人都可以对它自如控制。其实,tar是很好的系统备份/迁移工具,它抽象于文件系统,不管是从ext迁移到reiserfs,从普通文件系统到LVM,还是到RAID,比起上述的那些影像工具,tar可以说是最胜任的迁移工具。 其实Ubuntu的社区文档BackupYourSystem/TAR有详细的解析和介绍,我在这里抄录一些重点,不做过多解释,看命令: 创建备份: cd / tar -cvpzf backup.tar.gz --exclude=/backup.tar.gz --exclude=/lost+found --exclude=/proc/* --exclude=/sys/* --exclude=/mnt/* --exclude=/media/* --exclude=/dev/* / 恢复备份: tar -xvpzf /home/test/backup.tar.gz -C / 通过网络接收备份并恢复: nc -l -p 1024 | tar -xvpjf - -C /mnt/disk 或者:(这个就不用nc了,也就不需要下面那行,但是要开sshd) ssh user@host cat backfile.tar.gz |tar -xvpzf - -C /mnt/disk 通过网络发送备份: cat backup.tar.gz | nc -q 0 192.168.1.x 1024 通过网络发送备份成文件等,按需自由配置。 【这里用的nc是netcat工具,提供稳定的后台网络连接;另外archlinux下默认安装的gnu-netcat不支持-q参数,意为管道传输完后退出,一般在发送方配置,如果省了,可以人工Ctrl+C结束之】 [...]
快捷键打开关闭:Project (\P):给.vimrc添加 nmap <silent> <Leader>P <Plug>ToggleProject 项目信息记录在~/.vimprojects Project窗口可直接编辑,添加删除完全跟vim编辑文件一致: 删除项目:zm折叠全部,光标移动到项目行,dd。 在Project窗口,对光标文件名按Return(Enter),即在右窗口打开该文件; 水平分割右窗口,增加打开该文件; 在右边窗口打开文件,同时水平打开一新窗口(跟help描述不符!!) 如果安装有miniBufExplorer插件,当打开超过一个文件,顶部出现一个MiniBufExplorer,相当于tab,在相应位置按即可在右窗口打开该文件;至于关闭,按d就是。按在该窗口内按<Tab>、<S-Tab>可以前后选中各个文件。可用tabbar插件替代,增加了Alt+1,2,3 或者ctrl+tab这样切换各个标签。 以下命令,大写为递归作用。 \r \R 更新项目 \c \C 创建项目 \w \W 删除文件 \g \G 搜索文件 vim-project的Help,中文版翻译:http://www.cppblog.com/DrMagic/archive/2007/11/19/36964.html (发现部分特性跟Help描述不符,可能vim版本问题) 另外一篇实用手记:http://lebenbeck.blogspot.com/2009/01/vim-project-plugin.html PS: \g \G搜索功能是按quickfix list返回的,quickfix用法速记(quicklist本来作用是记录编译器出错的信息,以下的“错误”指找到的文本): :cc 显示当前错误 :cl[ist] 显示列表 :cN[ext] next :cp[revious] previous :cr[ewind] 【num】 调到某错误 :cope[n] 打开错误窗口 :ccl[ose] 关闭错误窗口 另有Location List,作用跟用法完全一样,只是命令的开头字母c换成l。
此前文章《最简单方法远程调试Python多进程子程序》利用了Unix管道文件以及简单的bash来配合调试多进程子程序,但也因此没法跨平台支持windows下的子进程调试,这次简单使用socket接口写了个模块,利用类文件对象传给Pdb的构造,因此不仅可以跨平台,甚至跨机器,跨网络调试都没问题(通常不会这么BT的)。 使用方法,用回之前的例子: 先在终端运行调试服务端: python -c "import rm_pdb; rm_pdb.server()" 在另外的终端运行这个文件: multiproces_debug.py 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 #!/usr/bin/python import multiprocessing import pdb import rm_pdb def child_process(): print "Child-Process" rm_pdb.pdb().set_trace() var = "debug me!" def main_process(): print "Parent-Process" p [...]
Python 2.6新增的multiprocessing,即多进程,给子进程代码调试有点困难,比如python自带的pdb如果直接在子进程代码里面启动会抛出一堆异常,原因是子进程的stdin/out/err等文件都已关闭,pdb无法调用。据闻winpdb、Wing IDE的调试器能够支持这样的远程调试,但似乎过于重量级(好吧前者比后者要轻多了,但一样要wxPython的环境,再说pdb的灵活可靠它们难以比拟)。 其实只需稍作改动即可用pdb继续调试子进程的代码,思路来自这个博客:子进程的stdin/out/err关闭了,那可以自己重新按/dev/stdout的名称打开来用。当然这指*nix下,win下要麻烦一些,后面再说。 pdb支持自定义输出输入的文件,我再稍作改动,使用fifo管道(Named Pipe)来完成pdb的输出输入的重定向,这样的好处是,可以同时对父子进程调试! multiproces_debug.py 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 #!/usr/bin/python import multiprocessing import pdb def child_process(): print "Child-Process" pdb.Pdb(stdin=open('p_in', 'r+'), stdout=open('p_out', 'w+')).set_trace() var = "debug me!" def main_process(): print "Parent-Process" p = multiprocessing.Process(target = [...]
Page optimized by WP Minify WordPress Plugin