2010年10月10日星期日

Ubuntu下用vsftpd架设FTP服务器

目的:

架设FTP服务器,并有三个帐户:
  • download: 下载帐号,主目录为/home/vsftpd, 在该目录下只有只读权限;
  • upload: 上传帐号,主目录为/home/vsftpd/upload, 在该目录下有读写权限,但是不能删除和修改已有文件;
  • admin: 管理员帐号,主目录为/home/vsftpd,有所有权限。

步骤:

1. 安装vsftpd和db4.8-util
sudo apt-get install vsftpd db4.8-util
2. 建立虚拟用户口令库文件(奇数行用户名,偶数行密码)。文件内容示例:
xxx@ubuntu:~$ cat /tmp/loguser.txt
download
downloadpass
upload
uploadpass
admin
adminpass
注意:不要有多余的空格和空行

3. 生成数据库文件,并设置其访问权限
sudo db4.8_load -T -t hash -f /tmp/loguser.txt /etc/vsftpd_login.db
sudo chmod 600 /etc/vsftpd_login.db
4. 修改文件/etc/pam.d/vsftpd,使其内容如下(注释掉原有内容):
xxx@ubuntu:~$ cat /etc/pam.d/vsftpd
auth required pam_userdb.so db=/etc/vsftpd_login
account required pam_userdb.so db=/etc/vsftpd_login
5. 为虚拟用户创建本地系统用户
新建一个系统用户vsftpd,用户家目录为/home/vsftpd, 用户登录终端设为/bin/false(即使之不能登录系统)
sudo useradd vsftpd -d /home/vsftpd -s /bin/false
sudo mkdir /home/vsftpd
sudo mkdir /home/vsftpd/upload
sudo chown vsftpd:vsftpd /home/vsftpd
sudo chown vsftpd:vsftpd /home/vsftpd/upload
6. 修改/etc/vsftpd.conf,一般要确保含有以下设置:
listen=YES
anonymous_enable=NO
pam_service_name=vsftpd
guest_enable=YES
guest_username=vsftpd
user_config_dir=/etc/vsftpd_user_conf
7. 创建虚拟用户权限配置文件夹和配置文件
sudo mkdir /etc/vsftpd_user_conf
cd /etc/vsftpd_user_conf
sudo touch download upload admin
download文件内容如下:
anon_world_readable_only=NO
local_root=/home/vsftpd
upload文件内容如下:
anon_world_readable_only=NO
write_enable=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES
local_root=/home/vsftpd/upload
admin文件内容如下:
write_enable=YES
anon_world_readable_only=NO
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
local_root=/home/vsftpd
注意:不要有多余的空格(和空行)

8. 重启vsftpd:(phew~)
/etc/init.d/vsftpd restart
9. 测试一下:
lftp localhost -u download,downloadpass
lftp down@localhost:/>ls
应该可以看到目录下的文件(如果有的话)
 
其他:

1. 还有一些其他参数,如速度限制、登录数限制等都可以在vsftpd.conf进行相应设置,甚至可以针对每个用户进行相应的设置。

2. 按照以上方法进行配置,目前还有个问题:本地用户无法登陆。报的错误是:
Login failed: 530 Login incorrect.
根据Manpage of VSFTPD.CONF所说:
guest_enable
If enabled, all non-anonymous logins are classed as "guest" logins. A guest login is remapped to the user specified in the guest_username setting.
local_enable
Controls whether local logins are permitted or not. If enabled, normal user accounts in /etc/passwd (or wherever your PAM config references) may be used to log in. This must be enable for any non-anonymous login to work, including virtual users.
如果使用了虚拟用户,那么所有非匿名用户(包括本地用户)都会映射到guest_username,即vsftpd这个用户,这样就造成了冲突。就是说鱼与熊掌不可兼得,本地用户和虚拟用户不能同时得到支持。不知道我理解得对不对。

参考链接:

Manpage of VSFTPD.CONF
vsftpd用户权限设置
为VSFTPD配置虚拟用户(文本方式)
vsftpd的虚拟用户配置
Vsftpd虚拟用户设置

2010年9月30日星期四

Ubuntu下配置和运行Heritrix

1. 因为决定从源码运行Heritrix, 所以首先安装Eclipse:
$sudo apt-get install eclipse

2. 下载Heritrix源码:
http://sourceforge.net/projects/archive-crawler/files/

3. 解压:
$tar xzvf /home/xxx/workspace/heritrix-1.14.4-src.tar.gz

4. 将文件夹改名为heritrix(不是必须的, 这里是便于导入到eclipse):
$mv heritrix-1.14.4 heritrix

5. 打开eclipse, New->Java Project->Create Project from exsiting source
注意保证输入的Project Name和项目文件夹名称一致.

6. 进入Run Configurations, 指定Main class为
org.archive.crawler.Heritrix
添加VM arguments:
-Dheritrix.development -Xmx512m

添加Classpath: Advanced->Add External Folder, 将src/conf和src/resources添加到Classpath中. 否则会报两个错误:
Exception in thread "main" java.io.IOException: Failed to load properties file from filesystem or from classpath.
    at org.archive.crawler.Heritrix.getPropertiesInputStream(Heritrix.java:924)
    at org.archive.crawler.Heritrix.loadProperties(Heritrix.java:863)
    at org.archive.crawler.Heritrix.containerInitialization(Heritrix.java:492)
    at org.archive.crawler.Heritrix.main(Heritrix.java:555)

2010-07-10 10:03:01.250 严重 thread-10 org.archive.util.ArchiveUtils.() TLD list unavailable
java.lang.NullPointerException
 at java.io.Reader.(Unknown Source)
 at java.io.InputStreamReader.(Unknown Source)
 at org.archive.util.ArchiveUtils.(ArchiveUtils.java:759)
 ........
更严重的是, 会使Heritrix的Modules界面不能改变选择项.


7. 其他诸如设置用户名密码, 添加和运行job之类的, 这里就不详细说明了, 以下是一些参考链接:
Heritrix User Manual
Heritrix developer documentation
基于lucence+heritrix的开源搜索引擎构建(一)
Heritrix使用的初步总结

2010年9月24日星期五

[Notes] Real World Haskell (1): 运算符

运算符列表:

运算符 含义 示例
&& logical "and" True && False
|| logical "or" Flase || True
/= 不等于 2 /= 3
^ (整数次)幂 3 ^ 2
** (浮点数次)幂 3 ^ 2.0
++ 连接两个lists [3,1,3] ++ [3,7]
: 将一个元素插入列表头部 1:[2,3]
% 比例(表示分数) 11 % 29

2010年8月12日星期四

2010年6月2日星期三

长 夜 -- 丽尼

长        夜
丽尼
    那时,我织着我自己底梦,你也有你自己底沉思,我们是各自组成着各自底世界,完全是陌生而不相识的人了呢。我们往往只各人沉浸在自己底哀愁之中,虽然彼此都深深地感觉了难耐的重负,然而也不肯互相告诉而做出安慰。
    唉,我们底郁结的心是什么时候始能消解呢?到了这里,我老实地给你说罢,我不能不希望一个末日底来到啊。
    一个毁灭会给我们一个结束,那时,我们彼此将不存一点怨尤,这岂不更好么?为了我们底历史我是不能再有眼泪。
    过去犹如梦一般地依稀,而且,我们是从来不曾有过欢乐的啊。如同在黑暗之中的一对伴侣,我们是这样偕行着的呀。
    我搀扶着你,越过了森林与大海。你曾说“多么疲倦的途程”,我无语,因为我也有着自己底苦痛。你岂不曾看见有眼泪挂在我底眼角,而我也是几乎要昏倒于我底道路么?我忍住了叹息,这是因为有了你在我底身旁。岂不知道,一个叹息会在你底心里种下不幸的种子而给我以永远也不能解脱的哀愁么?我们是相互扶依的伴侣,而又是完全陌生的旅客哟。
    在人海之中你是怎样地奔向了我来,而我也曾怎样地对你张开了我底寒冷的手臂!我曾说:“这个相逢会使你失去少女底容颜,而忘却青春底梦的呀。”一丝眼泪曾流下了你底眼前,而我亦只能忍住哭泣。于是我们互相结合了冰冷的唇,而偕行于这植满了哀愁与寂寞的道路了。你无言,时时窥视了我以沉默的眼。然而,这岂是我们底希求,这是我们底不幸哟。
    夜已深了,去罢,我们:我们无有故旧,也无有朋友,我们只各人自己认取自己底道路,趁着这黑夜而作出一个渺茫的摸索罢。
    到那时我们会有记忆,然而,记忆是属于过去的事了。我将在黑夜里频频呼唤你底名字;你将永远低垂了头,感觉辛苦。
    我们将希望着毁灭如同一个救赎。我们将把生命看做不能摆脱的负累,在沉默的忆念之中我们将随着草木而腐朽。
    世界底末日与宇宙底哀愁;我们将战栗于暗夜的途中,不复再有言语。在倦怠的途程之中我们会永远无有苏醒。
    这样,我们结束了我们底梦寐罢。然而,我们仍将互相表示着平寂,如辞枝的落叶互相作出沉默之睇视而得到了解了。
                                                                                 一九三二年,三月。

——————————————————————
非常喜欢“希望着毁灭如同一个救赎”这句话。

2010年5月7日星期五

Mac OS X中不尽如人意的地方

可能吧发了一篇文章: Macbook Pro初体验, 基本说出了我想说的.

所以好处就不说了, 这里只列出使用时感觉到不方便的地方:

1. delete键
别告诉我"要删除文件只要拖到废纸篓就好了"

2. 图片预览时没有上一张和下一张图片这个按钮或者快捷键
别告诉我"先Ctrl-A, 然后再预览图片就好了"

3. Ctrl-X
每次要剪切文件的时候只能先复制再删除...

4. Finder没有地址栏
切换文件夹的时候不是特别方便.

5. 没有最大化
所谓的"最适合大小", 对我来说说服力不那么大.


暂时这么多.

ps. 那个磁性电源的设计虽然很人性化, 但是会不会容易吸附一些铁器从而造成短路啊?

2010年5月5日星期三

[Note] Programming In Lua 笔记(2): 函数

21.
调用函数的时候,如果参数列表为空,必须使用()表明是函数调用。
上述规则有一个例外,当函数只有一个参数并且这个参数是字符串或者表构造的时候,()可有可无:
print "Hello World" <--> print("Hello World")
dofile 'a.lua' <--> dofile ('a.lua')
print [[a multi-line message]]<--> print([[a multi-line message]])
f{x=10, y=20} <--> f({x=10, y=20})
type{} <--> type({})

22.
Lua函数实参和形参的匹配与赋值语句类似,多余部分被忽略,缺少部分用nil补足。
-- 不知道Lua里面有没有与python类似的默认参数? 支持, 不过有所不同, 参见PIL 5.3 命名参数

23.
多返回值的函数调用 的 返回值:
1). 当调用作为表达式最后一个参数或者仅有一个参数时,根据变量个数函数尽可能多地返回多个值,不足补nil,超出舍去。
2). 其他情况下,函数调用仅返回第一个值(如果没有返回值为nil)。
3). 可以使用圆括号强制使调用返回一个值。

-- 这个部分的规则比较奇怪. 例子比较长, 就不贴出来了, 还是仔细看原文吧.

24.
特殊函数unpack,接受一个数组作为输入参数,返回数组的所有元素。unpack返回a所有的元素作为f()的参数
f = string.find
a = {"hello", "ll"}
print(f(unpack(a))) --> 3 4

25.
可变参数:
Lua函数可以接受可变数目的参数,和C语言类似在函数参数列表中使用三点(...)表示函数有可变的参数。Lua将函数的参数放在一个叫arg的表中,除了参数以外,arg表中还有一个域n表示参数的个数。

26.
如果我们只想要string.find返回的第二个值。一个典型的方法是使用哑元(dummy variable,下划线):
local _, x = string.find(s, p)
-- now use `x'
...


初级语法知识似乎到这里就结束了, 后面的(从第6章再论函数开始)是稍微高级一点的内容了, 或者说是Real world Lua?