I am LAZY bones ? all linux

分类: 'CLI软件' 的归档

Common Internet File System

Common Internet File System 是samba的一部分,用于取代 smbfs 来挂载windows的共享文件夹,cifs比smbfs应用更广。
要使用 Common Internet File System 需要linux内核开启 cifs 支持。具体是要打开 File systems —> Network File Systems —> CIFS support (advanced network filesystem, SMBFS successor) 这个选项。如果是模块的话,使用前确保加载了。
然后,挂载共享文件夹,可以用mount命令的 -t cifs 选项来调用 mount.cifs。具体是:

sudo mount -t cifs //机器名或IP/远程/目录/ 本地挂载点 -o user=域/用户名%密码,iocharset=utf8

当然,没有域的话,也可以省略域。如果要指定其他mount的选项也是可以的,比如指定uid和gid之类的,这里就不多说了。

另外,如果gnome-base/gvfs开启了samba支持的话,也可以在nautilus的地址栏里直接输入 smb://机器名或IP/远程/目录/ 来打开远程目录,有密码时会弹出对话框输入。
这两种方法各有各的好处。

cryptsetup – 分区加密工具

cryptsetup是linux下的一个分区加密工具,和之前介绍过的eCryptfs不同的是:eCryptfs是文件系统级别的加密,而cryptsetup是分区级别的,比文件系统级别工作在更底层的位置,是在经过加密的块设备上,再创建文件系统,再挂载使用。这应该是纯软件能达到的最底层的加密了吧。
我折腾这玩意,是因为上篇文章说到,我要把/home的数据备份到另一个硬盘,而那个硬盘的物理安全性并不能得到充分地保证,所以只有通过加密来确保数据的安全了。如果当年陈老师也用这玩意的话,想必不会捅出这么大的篓子,呵呵。

废话不说,简单说说安装和使用的方法。
如果你是用ubuntu这类发行版的话,安装部分就很简单了,基本就是直接安装cryptsetup这个包,就完事了。
但是如果你和我一样也是用自己编译内核的发行版,比如gentoo的话,使用中可能会出现以下错误:

/proc/misc: No entry for device-mapper found
Is device-mapper driver missing from kernel?
Failure to communicate with kernel device-mapper driver.
Cannot initialize device-mapper. Is dm_mod kernel module loaded?
Command failed with code 22: Cannot initialize device-mapper. Is dm_mod kernel module loaded?

这时候你不要急着去安装 device-mapper ,因为现在 device-mapper 已经并入到更强大的 lvm2 里面了,所以你要确保装了 lvm2 和在内核选项里选择了CONFIG_DM_CRYPT,如下:

-> Device Drivers
  -> Multiple devices driver support
    -> Device mapper support
      -> Crypt target support

另外,还建议选取大文件支持的CONFIG_LBDAF和CONFIG_CRYPTO_AES两个内核选项,我这边不选取前者,会无法打开加密分区(虽然说LBDAF是2T+的单文件支持,而我的硬盘一共只有80G);后者是一个内核里的加密算法API,我们就用这个算法来加密(也可以用其他的算法)。

说说怎么使用:
建立一个加密的分区,很简单,执行下面的命令:

sudo cryptsetup --verbose --verify-passphrase -c aes-cbc-plain luksFormat /dev/sdb1

我的外接硬盘在 /dev/sdb1 ,因为这个命令会摧毁这个分区的所有数据,所以程序会让你确认,输入大写的YES,回车,就会让你输入两次密码,输完就搞定了。
话外音:其实cryptsetup不仅支持用密码加密,还支持用文件来加密,可以是任意类型的文件,不过解密的时候,要确保文件一个字节都不差,用这个特性可以方便地构建解密U盘。

好了,加密完分区以后,要使用的话,可以这样:

sudo cryptsetup luksOpen /dev/sdb1 back

其中最后的“back”,可以是任意字符串,程序会提示输入之前设置的密码,输对密码以后,文件系统里就会多出一个 /dev/mapper/back ,接下来就可以像使用 /dev/sdXX 一样地使用这个 /dev/mapper/back 了。
比如,建立一个ext4文件系统,挂载,复制文件之类:

sudo mkfs.ext4 /dev/mapper/back
sudo mount /dev/mapper/back /mnt/back/
sudo cp XXX /mnt/back/
....

使用完以后,可以这样显式地关闭加密分区:

sudo cryptsetup luksClose /dev/mapper/back

看看如果别人偷你加密后的硬盘,想挂载看你的艳照时,会怎么样?哈哈:

$ sudo mount /dev/sdb1 /mnt/back/
mount: unknown filesystem type 'crypto_LUKS'

PS: 现在ubuntu的易用性确实越来越好了,ubuntu里插入加密的硬盘后会自动判断,并直接弹出输入密码的窗口,输完自动挂载分区。

linux下的“虚拟光驱”

每当有人问我“你的linux下有没有类似‘虚拟光驱’的软件呢?”的时候,我就会轻轻一笑,自豪地说“别把事情想得太复杂,linux下根本就不用什么另外的软件,就能虚拟光驱了。”,然后那人一般就会似懂非懂地说一句:“哦。。这样啊~”
下面,就来介绍几个虚拟光驱相关的命令:
把物理光盘做成iso镜像,下面几个命令几乎等效,假设设备是/dev/cdrom:

cp /dev/cdrom xxx.iso
dd if=/dev/cdrom of=xxx.iso
mkisofs -r -o xxx.iso /dev/cdrom
readcd -v dev=/dev/cdrom -f xxx.iso

其中,用mkisofs还可以把一个文件夹模拟成iso:

mkisofs -o xxx.iso /path/to/tree

如果要使用iso文件的话,就更简单了,可以mount到任意目录下:

mount -o loop xxx.iso /path

注意以上某些命令可能需要root权限。

不过,还有个终极问题没有解决,我手头有一张《浙江省汽车驾驶人理科考试智能》的光盘,估计是用了什么防拷贝技术,使用以上方法都无法正确生成ISO文件,也无法全部复制里面的内容,具体操作过程如下:

lily@LLY:~$ sudo mount -o ro,loop /dev/sr0 qc
lily@LLY:~$ ls qc
试题10.db  试题11.db  试题12.db  试题1.db  试题2.db  试题3.db  试题4.db  试题5.db  试题6.db  试题7.db  试题8.db  试题9.db
lily@LLY:~$ sudo umount qc
lily@LLY:~$ sudo mount -o ro /dev/sr0 qc
lily@LLY:~$ ls qc
2009理论模拟考试.exe  AutoRun.ico  AutoRun.rdt  system               试题10.db  试题1.db  试题4.db  试题7.db
AutoRun.ard           autorun.inf  htm          安装使用说明.html    试题11.db  试题2.db  试题5.db  试题8.db
AutoRun.exe           autorun.pro  image.jpg    读安装使用说明.html  试题12.db  试题3.db  试题6.db  试题9.db
lily@LLY:~$ cp -r qc qc1
cp: 正在读入"qc/试题3.db": 输入/输出错误
cp: 正在读入"qc/试题4.db": 输入/输出错误
{1}lily@LLY:~$ ls qc1
2009理论模拟考试.exe  AutoRun.ico  AutoRun.rdt  system               试题10.db  试题1.db  试题4.db  试题7.db
AutoRun.ard           autorun.inf  htm          安装使用说明.html    试题11.db  试题2.db  试题5.db  试题8.db
AutoRun.exe           autorun.pro  image.jpg    读安装使用说明.html  试题12.db  试题3.db  试题6.db  试题9.db
lily@LLY:~$ du -s qc qc1
398463	qc
349720	qc1

有谁知道这种变态的光盘怎么搞定吗?

a2p──将awk程序转成perl

呵呵,不管你觉得有没有必要,反正,就是有这样的工具了,而且还是perl包自带的哦(看来perl确实有点怪异,哈哈)。
别的不说了,拿个小程序演示下,下面的awk程序是用来统计当前登录系统的人数的,其实就是 who | wc -l

BEGIN { 
while ( "who" | getline ) n++ 
print n 
}

然后这样:

lily@LLY:~/test/awk$ awk -f count.awk
3
lily@LLY:~/test/awk$ a2p count.awk > count.pl 
lily@LLY:~/test/awk$ perl count.pl
3

哈哈,确实能执行哦,再让我们来看看转出来的perl程序,格式都还蛮工整的呢:

#!/usr/bin/perl
eval 'exec /usr/bin/perl -S $0 ${1+"$@"}'
    if $running_under_some_shell;
			# this emulates #! processing on NIH machines.
			# (remove #! line above if indigestible)
 
eval '$'.$1.'$2;' while $ARGV[0] =~ /^([A-Za-z_0-9]+=)(.*)/ && shift;
			# process any FOO=bar switches
 
open(WHO_FH, 'who|') || die 'Cannot pipe from "who".';
 
$, = ' ';		# set output field separator
$\ = "\n";		# set output record separator
 
while (($_ = &Getline2('WHO_FH', '|'),$getline_ok)) {
    $n++;
}
print $n;
 
sub Getline2 {
    ($fh) = @_;
    if ($getline_ok = (($_ = <$fh>) ne '')) {
	;
    }
    $_;
}

想学perl的同学可以折腾折腾。

exif──查看JPEG文件里的附加信息

不知道什么是EXIF的可以看这里(中文)和这里(英文),简单一句话,EXIF就是存在JPG文件里的一些额外信息。
现在的数码相机拍出来的图片里,绝大多数都存有拍摄时间、快门、焦距、光圈等很多信息,稍微好点的还有GPS定位的拍摄地点呢。
在GUI下,eog等图片查看软件,都可以通过右键的“属性”菜单查看具体的EXIF信息。其实在CLI下,也是有办法提起这些信息的。这个程序的名字就叫 exif 。
安装基本靠源,就不介绍了,使用也是超简单:

$ exif S7302998.JPG
‘S7302998.JPG’中的EXIF 信息标识(‘英特尔’字节顺序):
--------------------+----------------------------------------------------------
信息标识                |值
--------------------+----------------------------------------------------------
Image Description   |<Samsung D70 / D75 / S730 / S750>
Manufacturer        |Samsung Techwin
Model               |<Samsung D70 / D75 / S730 / S750>
Orientation         |左上
x-Resolution        |96.00
y-Resolution        |96.00
Resolution Unit     |英寸
Software            |708101
Date and Time       |2009:02:08 14:16:22
###限于篇幅,省略点输出信息。。
对比度                 |普通
饱和度                 |普通
锐度                  |普通
Interoperability Ind|R98
Interoperability Ver|0100
--------------------+----------------------------------------------------------
EXIF 数据中含有缩略图(3915 个字节)。

下一步就是找个写EXIF信息功能强一点的CLI软件,exif虽然也能写,但是好像只能逐字段挨个写,这个就不太方便了。
最终我要实现的就是:压缩照片,但是保留EXIF信息,哈哈。

========20100211 19:30:00 update========
哈哈,是我把convert想得太简单了,其实convert本身就会保留EXIF的,根本无须我多操心~

自动化下载网盘的文件

今天,我给大家介绍两款自动化的网盘下载工具,用于自动下载MegauploadRapidshare等网盘的文件。

首先是有图形界面的FreeRapid,这是采用java编写的,所以可以跨平台使用,而且有比较良好的图形界面和多语言支持,改下设置,就可以出来中文界面,所以使用非常方便,也很容易上手,适合普通用户使用。
而且,FreeRapid还有个好处是支持的网盘网站非常的多,国外的大大小小的网盘站点几乎都能搞定。对各网站的支持还是以插件的形式出现的,也就是说,即使你的网盘站点的下载方式有变化,或者有新的网盘站点出现,FreeRapid也能很轻松地升级,以适应这个变化。事实上,在使用FreeRapid的过程中,也确实经常会看到有插件要更新的。

好了,大致说完了FreeRapid,这个的优点,刚说了,就是易用,因为有GUI嘛,不过,某些时候这样正是它的缺点所在(哲学中,矛盾性的普遍性得到了很好的验证,哈哈。),如果我的机器没有X怎么办呢?呵呵,不用着急,我们还有Plowshare
Plowshare已经默认包含在了gentoo或者arch的官方源里了,可以直接emerge或者yaourt,但是ubuntu源里,却还未包含,所以使用ubuntu的朋友需要自己下载deb包或者源码进行安装了。
这个的Plowshare比起FreeRapid来,支持的站点稍微少些,不过人家是bash脚本,不用拖个jre也不用X,还是很不错的,而且,它不止支持下载,其实还是支持上传的,哈。
使用起来也不烦,一般情况下只需要

plowdown URL

就好了,更详细的使用说明──比如支持某些站点的用户名、密码之类的──可以看官方说明
再说一句,这个也是模块化支持多站点的哦,而且作者还提供API,鼓励大家都去写模块呢。

怎么样,方便吧?

开源的命令行OCR软件──tesseract

tesseract-ocr是一个跨平台开源的OCR软件(Optical Character Recognition,光学字符识别),它历史悠久,早期是HP实验室的项目,现托管于google code。
大部分常用的linux发行版,应该都在源里包含了此软件,所以ubuntu下只需要 sudo apt-get install tesseract-ocr tesseract-ocr-eng 就可以安装了,注意必须安装 tesseract-ocr-eng 这个是识别英文字符所必须的数据文件。而在gentoo下,也只需要 emerge app-text/tesseract 就可以了,但是也必须给这个包添加 linguas_en 这个use,才会安装所需要的数据文件。
关于数据文件,还得交代一下,其实tesseract在2.0版以后,已经有了学习能力了,如果你想提高某个字体的识别率,或者识别不在默认语言包里的UTF-8字符(比如中文)的话,可以安装这个方法来训练出自己的数据文件。
这个OCR软件能干嘛呢?典型地应用就是识别验证码,哈哈。所以以这个为例,来介绍一下使用方法,先来看看这几个验证码(可“图片另存为”,然后自行测试):

这几个都是用默认的数据文件能正确识别的例子,由于tesseract只识别tiff格式的图片文件,所以识别之前,需要将图片先转成tif格式,具体如下:

$ convert cnblogs.com.jpe ppm:- | ppm2tiff yzm.tif
$ tesseract yzm.tif out
Tesseract Open Source OCR Engine
$ cat out.txt 
1750

同时,也有些比较难的验证码,是程序不能正确识别的,如下几个就是例子:

虽然识别的正确性不是非常高,但是已经很不错了,哈哈。
PS: 有没有人训练个识别google验证码专用的数据文件?

python代码风格检查工具──pylint

pylint是一个python代码检查工具,可以帮助python程序员方便地检查程序代码的语法和风格,通过这个工具,可以使你的python代码尽量保持完美,哈哈。
具体可以检查什么东西呢?
比如你写了 from XXX import * 了,它就会提示你这样import是不好的。
比如你操作符的前后没有空格,它也会提示你。
比如逗号后面没跟空格也会。
还有你import了没用到的模块,定义了没使用的变量等也会提示。
还有你的变量名是否符合规范也会提示。
总之它提示的内容很多很全面,而且它最后会给出一个所检查的代码的总体分数,如果能达到满分10分的话,简直就是神作了,因为pylint本身的代码也才9.5分左右,哈哈。
比较惨的是,TX发现这个工具以后,检查了几个python项目的分数,都不是很高,我那gmbox得了2分多点,还算是高的。不过,经过一番优化,现在的gmbox已经有6.64分,及格了,哈哈。。
值得一提的是,pylint不仅可以像默认那样输出字符结果,还可以彩色化输出,甚至还可以输出HTML和visual studio的格式。具体用法可以参见man页和这个文档

监视文件系统的一举一动 ── inotifywait

某天,TX大侠说他找不到awn的配置文件在什么地方,问我知道不?而我只是在N年前用过一下下awn而已,所以,理所当然地不知道了。后来,我们想了一个土办法:
在$HOME下先执行一次

tree -as > /tmp/before

然后在awn的界面里修改一下配置,再在$HOME下再执行一次

tree -as > /tmp/after

然后再

diff /tmp/before /tmp/after

哈哈,别说,这样还真把需要的配置文件找到了。但是,谁看着这个方法,都多少会觉得有点别扭。
现在,我发现了这个可以监视文件系统的任何动作的工具: inotifywait (项目主页) 。
inotifywait 包含在gentoo的 sys-fs/inotify-tools 包里,其他发行版应该也是叫这个名字。
这个工具是使用linux内核的inotify调用,来实现监视功能的。所以你需要有2.6.13以上版本的内核,才会有这个调用。
像上例中,如果要找某个未知文件的该动的话,你可以监视整个$HOME目录,这样:

inotifywait -mr $HOME

现在你再修改awn的配置,或者打开/修改/删除任何$HOME及其子目录下的文件的话,终端都会显示出来。比如:

/home/lily/test/ CREATE abcd.txt
/home/lily/test/ OPEN abcd.txt
/home/lily/test/ ATTRIB abcd.txt
/home/lily/test/ CLOSE_WRITE,CLOSE abcd.txt
/home/lily/test/ MODIFY abcd.txt
/home/lily/test/ OPEN abcd.txt
/home/lily/test/ MODIFY abcd.txt
/home/lily/test/ CLOSE_WRITE,CLOSE abcd.txt
/home/lily/test/ DELETE abcd.txt

这个就是我在~/test下执行

touch abcd.txt && echo 111 > abcd.txt && rm abcd.txt

的时候的结果,很详细吧?

另外值得注意的是,如果你 $HOME 下的文件数目比较多,大于 /proc/sys/fs/inotify/max_user_watches 里的值(默认才8k)的话,inotifywait 就会提示超出限制,报错了。这时候你可以估算下总的文件数,然后手工修改上限值。

echo 170000 | sudo tee /proc/sys/fs/inotify/max_user_watches

我这边把上限改成了170000,发现CPU和内存的占用都还不是很明显,还是完全可以接受的。

PS:除了使用这个inotifywait以外,你也可以在自己的程序里直接调用内核的inotify完成某些特定的功能,而且python和perl都有相应的模块可以直接调了,更详细的介绍可以看这里(翻遍了google,好不容易才找到这原文啊,BS那些转载不注明原地址的,还有转了以后,不管代码格式却分成10来页骗点击量的)。

记录你的终端操作 ── script

不知广大linuxer有没有这样的经历:你要给别人演示一个终端下的操作过程,或者遇到什么难题需要求助别人,想把终端的操作过程(输入)及输出都记录下来。
这时候,如果过程不是很长,一屏以内的话一般可以选择直接截图;如果只是一个命令的输出,可以用重定向将标准输出(和/或 标准错误)直接定向到文件。
但是如果这个过程,既不是很短,比如输入和输出加起来有上万行;又不是一个命令能搞定的,该怎么办呢?将terminal的缓冲区定义地很大,再选择/复制/粘帖显然不是个好办法。
这时候,script就派上用场了,在终端里输入script,表面上只是打印了一行“Script started, file is typescript”的文字,但是其实,现在已经新开了一个session了,从此刻开始,任何你的输入和程序的输出都将被如实地记录到当前目录下的 typescript 文件里,直到你打exit退出这个session。退出以后,你可以用任何文本编辑器打开这个 typescript 文件,不过由于这个文件将所有的ANSI控制符都记录进去了,所以,如果你的PS1有彩色的,或者有执行ls之类的输出彩色信息的命令的时候,直接用文本编辑器看到的输出会有点乱,不过这样的好处是,如果你 cat typescript 的话,所有的颜色都也可以恢复了。另外,如果你想去掉颜色的话,可以执行

cat typescript | sed 's/\x1b[[0-9;]*.//g' > nocolor

这个命令可以基本把颜色代码去掉。

另外,还有一个办法也可以完成此项工作,就是使用 screen 的时候,加上 -L 参数,会在当然目录生成一个 screenlog.0 的文本文件,同样,这也是一个带ANSI控制符的文本文件,忠实地记录了你的所有操作。
现在,有了终端的详细“截图”,你就可以将得到文件发给对方,进行交流了,哈哈~