存档

‘Linux技术’ 分类的存档

抓取LINUX桌面的视频

2010年8月23日 wgzhao 没有评论

$ 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

分类: Linux技术, 技术技巧 标签:

在ssh服务里使用chroot

2010年7月14日 wgzhao 没有评论

对于虚拟主机而言,平衡用户易用体验和安全是一个挑战,比如如果开发ssh给用户,那么无疑能极大的增加用户操作的灵活性,但是ssh的强大也是得在安全方面让管理员很头疼,如何将用户限制在自己的环境中,就显得尤为重要。幸而openSSH已经了解到了这点,目前的版本均支持chroot功能,下面我简单的描述一下在ubuntu 10.04系统上如何实现,其他系统实现的原理相同,只是一些配置文件和指令不同而已。

1)确定chroot目录
按照传统,chroot的目录都在/var/chroot/下面。我们遵循这种传统,将目录限定在/var/chroot/sshd下面。

2)创建必要的目录和文件。
我们需要在/var/chroot/sshd下创建一个最小的系统环境,特别是需要有交互终端,如果用到一个系统高级的功能,还需要一些特定的设备文件。因为我们这里只是演示最基本的功能,复杂的的功能,可以根据错误提示要按需增加需要的资源。
$sudo mkdir -p /var/chroot/sshd/{bin,home,etc}
$sudo apt-get install busybox-static
$sudo cp /bin/busybox /var/chroot/sshd/bin/

每次敲busybox 显然不够环保,我们还是做一些额外的工作,将所有内置的busybox命令都用软链接的方式导出来,下面的python脚本能快速帮你做到这点。

cat ctlink.py
#!/usr/bin/env python
import commands
import os,sys

output=commands.getoutput('./busybox --help')
c=[x.strip() for x in  output.split('functions:')[1].strip().split(',')]
for x in c:
	os.system("ln -sf busybox %s" % x)

只需要在/var/chroot/sshd/bin/下面执行这个脚本就好了。

为了能让chroot环境能正确识别用户,组等信息,我们需要在etc目录下创建passwd,group,shadow等文件。而用户登录验证的时候,依赖的是chroot之前的/etc/{passwd,shadow,group}文件,这里我们采取硬链接方式来解决这个问题
$cd /var/chroot/sshd/etc
$sudo ln -n /etc/{passwd,group,shadow} .

当然,如果你的/var和/并不是在一个分区上,那么硬链接就不能工作,那你可以尝试在/etc和/var/chroot/sshd/etc来个同步工具。

3)创建测试帐号
我们不用之前的用户帐号,是因为我们需要对帐号的基本信息做一些修改,我们不想破坏你现在的环境,因为来一个测试帐号是比较安全的。
$ sudo useradd -d /var/chroot/sshd/home/test -m -s /bin/sh test
然后修改/etc/passwd文件将
test:x:1001:1001::/var/chroot/sshd/home/test:/bin/sh
修改成
test:x:1001:1001::/home/test:/bin/sh
接着创建密码
$sudo passwd test
输入新的 UNIX 密码:
重新输入新的 UNIX 密码:
passwd:已成功更新密码

4)修改openssh-server配置文件
编辑/etc/ssh/sshd_config文件,在最后一行增加chrootDirectory指令来指定chroot的路径,类似如下:
chrootDirectory /var/chroot/sshd
保存退出。

5)测试,测试
以上步骤完成后,执行
$sudo /etc/init.d/sshd reload
来重新加载配置文件
然后我们可以测试了,下面是一个登录的测试结果:

$ ssh test@localhost
test@localhost's password:
Linux wgzhao-laptop 2.6.32-23-generic #37-Ubuntu SMP Fri Jun 11 07:54:58 UTC 2010 i686 GNU/Linux
Ubuntu 10.04 LTS
~ $ pwd
/home/test
~ $ cd /
/ $ ls
bin   etc   home
/ $

分类: Linux技术 标签: ,

共享会话的ssh连接配置

2010年7月2日 wgzhao 没有评论

针对一个服务器需要同时开几个ssh连接,也许是同一个帐号链接,也许是不同的帐号,你是不死和厌烦了每次的都要输入密码?其实ssh链接可以做到共享会话的。
一个办法是用一些ssh链接客户端,比如Windows下的Secure CRT,Linux下的hotssh
另外一个办法,就是自己修改ssh客户端配置文件,创建~/.ssh/ssh_config文件,加入下面的内容:
Host *
ControlMaster auto
ControlPath ~/.ssh/master-%r@%h:%p

当对服务器发起一个链接的时候,在~/.ssh目录下就会创建一个文件,文件命名规则是master-@: 当你退出所有多该服务器的链接是,该文件会自动删除。
现在就尝试吧

分类: Linux技术, 技术技巧 标签:

redhat el5如何映射裸设备到逻辑卷

2010年6月24日 wgzhao 没有评论

之前的版本如何做,这里不做描述,自行google。

之前通常的方法,在该版本,KERNEL并不能直接获得设备名称或者主次设备号,我们需要通过dmsetup指令来间接获得。

一下操作的目录均在/etc/udev/rules.d/。

1)编辑90-dm.rules文件,注释掉下面则行

KERNEL==”dm-[0-9]*”, ACTION==”add”, OPTIONS+=”ignore_device”

2)编辑60-raw.rules文件,加入下面几行:

KERNEL!="dm-[0-9]*",GOTO="skip_dm"
PROGRAM!="/sbin/dmsetup  ls --exec /bin/basename -j %M -m %m", GOTO="skip_dm"
RESULT=="vg1-lv1", RUN+="/bin/sh -c '/bin/raw /dev/raw/raw1 $MAJOR $MINOR'"
LABEL=skip_dm
上面第一行代码表示如果不是dm设备,则直接跳到skip_dm处
第二行表示如果后面的指令返回为假(非0值),则跳到skip_dm处。
如果以上条件满足,则来到真正的裸设备映射指令。注意要注意的是RESULT给出的结果是/dev/mapper下的lv名称,而不是大家通过google查询到的一些资料所宣称的mpath1,当然,到底这里结果值是多少,我们下面会通过测试来获得。后面的RUN指令就比较浅白了,直接通过主次设备号来做绑定。
如果还有其他LVM设备需要绑定,依次添加类似行。
但是,但是,如果你有上百个LVM设备需要做裸设备映射呢?难道写上几百行。当然不需要这样,我们可以通过匹配方式来操作,就像下面这样:
RESULT=="vg1-lv[0-9]*",RUN+="/bin/sh -c '/bin/raw /dev/raw/raw$MINOR $MAJOR $MINOR'"
这里我们通过次设备号来作为裸设备的编号依次映射。
恩,看上去很好,But,这里有个bug,那就是我们无法对raw0这样的设备进行映射,而第一个LV对应的MINOR恰好是0的话(很不幸,大部分情况是这样),那我们该怎么办。简单的办法是每次给MINOR+1来作为裸设备的编号。就像下面这样:
RESULT=="vg1-lv[0-9]*",RUN+="/bin/sh -c '/bin/raw /dev/raw/raw$((MINOR+1)) $MAJOR $MINOR'"
看上去很美好,很遗憾,我在Asianux 3.0 SP2,Centos 5.4版本上均没有成功。所以我采取了下面折衷的办法:
KERNEL!="dm-[0-9]*",GOTO="skip_dm"
PROGRAM!="/sbin/dmsetup ls --exec /bin/basename -j %M -m %m", GOTO="skip_dm"
RESULT=="vg1-lv[0-9]*", RUN+="/bin/sh -c 'if [ $MINOR -eq 0 ]; then /bin/raw /dev/raw/raw256 $MAJOR $MINOR; else /bin/raw /dev/raw/raw$MINOR $MAJOR  $MINOR;fi'"
LABEL=skip_dm
上面的做法是如果次设备号是0的话,我们尽可能把他映射到裸设备编号靠后的设备,这里采取的是256。如果你需要映射的设备操作超过256的话,你知道该怎么办
保存该文件后,执行start_udev,然后执行raw -qa,看看是不是已经绑定了,类似如下:
/dev/raw/raw1:	bound to major 253, minor 1
/dev/raw/raw2:	bound to major 253, minor 2
/dev/raw/raw3:	bound to major 253, minor 3
/dev/raw/raw4:	bound to major 253, minor 4
/dev/raw/raw5:	bound to major 253, minor 5
/dev/raw/raw6:	bound to major 253, minor 6
/dev/raw/raw7:	bound to major 253, minor 7
/dev/raw/raw8:	bound to major 253, minor 8
/dev/raw/raw9:	bound to major 253, minor 9
/dev/raw/raw10:	bound to major 253, minor 10
/dev/raw/raw11:	bound to major 253, minor 11
/dev/raw/raw12:	bound to major 253, minor 12
/dev/raw/raw13:	bound to major 253, minor 13
/dev/raw/raw14:	bound to major 253, minor 14
/dev/raw/raw15:	bound to major 253, minor 15
/dev/raw/raw16:	bound to major 253, minor 16
/dev/raw/raw17:	bound to major 253, minor 17
/dev/raw/raw18:	bound to major 253, minor 18
/dev/raw/raw19:	bound to major 253, minor 19
/dev/raw/raw256:	bound to major 253, minor 0
分类: Linux技术 标签: , ,

用python解决amule中文乱码的问题

2010年6月18日 wgzhao 3 条评论

Linux下的amule并不会对链接做编码转换,也就是说,比如下面这样的链接地址:
ed2k://|file|%E7%94%9F%E6%B4%BB%E5%A4%A7%E7%88%86%E7%82%B8.The.Big.Bang.Theory.S02E15.Chi_Eng.HR-HDTV.AC3.960X528.x264-YYeTs%E4%BA%BA%E4%BA%BA%E5%BD%B1%E8%A7%86.avi|230043648|e49a10d7052b5dfee4aa8b3336b76301|h=qkhaltxhuygwphznp2holcvdarxki3e6|/

直接交给amule下载时,给出的文件名就会变成下面这个样子:
生活大爆炸.The.Big.Bang.Theory.S02E04.Chi_Eng.HR-HDTV.AC3.960X528.x264-YYeTs人人影视.avi

阅读全文…

how to apparmor allows launching chrome browser from evince

2010年6月13日 wgzhao 1 条评论

我电脑上的google chrome browser是从官方下载的,使用上到时没有问题,而且chrome browser也设置为我的默认浏览器,这一设置,引发了一个问题,在使用evince浏览单pdf文件的时候,如果点击文档中的链接,会给出一个permission denied的错误,截图如下:
click to open larger picture

依然是Apparmor搞的鬼。解决的办法如下:

阅读全文…

查找当前目录的重复文件

2010年6月11日 wgzhao 没有评论

Ubuntu下有一个fdupes程序可以用来打印当前目录下有多少文件是重复的。因为是二进制程序,所以效率上更高。
而用Python实现的,效率就很低了,同样的目录,fdupes只用了2秒的样子,而Python程序就用了15s,大约7-8倍速度差距。
所以这个代码仅仅只是一个演示罢了。代码参考《Python for Unix and Linux System Administration》一书。

分类: Linux技术 标签:

core python programming 2nd chapter 20 exercise

2010年6月10日 wgzhao 没有评论

这一章主要是网络客户端编程,讨论了包括SMTP,POP3,FTP,URL在内的一些编程技术。Python针对网络编程有一个非常强大的模块,那就是Twisted,这个工具太强大,以至于有专门的书籍来讲述如何使用。

后面的习题大部分都是写一些代码片段,比如获取一个页面,连接一个FTP服务器,连接你的邮箱。

我选取了修改这张描述的网页抓取代码修改作为练习。主要是做了两个工作:
1)用新的一些模块替换即将过期的模块,比如HTMLParser
2)加入了多线程功能,使得当网站很大的时候,下载速度加快了很多。

不过加入这个多线程后,暂时有一个问题我不能解决。就是如何保证线程是在所有的页面都下载完后才全退出。
目前的做法是一个无线循环,除非你杀死,否则不会退出。

另外,对于图片等资源目前还无法处理,我打算专门写一个脚本来镜像某一个网站的图片资源,嘿嘿,用处嘛,你懂的。