Sunday, September 19, 2010

 

sshtunnel

#!/bin/bash -
#===============================================================================
#
# FILE: sshtunnel.sh
#
# USAGE: ./sshtunnel.sh
#
# DESCRIPTION: for ssh link the blockcn file server.
#
# OPTIONS: ---
# REQUIREMENTS: ---
# BUGS: ---
# NOTES: ---
# AUTHOR: kk (Kingkong Mok), kingkongmok@gmail.com
# COMPANY:
# CREATED: 09/18/2010 11:26:11 PM CST
# REVISION: ---
#===============================================================================

set -o nounset # Treat unset variables as an error

if [ `whoami` = root ] ; then
su kk -c "ssh -qTfnN -D 7070 kingkongmok@ssh201.blockcn.com"
else
exit 3;
fi


Saturday, September 18, 2010

 

wget

wget 使用技巧

2007-10-14 Toy Posted in TipsRSSTrackback

wget 是一个命令行的下载工具。对于我们这些 Linux 用户来说,几乎每天都在使用它。下面为大家介绍几个有用的 wget 小技巧,可以让你更加高效而灵活的使用 wget。

* $ wget -r -np -nd http://example.com/packages/

这条命令可以下载 http://example.com 网站上 packages 目录中的所有文件。其中,-np 的作用是不遍历父目录,-nd 表示不在本机重新创建目录结构。

* $ wget -r -np -nd --accept=iso http://example.com/centos-5/i386/

与上一条命令相似,但多加了一个 --accept=iso 选项,这指示 wget 仅下载 i386 目录中所有扩展名为 iso 的文件。你也可以指定多个扩展名,只需用逗号分隔即可。

* $ wget -i filename.txt

此命令常用于批量下载的情形,把所有需要下载文件的地址放到 filename.txt 中,然后 wget 就会自动为你下载所有文件了。

* $ wget -c http://example.com/really-big-file.iso

这里所指定的 -c 选项的作用为断点续传。

* $ wget -m -k (-H) http://www.example.com/

该命令可用来镜像一个网站,wget 将对链接进行转换。如果网站中的图像是放在另外的站点,那么可以使用 -H 选项。

============================================================================================

转自http://linux.ccidnet.com/art/1101/20051128/628467_1.html

A。使用wget工具

linux所以的主要版本都自带了wget这个下载工具.

bash$ wget http://place.your.url/here

它还能控制ftp来下载整个web站点的各级目录,当然,如果你不小心,可能会把整个网站以及其他和他做链接的网站全部下载下来.

bash$ wget -m http://target.web.site/subdirectory

由于这个工具具有很将的下载能力,所以可以在服务器上把它用作镜像网站的工具.让它按照"robots.txt"的规定来执行.
有很多参数用来控制它如何正确地做镜像,可以限制链接的类型和下载文件的类型等等.例如:只下载有联系的链接并且忽略GIF图片:

bash$ wget -m -L --reject=gif http://target.web.site/subdirectory

wget也能够实现端点续传(-c参数),当然,这种操作是需要远程服务器支持的.

bash$ wget -c http://the.url.of/incomplete/file

可以把端点续传和镜像功能结合起来,这样可以在以前断过多次的情况下继续镜像一个有大量选择性文件的站点.如何自动实现这个目的我们在后面会讨论得更多.
如果你觉得下载时老是断线会影响你办公的话,你可以限制wget重试的次数.
bash$ wget -t 5 http://place.your.url/here
这样重试五次后就放弃了.用"-t inf"参数表示永远不放弃.不停地重试.

B.那对于代理服务该怎么办呢?
可以使用http代理的参数或者在.wgetrc配置文件里指定一个如何通过代理去下载的途径.但是有这么一个问题,
如果通过代理来进行端点续传的话可能会有几次失败.如果有一次通过代理下载的过程发生中断,那么代理服务器上缓存里保存是那个完整的
文件拷贝.所以当你用"wget -c"来下载剩余部分的时候代理服务器查看它的缓存,并错误地认为你已经下载了整个文件.于是就发出了错误的信号.
这个时候你可以用添加一个特定的请求参数来促使代理服务器清除他们的缓存:

bash$ wget -c --header="Pragma: no-cache" http://place.your.url/here

这个"--header"参数能够以各种数字,各种方式添加。通过它我们可以更改
web服务器或者代理服务器的某些属性。有些站点不提供外部连接的文件服务,只有通过同一个站点上其他的一些页面时内容
才会被提交。这个时候你可以用加上"Referer:"
参数:
bash$ wget --header="Referer: http://coming.from.this/page" http://surfing.to.this/page
有些特殊的网站只支持某种特定的浏览器,这个时候可以用"User-Agent:"参数
bash$ wget --header="User-Agent: Mozilla/4.0 (compatible; MSIE 5.0;Windows NT; DigExt)" http://msie.only.url/here


C.那我怎么设定下载时间呢?
如果你需要在你的办公电脑上通过和其他同事共享的一个连接来下载一些很大的文件,而且你希望你的同事不会因为网络速度的减慢而收到影响,
那你就应该尽量避开高峰时段。当然,不需要在办公室里等到所以人都走掉,也不需要在家里用完晚饭后还惦记着要上网下载一次。
用at来就可以很好的定制工作时间:
bash$ at 2300
warning: commands will be executed using /bin/sh
at> wget http://place.your.url/here
at> press Ctrl-D
这样,我们设定了下载工作在晚上11点进行。为了使这个安排能够正常进行,请确
认atd这个后台程序正在运行。

D.下载要花很多时间?
当你需要下载大量的数据,而且你又没有享有足够的带宽,这个时候你会经常发现在你安排的下载任务还没有完成,一天的工作却又要开始了。
作为一个好同事,你只能停掉了这些任务,而开始另外的工作。然后你又需要反复地重复使用"wget -c"来完成你的下载。这样肯定太繁琐了,
所以最好是用crontab来自动执行。创建一个纯文本文件,叫做"crontab.txt",包含下面的内容:
0 23 * * 1-5 wget -c -N http://place.your.url/here
0 6 * * 1-5 killall wget
这个crontab文件指定某些任务定期地执行。前五列声明是什么时候执行这个命令,而每行的剩余部分则告诉crontab执行什么内容。
前两列指定了每天一到晚上11点就开始用wget下载,一到早上6点就停止一切wget
下载。第三四列的*表示每个月的每一天都执行这个任务。第五列则指定了一个星期的哪几天来执行这个程序。 --"1-5"表示从星期一
到星期五。

这样在每个工作日的晚上11点,下载工作开始,到了上午的6点,任何的wget任务
就被停掉了。你可以用下面的命令来执行crontab:
bash$ crontab crontab.txt
wget的这个"-N"参数将会检查目标文件的时间戳,如果匹配了,下载程序就会停止,因为它说明整个文件已经下载完全了。
用"crontab -r"可以删除这个计划安排。我已经多次采用这种方法,通过共享的电话拨号来下载过很多的ISO镜像文件,还是
比较实用的。

E.如何下载动态变化的网页
有些网页每天都要根据要求变化好几次.所以从技术上讲,目标不再是一个文件,它没有文件长度.因此"-c"这个参数也就失去了意义.
例如:一个PHP写的并且经常变动的linux周末新闻网页:
bash$ wget http://lwn.net/bigpage.php3

我办公室里的网络条件经常很差,给我的下载带了很大的麻烦,所以我写了个简单的脚本来检测动态页面是否已经完全更新了.
#!/bin/bash

#create it if absent
touch bigpage.php3

#check if we got the whole thing
while ! grep -qi bigpage.php3
do
rm -f bigpage.php3

#download LWN in one big page
wget http://lwn.net/bigpage.php3

done
这个脚本能够保证持续的下载该网页,直到网页里面出现了"",这就表示该文件已经完全更新了.



F.对于ssl和Cookies怎么办?
如果你要通过ssl来上网,那么网站地址应该是以"https://"来开头的.在这样的情况下你就需要另外一种下载工具,叫做curl,它能够
很容易获得.有些网站迫使网友在浏览的时候必须使用cookie.所以你必须从在网站上得到的那个Cookie里面得到"Cookie:"这个参数.这样才
能保证下载的参数正确.对于lynx和Mozilla的Cookie的文件格式,用下面的:
bash$ cookie=$( grep nytimes ~/.lynx_cookies |awk {printf("%s=%s;",$6,$7)} )
就可以构造一个请求Cookie来下载http://www.nytimes.com上的内容.当然,你要已经用这个浏览器在该网站上完成注册.
w3m使用了一种不同的,更小巧的Cookie文件格式:
bash$ cookie=$( grep nytimes ~/.w3m/cookie |awk {printf("%s=%s;",$2,$3)} )
现在就可以用这种方法来下载了:
bash$ wget --header="Cookie: $cookie" http://www.nytimes.com/reuters/technology/tech-tech-supercomput.html
或者用curl工具:
bash$ curl -v -b $cookie -o supercomp.html http://www.nytimes.com/reuters/technology/tech-tech-supercomput.htm

G.如何建立地址列表?
到现在为止我们下载的都是单个文件或者是整个网站.有的时候我们需要下载某个网页上链接的大量文件,但没有必要把它整个网站
都镜像下来.比如说我们想从一个依次排列的100首歌里面下载前20首.注意,这里"--accept"和"--reject"参数是不会
起作用的,因为他们只对文件操作起作用.所以一定要用"lynx -dump"参数来代替.
bash$ lynx -dump ftp://ftp.ssc.com/pub/lg/ |grep gz$ |tail -10 |awk {print $2} > urllist.txt
lynx的输出结果可以被各种GNU文本处理工具过虑.在上面的例子里,我们的链接地址是以"gz"结尾的,并且把最后10个文件地址放到
urllist.txt文件里.然后我们可以写一个简单的bash脚本来自动下载这个文件里的目标文件:

bash$ for x in $(cat urllist.txt)
> do
> wget $x
> done
这样我们就能够成功下载Linux Gazette网站(ftp://ftp.ssc.com/pub/lg/)上的最新10个论题.



H.扩大使用的带宽
如果你选择下载一个受带宽限制的文件,那你的下载会因为服务器端的限制而变得很慢.下面这个技巧会大大缩短下载的过程.但这个技巧
需要你使用curl并且远程服务器有多个镜像可以供你下载.例如,假设你想从下面的三个地址下载Mandrake 8.0:
url1=http://ftp.eecs.umich.edu/pub/linux/mandrake/iso/Mandrake80-inst.iso
url2=http://ftp.rpmfind.net/linux/Mandrake/iso/Mandrake80-inst.iso
url3=http://ftp.wayne.edu/linux/mandrake/iso/Mandrake80-inst.iso
这个文件的长度是677281792个字节,所以用curl程序加"--range"参数来建立三个同时进行的下载:
bash$ curl -r 0-199999999 -o mdk-iso.part1 $url1 &
bash$ curl -r 200000000-399999999 -o mdk-iso.part2 $url2 &
bash$ curl -r 400000000- -o mdk-iso.part3 $url3 &
这样就创建了三个后台进程.每个进程从不同的服务器传输这个ISO文件的不同部分.这个"-r"参数指定目标文件的字节范围.当这三个
进程结束后,用一个简单的cat命令来把这三个文件衔接起来-- cat mdk-iso.part? > mdk-80.iso.(强烈建议在刻盘之前先检查md5)
你也可以用"--verbose"参数来使每个curl进程都有自己的窗口来显示传输的过程.

结束语
不用担心使用非交互式的下载方式会影响你的下载效果.无论网站设计者如何绞尽脑汁想阻止我们从他们的网站下载,我们都可以得到
免费的工具来自动完成下载任务.这会大大丰富我们的网络经历.

Friday, September 17, 2010

 

pick_by_random

#!/bin/bash -
#===============================================================================
#
# FILE:
#
# USAGE:
#
# DESCRIPTION: pick up a parameter arguments for ${array[@]}
#
# OPTIONS: ---
# REQUIREMENTS: ---
# BUGS: ---
# NOTES: ---
# AUTHOR: kk (kingkongmok@grail.com),
# COMPANY:
# CREATED: 09/14/2010 03:57:51 PM CST
# REVISION: ---
#===============================================================================

set -o nounset # Treat unset variables as an error

arrays=($@)
NUMB=${#arrays[@]}
echo "$NUMB"

while true ; do
read kick;

RANDOMNUMB=$((RANDOM%$NUMB))
echo "$RANDOMNUMB"
echo "it's ${arrays[RANDOMNUMB]}"
done

 

lockcomputer

#!/bin/bash -
#===============================================================================
#
# FILE: lockcomputer.sh
#
# USAGE: ./lockcomputer.sh
#
# DESCRIPTION: lock the computer with screensaver and turn off the dpms
#
# OPTIONS: ---
# REQUIREMENTS: ---
# BUGS: ---
# NOTES: ---
# AUTHOR: kk (kingkongmok@gmail.com),
# COMPANY:
# CREATED: 09/03/2010 05:17:53 PM CST
# REVISION: ---
#===============================================================================

set -o nounset # Treat unset variables as an error


gnome-screensaver-command -l
while true ; do xset dpms force off ; sleep 10; done

 

voa_online

#!/bin/bash

while true ; do
mplayer -cache 100 rtsp://a1702.l211048984.c2110.g.lr.akamaistream.net:554/live/D/1702/2110/v0001/reflector:48984;
sleep 2;
done

 

change_name

#!/bin/bash -
#===============================================================================
#
# FILE: change_name.sh
#
# USAGE: ./change_name.sh
#
# DESCRIPTION: for change files name.
#
# OPTIONS: ---
# REQUIREMENTS: ---
# BUGS: ---
# NOTES: ---
# AUTHOR: kk (kingkongmok@gmail.com),
# COMPANY:
# CREATED: 09/17/2010 08:48:39 AM CST
# REVISION: ---
#===============================================================================

set -o nounset # Treat unset variables as an error


WORKDIRECTORY=""
if [ $# -lt 1 ] ; then
WORKDIRECTORY=`pwd`
else
if [ -n $1 ] ; then
if [ -d $1 ]; then
WORKDIRECTORY=$1
else
echo "$1 not exists"
fi
fi
fi

FILES=""
FILES=($WORKDIRECTORY/*)


echo "WORKDIRECTORY is ${WORKDIRECTORY}"

echo "files' numb is ${#FILES[@]}"
NUMB=${#FILES[@]}
FILES_LENGTH=${#NUMB}
echo "the file numb's digit length is ${FILES_LENGTH}"
FILES_ITERATOR=""



for (( FILES_ITERATOR=0; FILES_ITERATOR<${#FILES[@]}; FILES_ITERATOR+=1 )); do
FILE_ITERATOR_LENGTH_TEMP=$((FILES_ITERATOR+1))
FILES_ITERATOR_LENGTH=${#FILE_ITERATOR_LENGTH_TEMP}
echo "FILES_ITERATOR_LENGTH is $FILES_ITERATOR_LENGTH"
ZERO_NUMB=$(( $((FILES_LENGTH)) - $((FILES_ITERATOR_LENGTH)) ))
for (( CNTR=0; CNTR<$ZERO_NUMB; CNTR+=1 )); do
echo -n "0"
done
echo "$((FILES_ITERATOR+1))${FILES[FILES_ITERATOR]##*/} "
echo
done

Saturday, September 11, 2010

 

最牛bash

注转载来自于 http://www.isspy.com/most_useful_linux_commands_1/的”最牛B的 Linux Shell 命令系列连载”文章。
个人认为作为 Linux 用户,熟练掌握 CLI 命令是一个比较基本的能力,而这篇连载文章提供了更深层次的内容,可以帮助大家学习到更多有用的内容。

编者按

本文编译自commandlinefu.com ( 应该是 Catonmat ) 的系列文章 Top Ten One-Liners from CommandLineFu Explained 。作为一个由用户推荐最有用shell命令的网站,其记录了数以万计的各色shell命令,其中不乏相当实用和有趣的,本文就要细数当中获投票最高的一些命令,从其中取材并加以细释,希望读者能从中受益。

引言

Shell作为Unix系操作系统当中最有魅力且不可或缺的组件,经过数十载的洗礼不仅没有被淘汰,而且愈加变得成熟稳健,究其原因,大概因为它是个非常稳固的粘合剂,能够把大量功能强大的组件任意配搭,总能很好很快地完成用户的任务。

本文的一些命令很可能看起来是”雕虫小技”,我们只好仰慕一下Shell大牛了,但是有些细节我会稍加发掘加以说明,遇到有趣的地方希望能博您一笑了。

1.以SUDO运行上条命令

$ sudo !!

大家应该都知sudo,不解释。但通常出现的情况是,敲完命令执行后报错才发现忘了sudo。这时候,新手用户就会:按上箭头,按左箭头,盯着光标回到开始处,输入sudo,回车;高手用户就蛋定多了,按Ctrl-p,按Ctrl-a,输入sudo,回车。
这里介绍这个是天外飞仙级别的,对,就直接sudo !!。
当然这几种解决方式效果是完全一样的,只是款不一样,嗯,不解释。
两个感叹号其实是bash的一个特性,称为事件引用符(event designators)。!!其实相当于!-1,引用前一条命令,当然也可以!-2,!-50。默认情况下bash会在~/.bash_history 文件内记录用户执行的最近500条命令,history命令可以显示这些命令。
关于事件引用符的更多用法可以深入阅读 The Definitive Guide to Bash Command Line History。

2.以HTTP方式共享当前文件夹的文件

$ python -m SimpleHTTPServer

这命令启动了Python的SimpleHTTPServer模块,考虑到Python在绝大多数的Linux发行版当中都默认安装,所以这个命令很可能是最简单的跨平台传文件的方法。
命令执行后将在本机8000端口开放HTTP服务,在其他能访问本机的机器的浏览器打开ttp://ip:8000即打开一个目录列表,点击即可下载。

3.在以普通用户打开的VIM当中保存一个ROOT用户文件

:w !sudo tee %

这题目读起来纠结,其实是很常见的,常常忘记了sudo就直接用vim编辑/etc内的文件,(不过也不一定,vim发现保存的文件无法保存时候会提示)等编辑好了,保存时候才发现没权限。曲线方法是先保存个临时文件,退出后再sudo cp回去。不过实际上在vim里面可以直接完成这个过程的,命令就是如此。
查阅vim的文档(输入:help :w),会提到命令:w!{cmd},让vim执行一个外部命令{cmd},然后把当前缓冲区的内容从stdin传入。
tee是一个把stdin保存到文件的小工具。
而%,是vim当中一个只读寄存器的名字,总保存着当前编辑文件的文件路径。
所以执行这个命令,就相当于从vim外部修改了当前编辑的文件,好完工。

4.切换回上一个目录

$ cd -

应该不少人都知道这个,横杆-代表上一个目录的路径。
实际上cd -就是cd $OLDPWD的简写,bash的固定变量$OLDPWD总保存着之前一个目录的路径。
相对地,$PWD总保存着当前目录的路径。这些变量在编写shell脚本时候相当有用。

5.替换上一条命令中的一个短语

$ ^foo^bar^

又是另外一个事件引用符(event designator),可以把上一条命令当中的foo替换成bar。
在需要重复运行调试一道长长的命令,需要测试某个参数时候,用这个命令会比较实用;但多数人会首先选择按上箭头提出上道命令,再移动光标去修改某参数,这样更直观,但效率上就不够使用引用符高,而且在脚本中用这个方法可以简化很多。
这道命令的原始样式应该是这样的:

!!:s/foo/bar/

本文一开始介绍过!!,后面的一段大家应该很熟悉,vim、sed的替换操作都是这样的语法。

关于事件引用符的更多用法可以深入阅读The Definitive Guide to Bash Command Line History

6.快速备份一个文件

$ cp filename{,.bak}

这道命令把filename文件拷贝成filename.bak,大家应该在一些比较复杂的安装教程里面见过这样的用法。其原理就在于bash对大括号的展开操作,filename{,.bak}这一段会被展开成filename filename.bak再传给cp,于是就有了备份的命令了。

大括号在bash里面是一个排列的意义,可以试试这个

$ echo {a,b,c}{a,b,c}{a,b,c}

将输出三个集合的全排列:

aaa aab aac aba abb abc aca acb acc
baa bab bac bba bbb bbc bca bcb bcc
caa cab cac cba cbb cbc cca ccb ccc
关于shell当中的集合操作,可深入阅读”Set Operations in the Unix Shell”

7.免密码SSH登录主机

$ ssh-copy-id remote-machine

这个命令把当前用户的公钥串写入到远程主机的~/.ssh/authorized_keys内,这样下次使用ssh登录的时候,远程主机就直接根据这串密钥完成身份校验,不再询问密码了。前提是你当前用户有生成了公钥,默认是没有的,先执行ssh-keygen试试吧!
这个命令如果用手工完成,是这样的

your-machine$ scp ~/.ssh/identity.pub remote-machine:
your-machine$ ssh remote-machine
remote-machine$ cat identity.pub >> ~/.ssh/authorized_keys

如果你想删掉远程主机上的密钥,直接打开authorized_keys,搜索你的用户名,删除那行,即可。

8.抓取LINUX桌面的视频

$ ffmpeg -f x11grab -s wxga -r 25 -i :0.0 -sameq /tmp/out.mpg

我们在一些视频网站上看到别人的3D桌面怎么怎么酷的视频,通常就是这么来的,ffmpeg可以直接解码X11的图形,并转换到相应输出格式。
ffmpeg的通常用法是,根据一堆参数,输出一个文件,输出文件通常放最后,下面解析下几个参数:
-f x11grab 指定输入类型。因为x11的缓冲区不是普通的视频文件可以侦测格式,必须指定后ffmpeg才知道如何获得输入。
-s wxga 设置抓取区域的大小。wxga是1366*768的标准说法,也可以换成-s 800×600的写法。
-r 25 设置帧率,即每秒抓取的画面数。
-i :0.0 设置输入源,本地X默认在0.0
-sameq 保持跟输入流一样的图像质量,以用来后期处理。
至于其他ffmpeg的用法,可以参考下面两篇文章:

How to Extract Audio Tracks from YouTube Videos
Converting YouTube Flash Videos to a Better Format with ffmpeg

后记

说 Shell是一种编程语言,可能有些尴尬,虽然很多人每天都在用Shell,但从来没见它荣登TIOBE编程语言排行榜之类的,可以说毫无名分,因为很多用户没意识到它是一种语言,只当做这是一个能够很好完成任务的工具,基本得理所当然,就好像GUI程序的菜单、按钮一样。

掌握 Shell,通常能够让任务在数秒钟内完成,这就让Shell跟C、Perl、Python这些语言区别开来,没人否认后者更能胜任更多的任务,但是他们是在不同的层面上去做,Shell依赖大量的系统组件黏合调用,而后者依赖各种库,各所擅长不同的应用领域,比喻就是,Shell是混凝土,可以很方便地粘合一些建筑组件而成为稳固的高楼大厦;但同样是粘合剂,粘玻璃窗、粘书报、粘皮鞋,混凝土是绝对不合适的,Shell并不擅长一些细致操作,比如它连浮点运算都不支持,更别提什么图形运算什么的。但这并不妨碍Shell来帮我们完成很多粗重任务。

Shell的工作方式,大多数入门用户会觉得枯燥难学,而所谓的经典教材也离不开《Advanced Bash-Scripting》、《Bash Guide for Beginners》,但类似本文这样的一些”雕虫小技”因为难登大雅之堂绝不会收录进去。这情况如果象国外一些unix用户比较多的地方会有很好改善,即使是新手,偶尔看看别人的操作都能”偷师”一手,我编译本系列文章其实也就希望稍微改善一下这个状况。


Thursday, September 09, 2010

 

qemu

http://www.crazysquirrel.com/computing/debian/applications/xp-under-debian-with-qemu.jspx
QEMU

QEMU is a fairly complete x86 emulator that lets you run one operating system under another. Currently it is best supported under Linux where it can host numerous other OSes. This guide looks are running Windows XP under QEMU on Debian Linux. Note: although Debian is free you must have a license for the copy of Windows XP you will be running.
Installing QEMU

the first thing to do is install QEMU. Simply use apt-get or any one of the other package managers around.

apt-get -u install qemu

Create a Virtual Hard Disk

QEMU uses a large file rather than a real partition to run the guest perating system. This means that it is very easy to create multiple guest systems on the same machine. I have chosen to install Windows XP under /var/qemu for two reasons. Firstly, my home directory is NFS shared off a server - QEMU is quite slow when performing disk access and the network delays would make this worse. Secondly, my home directory is backed up nightly and I don't want to place an undue load on the back up. Apart from these two reasons I would have created the file in my home directory.

The command below will create a file of around 3.5 GB which should be ample for XP + SP2 and a few applications. Note that you won't be working on XP under QEMU. While it's useable it is to slow to work on. I use this set up mainly to check websites in IE.

cd /var/qemu
dd of=xp.img bs=1024 seek=3500000 count=0
0+0 records in
0+0 records out
0 bytes transferred in 1*10-9 seconds (0 bytes/sec)

or

qemu-img xp.img 3.5G

I used the first version but a fair number of people claim the second is better. The main reason given is that dd will allocate the whole 3.5GB in one shot wasting space on the drive. This is actually not the case because of the use of the seek argument. I don't think there is any real difference betwen the two commands.
Install XP

Now that the virtual drive has been created it's time to install XP on it. The command below tells QEMU to boot from the "d" drive and use the /dev/cdrom device as the cdrom and the virtual drive as the first hard disk (hda). Place the XP install cd in /dev/cdrom and start QEMU. You should see a new window pop up and display the XP install sequence.

qemu -boot d -cdrom /dev/cdrom -hda xp.img
QEMU 0.6.0 monitor - type 'help' for more information

Wait...

Wait. Then wait some more while the XP install process takes place. For some reason it takes hours even on a very fast machine. Many people have pointed this out but no one seems to know why. After the install was complete my copy of XP hung on the first boot (no progress and no CPU useage). This has been reported by some people who have waited more than a day for the system to boot with no effect. I got fed up of waiting and shut the virtual machine down and restarted it. I have had this happen with real XP installs as well so I can only assume there is a bug.
Image Backups

Nows quite a good time to take a back up of the install. If something goes wrong you can then simply copy the backup over the dead version and have a fresh install.

cp xp.img clean-xp.img

Set up the Vitrual Network

In order to talk to the outside world you need to set up a virtual network card for QEMU. By default it will try and use tun. The tun device on Debian can't be accessed to by anyone but root by default which isn't very helpful so use the following commands to change that. The first two change permissions the last two load the tun module into the kernel so that tun actually works. Note that the group used here is staff. It might be users on your system.

chgrp staff /dev/net/tun
chmod g+rw /dev/net/tun
modprobe tun
echo 'tun' >> /etc/modules

I found that the group setting on the tun device was reset after a reboot but the permissions weren't. To get round this I set the permissions to 666 (rw for everyone) on the run device. Your mileage may vary of course.

chmod 666 /dev/net/tun

QEMU tries to run the /etc/qemu-ifup script with uses /sbin/ifconfig when it starts a virtual machine. In order to run this you need to give the user running the script the ability to execute ifconfig. This is done using sudo. A very basic example sudo file is shown below.

# Cmnd alias specification
Cmnd_Alias QEMU=/sbin/ifconfig

# User privilege specification
root ALL=(ALL) ALL
%staff ALL=NOPASSWD: QEMU

Note that the default Debain install of QEMU puts the tun device on 172.20.0.1 which means XP should be put on 172.20.0.2 and use 172.20.0.1 as a gateway. If your network doesn't use this block of non-routable addresses it might be worth your time changing this so that the guest OS is in your locak network IP space. I quite like it like this as it makes the virtual machine easy to seperate out on the network.

Once the settings in XP are correct you should be able to ping back and forth between host and guest machine. Setting it up so that the guest can access the Internet is a little harder and I will come to that later. If the machines can't talk to each other make sure that there isn't a firewall blocking communication. XP with SP2 has the firewall switched on by default and my Linux box blocked all non-local traffic.
Boot XP

Now it's time to boot XP. The following command should do it.

qemu -hda xp.img -boot c

I hit a bit of a snag at this point. When I tried to log in I got a message about not being able to activate Windows. Reading around I found out that this is something to do with the virtual network device. The solution, which requires some sneakyness, is given below.
Error code 0x800703e6 on Product Activation - Installing Service Pack 2

Download Windows XP Service Pack 2 while this is a big download it does mean that you won't need to use the network to install it.

Create an iso image of the file with "mkisofs -o sp2.iso "

Mount the iso image as the cdrom under qemu by using the "-cdrom " argument.

Run Service Pack 2 from the virtual CD drive. I got an error message about an "Invalid Access to Memory Location" at one point during the install but it seemed to continue without a problem.
References

* Running Microsoft Windows inside Debian: qemu
* QEMU - Debian - Linux - TUN/TAP - Network Bridge
* SP2 Reference

Other Virtual Machines
VMware
Plex86
Bochs

Friday, September 03, 2010

 

googlecl examplescripts

ExampleScripts
Example commands and tasks GoogleCL can do.

Also see the Manual and the SystemRequirements. Note that (only) the first time you use each service, you'll need to grant authorization from a web browser.
Blogger¶

* google blogger post --tags "GoogleCL, awesome" --title "Test Post" "I'm posting from the command line"
* google blogger post blogpost.txt
* google blogger list title,url-site # List posts
* google blogger delete --title "Test Post"
* google delete --title "Silly post number [0-9]*" # Delete posts matching regex
* google tag --title "Dev post" --tags "Python, software" # label an existing post

Calendar¶

* google calendar add "Dinner party with George today at 6pm" # add event to calendar
* google calendar today # List events for today only.
* google calendar list --date 2010-06-01,2010-06-30 # List events.
* google calendar delete --title "Dinner party with George" # Delete an event.
* google calendar today list --cal .* | egrep '\[.*\]' # List all calendars

Contacts¶

* google contacts add "J. Random Hacker, jrandom@example.com"
* google contacts list name,email --title "J. Random Hacker"
* google contacts delete --title "J. Random Hacker"

Docs¶

* google docs delete --title "Evidence"
* google docs list title,url-direct --delimiter ": " # list docs
* google docs upload the_bobs.csv ~/work/docs_to_share/*

gdata-python-client >= 1.3.0 ONLY

* google docs edit --title "Shopping list" --editor vim
* google docs get --title "Homework [0-9]*"

Picasa¶

* google picasa create --title "Vermont Test" --tags Vermont vermont.jpg
* google picasa get --title "Vermont Test" /path/to/download/folder
* google picasa list title,url-direct --query "A tag"
* google picasa post --title "Vermont Test" ~/old_photos/*.jpg # Add to an album
* google picasa tag --title "Vermont Test" --tags "places"
* google picasa delete --title "Vermont Test" # delete entire album

Youtube¶

* google youtube post --category Education --devtags GoogleCL killer_robots.avi
* google youtube delete --title "killer_robots.avi"
* google youtube list # list my videos
* google youtube tag -n ".*robot.*" --tags robot

Search, Buzz, Gmail, etc.¶

We'd love to support more Google services with GoogleCL, but we're currently limited by the availability of gdata APIs.

Before hacking in our own services, it's probably best if we encourage the gdata teams to add new services (and python interfaces to those new APIs) first.

 

vim

高效率的使用VIM

虽然从很久前就开始用 VIM 了,但一直都是半调吊子,翻来覆去只用自己会的命令。最近为了提高书写代码的效率,还有 coding 时候的乐趣,又重新钻研了一下 VIM,发现了一篇很好的 VIM 入门的文章,原文是英文版的,我觉得非常适合 VIM 使用入门,所以翻译了过来。这里是简单的介绍了 VIM 的操作方式,并没有说为什么要用 VIM,如果你想知道答案可以去 Google,VIM 被誉为编辑器之神。

这篇教程写了在不同工作模式下使用 VIM 的一些基本技巧——即插入模式(insert mode), 命令模式(command mode), 存取文件等。目的是帮助刚刚接触 VIM 的新手更加有效率的使用这个出色的编辑器。

说明:在这篇文章里面, 代表 Ctrl + X——就是按住 Ctrl 键然后再按 X。而且你可以在很多情况下使用 :help command 来获得大部分命令的帮助,这个是 VIM 的内部帮助文件命令。

高效率移动

在插入模式之外

基本上来说,你应该尽可能少的呆在插入模式里面,因为在插入模式里面 VIM 就像一个“哑巴”编辑器一样。很多新手都会一直呆在插入模式里面,因为这样易于使用。但 VIM 的强大之处在于他的命令行模式!你会发现,在你越来越了解 VIM 之后,你就会花越来越少的时间使用插入模式了。

使用 h、j、k、l

使用 VIM 高效率编辑的第一步,就是放弃使用箭头键。使用 VIM,你就不用频繁的在箭头键和字母键之间移来移去了,这会节省你很多时间。当你在命令模式时,你可以用 h、j、k、l 来分别实现左、下、上、右箭头的功能。一开始可能需要适应一下,但一旦习惯这种方式,你就会发现这样操作的高效之处了。

在你编辑你的电子邮件或者其他有段落的文本时,你可能会发现使用方向键和你预期的效果不一样,有时候可能会一次跳过了很多行。这是因为你的段落在 VIM 看来是一个大的长长的行。这时你可以在按 h、j、k 或者 l 之前键入一个 g,这样 VIM 就会按屏幕上面的行如你所愿的移动了。

在当前行里面有效的移动光标

很多编辑器只提供了简单的命令来控制光标的移动(比如左、上、右、下、到行首/尾等)。VIM 则提供了很多强大的命令来满足你控制光标的欲望。当光标从一点移动到另外一点,在这两点之间的文本(包括这两个点)称作被“跨过”,这里的命令也被称作是 motion。(简单说明一下,后面会用到这个重要的概念)

这里是常用到的一些命令(motion):

* fx:移动光标到当前行的下一个 x 处。很明显,x 可以是任意一个字母,而且你可以使用 ; 来重复你的上一个 f 命令。
* tx:和上面的命令类似,但是是移动到 x 的左边一个位置。(这真的很有用)
* Fx:和 fx 类似,不过是往回找。
* w:光标往前移动一个词。
* b:光标往后移动一个词。
* 0:移动光标到当前行首。
* ^:移动光标到当前行的第一个字母位置。
* $:移动光标到行尾。
* ):移动光标到下一个句子。
* ( :移动光标到上一个句子。

在整个文件里面有效移动光标

VIM 有很多命令,可以用来到达文件里面你想到达的地方。下面是一些在文件里面移动的命令:

* :向下移动一屏。
* :向上移动一屏。
* G:到文件尾
* numG:移动光标到指定的行(num)。(比如 10G 就是到第 10 行)
* gg:到文件首
* H:移动光标到屏幕上面
* M:移动光标到屏幕中间
* L:移动光标到屏幕下面
* *:读取光标处的字符串,并且移动光标到它再次出现的地方。
* #:和上面的类似,但是是往反方向寻找。
* /text:从当前光标处开始搜索字符串 text,并且到达 text 出现的地方。必须使用回车来开始这个搜索命令。如果想重复上次的搜索的话,按 n。
* ?text:和上面类似,但是是反方向。
* ma:在当前光标的位置标记一个书签,名字为 a。书签名只能是小写字母。你看不见书签的存在,但它确实已经在那里了。
* `a:到书签 a 处。注意这个不是单引号,它一般位于大部分键盘的 1 的左边。
* `.:到你上次编辑文件的地方。这个命令很有用,而且你不用自己去标记它。

高效的输入

使用关键词自动完成

VIM 有一个非常漂亮的关键词自动完成系统。这表示,你可以输入一个长词的一部分,然后按一下某个键,然后 VIM 就替你完成了这个长词的输入了。举个例子:你有一个变量名为 iAmALongAndAwkwardVarName 在你写的代码的某个地方。也许你不想每回都自己一个一个字母的去输入它。

使用关键词自动完成功能,你只需要输入开始几个字母(比如 iAmAL),然后按 (按住 Ctrl,再按 N)或者 。如果 VIM 没有给出你想要的词,继续按,直到你满意为止,VIM 会一直循环它找到的匹配的字符串。

聪明的进入插入模式

很多新手进入插入模式都只是用 i。这样当然可以进入插入模式,但通常不是那么合适,因为 VIM 提供了很多进入插入模式的命令。下面是最常用的一些:

* i:在当前字符的左边插入
* I:在当前行首插入
* a:在当前字符的右边插入
* A:在当前行尾插入
* o:在当前行下面插入一个新行
* O:在当前行上面插入一个新行
* c{motion}:删除 motion 命令跨过的字符,并且进入插入模式。比如:c$,这将会删除从光标位置到行尾的字符并且进入插入模式。ct!,这会删除从光标位置到下一个叹号(但不包括),然后进入插入模式。被删除的字符被存在了剪贴板里面,并且可以再粘贴出来。
* d{motion}:和上面差不多,但是不进入插入模式。

有效的移动大段的文本

使用可视选择(visual selections)和合适的选择模式

不像最初的 VI,VIM 允许你高亮(选择)一些文本,并且进行操作。这里有三种可视选择模式:

* v:按字符选择。经常使用的模式,所以亲自尝试一下它。
* V:按行选择。这在你想拷贝或者移动很多行的文本的时候特别有用。
* :按块选择。非常强大,只在很少的编辑器中才有这样的功能。你可以选择一个矩形块,并且在这个矩形里面的文本会被高亮。

在选择模式的时候使用上面所述的方向键和命令(motion)。比如,vwww,会高亮光标前面的三个词。Vjj 将会高亮当前行以及下面两行。

在可视选择模式下剪切和拷贝

一旦你高亮了选区,你或许想进行一些操作:

* d:剪贴选择的内容到剪贴板。
* y:拷贝选择的内容到剪贴板。
* c:剪贴选择的内容到剪贴板并且进入插入模式。

在非可视选择模式下剪切和拷贝

如果你很清楚的知道你想拷贝或者剪切什么,那你根本就不需要进入可视选择模式。这样也会节省时间:

* d{motion}:剪切 motion 命令跨过的字符到剪贴板。比如,dw 会剪切一个词而 dfS 会将从当前光标到下一个 S 之间的字符剪切至剪贴板。
* y{motion}:和上面类似,不过是拷贝。
* c{motion}:和 d{motion} 类似,不过最后进入插入模式。
* dd:剪切当前行。
* yy:拷贝当前行。
* cc:剪切当前行并且进入插入模式。
* D:剪切从光标位置到行尾到剪贴板。
* Y:拷贝当前行。
* C:和 D 类似,最后进入插入模式。
* x:剪切当前字符到剪贴板。
* s:和x类似,不过最后进入插入模式。

粘贴

粘贴很简单,按 p。

使用多重剪贴板

很多编辑器都只提供了一个剪贴板。VIM 有很多。剪贴板在 VIM 里面被称为寄存器(Registers)。你可以列出当前定义的所有寄存器名和它们的内容,命令为“:reg”。最好使用小写字母来作为寄存器的名称,因为大写的有些被 VIM 占用了。

使用寄存器的命令为双引号 “。

比如:我们要拷贝当前行到寄存器 k。你应该按 “kyy。(你也可以使用 V”ky。为什么这样也可以呢?)现在当前行应该已经存在了寄存器 k 里面直到你又拷贝了一些东西进入寄存器 k。现在你可以使用命令 “kp 来粘贴寄存器 k 里面的内容到你想要的位置。

避免重复

令人惊奇的 . 命令

在 VI 里面,输入 . (小数点符号),将会重复你输入的上一个命令。比如,你上个命令为“dw”(删除一个词),VI 将会接着再删除一个词。

使用数字

使用数字也是 VIM 强大的而且很节省时间的重要特性之一。在很多 VIM 的命令之前都可以使用一个数字,这个数字将会告诉 VIM 这个命令需要执行几次。比如:

* 3j 将会把光标向下移动三行。
* 10dd 将会删除十行。
* y3″ 将会拷贝从当前光标到第三个出现的引号之间的内容到剪贴板。

数字是扩展 motion 命令作用域非常有效的方法。

记录宏

有时候,你会发现你自己在文章的每段或者每行都重复相同的一系列动作。VIM 允许你记录一个宏来完成你的特殊需要。

* qregister:记录宏到寄存器 register,这里 register 是任意的你的寄存器的名字。比如 qa,将会记录并且把宏存在寄存器 a 里面。
* q:结束宏的记录。
* @register:使用存在寄存器 register 的宏。比如 @a,将会使用存在寄存器 a 里面的宏。

必须要记住的是,宏只记录了你的系列按键并且重复执行它们。它们不是魔法。因为在 VIM 里面完成目的的方法有很多,所以有时候你要小心选择命令来记录你的宏。因为它们会在所有你要执行它的地方执行。

用 VIM 写代码

VIM 是一个用来写代码的绝好编辑器,因为它有一些特性是专门为程序员而设计的。这里是一些常用的:

* ]p:和 p 的功能差不多,但是它会自动调整被粘贴的文本的缩进去适应当前代码的位置。试一下!
* %:匹配花括号、方括号、括号等。在一个括号的上面,然后按 %,鼠标就会出现在匹配的另外一半括号处。
* >>:缩进所有选择的代码
* <<:和上面类似,但是反缩进
* gd:到达光标所在处函数或者变量的定义处。
* K:在 Man 里面查找光标当前所在处的词

移动光标
上:k nk:向上移动n行 9999k或gg可以移到第一行 G移到最后一行
下:j nj:向下移动n行
左:h nh:向左移动n列
右:l nl:向右移动n列

w:光标以单词向前移动 nw:光标向前移动n个单词 光标到单词的第一个字母上
b:与w相反
e: 光标以单词向前移动 ne:光标向前移动n个单词 光标到单词的最后一个字母上
ge:与e相反

$:移动光标到行尾 n$:移动到第n行的行尾
0(Num):移动光标到行首
^:移动光标到行首第一个非空字符上去

f:移动光标到当前行的字符a上,nf移动光标到当前行的第n个a字符上
F:相反

%:移动到与制匹配的括号上去(),{},[],<>等。

nG:移动到第n行上 G:到最后一行

CTRL+G 得到当前光标在文件中的位置

向前翻页:CTRL+F
向下移动半屏:CTRL+G
向后翻页:CTRL+B

存盘:
:q! :不存盘退出
:e! :放弃修改文件内容,重新载入该文件编辑
:wq :存盘退出

dw:删除一个单词,需将光标移到单词的第一个字母上,按dw,如果光标在单词任意位置,用daw
dnw:删除n个单词
dne:也可,只是删除到单词尾
dnl:向右删除n个字母
dnh:向左删除n个字母
dnj:向下删除n行
dnk:向上删除n行
d$:删除当前光标到改行的行尾的字母
dd:删除一行
cnw[word]:将n个word改变为word
cc:改变整行
C$:改变到行尾

J: 删除换行符,将光标移到改行,按shift+j删除行尾的换行符,下一行接上来了.
u: 撤销前一次的操作
shif+u(U):撤销对该行的所有操作。

:set showmode :设置显示工作模式

o:在当前行的下面另起一行
O(shift+o):在当前行的上面另起一行

nk或nj:光标向上或向下移n行,n为数字
an!【ESC】:在行后面加n个感叹号(!)
nx:执行n次x(删除)操作

ZZ:保存当前文档并退出VIM

:help :查看帮助文档,在这之中,按CTRL+] 进入超连接,按CTRL+O 返回。
:help subject :看某一主题的帮助,ZZ 退出帮助

:set number / set nonumber :显示/不显示行号
:set ruler /set noruler:显示/不显示标尺

/pattern 正方向搜索一个字符模式
?pattern 反方向搜索一个字符模式
然后按n 继续向下找

把光标放到某个单词上面,然后按×号键,表示查找这个单词
查找整个单词:/\

:set hlsearch 高亮显示查找到的单词
:set nohlsearch 关闭改功能

m[a-z]:在文中做标记,标记号可为a-z的26个字母,用`a可以移动到标记a处

r:替换当前字符
nr字符:替换当前n个字符

查找替换:
way1:
/【word】 :查找某个word
cw【newword】:替换为新word
n: 继续查找
.: 执行替换

way2:
:s/string1/string2/g:在一行中将string1替换为string2,g表示执行 用c表示需要确认
:num1,num2 s/string1/string2/g:在行num1至num2中间将string1替换为string2
:1,$ s/string1/string2/g:在全文中将string1替换为string2


v:进入visual 模式
【ESC】退出
V:shift+v 进入行的visual 模式
CTRL+V:进如块操作模式用o和O改变选择的边的大小。

粘贴:p,这是粘贴用x或d删除的文本
复制:
ynw:复制n个单词
yy:复制一行
ynl:复制n个字符
y$:复制当前光标至行尾处
nyy:拷贝n行
完了用p粘贴

:split:分割一个窗口
:split file.c :为另一个文件file.c分隔窗口
:nsplit file.c: 为另一个文件file.c分隔窗口,并指定其行数
CTRL+W在窗口中切换
:close:关闭当前窗口

在所有行插入相同的内容如include<,操作方法如下:
将光标移到开始插入的位置,按CTRL+V进入VISUAL模式,选择好模块后
按I(shift+i),后插入要插入的文本,按[ESC]完成。

:read file.c 将文件file.c的内容插入到当前光标所在的下面
:0read file.c 将文件file.c的内容插入到当前文件的开始处(第0行)
:nread file.c 将文件file.c的内容插入到当前文件的第n行后面
:read !cmd :将外部命令cmd的输出插如到当前光标所在的下面

:n1,n2 write temp.c 将本文件中的n1,到n2行写入temp.c这个文件中去

CTRL+L刷新屏幕
shift + < 左移一行
shift + > 右移一行

u: undo
CTRL+R: re-do
J: 合并一行
CTRL+p 自动完成功能
CTRL+g 查看当前文件全路径

q[a-z] 开始记录但前开始的操作为宏,名称可为【a-z】,然后用q终止录制宏。
用reg显示当前定义的所有的宏,用@[a-z]来在当前光标处执行宏[a-z].

Copyright by abnerchai, 2005.


This page is powered by Blogger. Isn't yours?