解决php中Cannot send session cache limiter 的问题的方法

今天在使用php 的session 的时候,出现了以前就遇见但是又解决不了的问题,在页面上出现如下提示:

Warning: session_start() [function.session-start]: Cannot send session cache limiter – headers already sent (output started at E:\php\code\admin.php:1) in E:\php\code\logolist\adminlogo.php on line 2

上网搜了一下,有人说是因为在session_start(); 语句之前有其他的html代码,但是我的session_start(); 已经在做前面了。

还有的说是因为没有设置session 保存路径,需要修改php.ini中的session.save_path = “C:/phpsession” [后边的路径自己设置,并且要保证存在。php.ini 文件一般应位于系统盘/Windows 目录下面]

但是我做如上设置之后还是会有这个提示。后来经过反复测试,终于解决问题。
解决办法:
修改php.ini中的session.auto_start = 0 为 session.auto_start = 1

博主点评:
博主尝试了一下,的确解决了问题,但是问题是PHP就是因为Session
Autostart有危险性,才将其禁掉,这样一来,安全性就有了问题。博主将继续寻找解决方案。

utf-8编码引起js输出中文乱码的解决办法

如果web application的编码规则是utf-8,如网页头中的:
<meta http-equiv=”Content-Type” content=”text/html; charset=UTF-8″ />

那么js文件中如果有中文输出就会出现乱码,解决此个问题可在引用javascript输出的地方加上charset=”gb2312″ 或 charset=”big5″(假设输出的是Big5繁体字)。

例:
<script type=”text/javascript” language=”javascript” src=”scripts/output.js” charset=”gb2312″></script>

PS:另一种解决方法是把js文件保存为utf-8编码。

博主点评:晕,这么简单的方法,原来我一直想有没有什么办法能够把Javascript的结果由GB2312转到UTF-8,找到了PHP的mb_convert_encoding,但由于不会把Javascript的输出结果指定为字符串从而一筹莫展,没想到居然有这么简单的办法。看来凡事都要多用两个角度想想。

转载自http://www.cnblogs.com/zgqys1980/archive/2007/11/13/957653.html

Discuz 6.0数据库结构

cdb_access 用户权限表
cdb_adminactions 管理动作表
cdb_admingroups 管理组数据表
cdb_adminnotes 管理员留言
cdb_adminsessions 管理员后台在线记录
cdb_advertisements 广告资料表
cdb_announcements 论坛公告资料表
cdb_attachments 附件资料表
cdb_attachtypes 附件类型表
cdb_banned 被禁止的ip列表
cdb_bbcodes bb代码资料表
cdb_blogcaches 博客缓存表
cdb_buddys 好友信息表
cdb_creditslog 积分交易记录表
cdb_crons 计划任务表
cdb_failedlogins 错误登录记录
cdb_favorites 个人收藏信息表
cdb_forumfields 板块扩展信息数据表
cdb_forumlinks 友情链接数据表
cdb_forums 版块资料表
cdb_medals 勋章资料表
cdb_memberfields 用户扩展资料表
cdb_members 用户基本资料表
cdb_moderators 版主信息数据表
cdb_modworks 版主工作记录表
cdb_onlinelist 在线列表定制
cdb_onlinetime 用户在线时间信息表
cdb_orders 订单数据表
cdb_paymentlog 支付记录
cdb_pluginhooks 插件钩子表
cdb_plugins 插件表
cdb_pluginvars 插件配置表
cdb_pms 短信资料表
cdb_pmsearchindex 短消息搜索缓存表
cdb_polls 投票帖资料表
cdb_posts 帖子资料表
cdb_profilefields 用户栏目定制
cdb_promotions 论坛推广
cdb_ranks 头衔表
cdb_ratelog 帖子评分记录表
cdb_regips 注册ip记录表
cdb_relatedthreads 相关主题
cdb_rsscaches RSS缓存
cdb_searchindex 搜索缓存
cdb_sessions 在线表
cdb_settings 论坛设置表
cdb_smilies 表情信息表
cdb_stats 统计数据表
cdb_statvars 统计变量表
cdb_styles 风格
cdb_stylevars 风格变量表
cdb_subscriptions 订阅信息表
cdb_templates 模板
cdb_threads 主题资料表
cdb_threadsmod 主题管理记录表
cdb_threadtypes 主题分类表
cdb_usergroups 用户组数据表
cdb_validating 等待人工审核的会员记录
cdb_words 词语过滤表

Discuz默认库共53个数据表(以下表数据量注释均为默认)

cdb_access (用户权限表)

uid 用户id
fid 论坛id
allowview 允许浏览
allowpost 允许发新帖
allowreply 允许回复
allowgetattach 允许下载附件
allowpostattach 允许上传附件

cdb_adminactions 关联用户组

admingid 管理组id
disabledactions 关联后的权限
cdb_admingroups 管理组权限设置(3条)
admingid 管理组id
alloweditpost 允许编辑帖子
alloweditpoll 允许编辑投票
allowstickthread 允许固定主题
allowmodpost 允许编辑帖子
allowdelpost 允许删除帖子
allowmassprune 允许批量删除帖子
allowrefund 允许强制退款
allowcensorword 允许过滤词语
allowviewip 允许查看用户IP信息
allowbanip 允许禁止IP
allowedituser 允许编辑用户
allowmoduser 允许审核用户
allowbanuser 允许禁止用户访问
allowpostannounce 允许发布公告
allowviewlog 允许查看版主管理记录和用户评分记录
disablepostctrl 发贴不受限制(不受灌水预防和最大字数等)

cdb_adminnotes (后台留言表)

id 后台留言id
admin 留言人
access 阅读权限
adminid 管理组id
dateline 发表时间
expiration 过期时间
message 留言内容

cdb_adminsessions 管理记录(0条)

uid 用户id
ip ip
dateline 时间
errorcount 错误次数

cdb_advertisements 后台广告管理

advid 广告id
available 是否启用
type 类型
displayorder 排列顺序
title 标题
targets 投放范围
parameters 参数
code 代码
starttime 开始时间
endtime 结束时间

cdb_announcements 公告表(0条)

id 公告ID
author 发布者用户名
subject 公告标题
displayorder 排列顺序
starttime 公告开始时间
endtime 公告失效时间
message 公告内容

cdb_attachments 附件表(0条)

aid 附件数据ID
tid 主题ID
pid 帖子ID
dateline 发布附件时间
readperm 阅读权限
filename 附件的原始文件名
description 附件描述
filetype 附件类型
filesize 附件文件的大小
attachment 服务器路径,相对于(config.php中$attachdir值)
downloads 下载/浏览次数

cdb_attachtypes 附件类型(0条)

id 数据ID
extension 扩展名
maxsize 最大允许的上传大小
cdb_banned 被禁止访问表
id 禁止访问id
ip1 ip字段1
ip2 ip字段2
ip3 ip字段3
ip4 ip字段4
admin 操作人
dateline 操作时间
expiration 过期时间

cdb_bbcodes 自定义Discuz!代码(3条)

id 数据ID
available 是否启用
tag 标签
replacement 替换内容
example 使用举例
explanation 代码的解释说明
params 参数个数
nest 嵌套次数

cdb_buddys (好友表)

uid 用户id
buddyid 好友的id
dateline 加入时间
description 备注

cdb_creditslog (积分转帐交易记录表)

uid 用户id
fromto 来自/到
sendcredits 转出积分字段
receivecredits 接受积分字段
send 转出积分
receive 收到积分
dateline 操作时间
operation 操作

cdb_failedlogins 登陆失败的记录(0条)

ip IP地址
count 失败的次数
lastupdate 最后尝试登陆时间

cdb_favorites 用户主题收藏(0条)

uid 用户id
tid 主题id

cdb_forumfields 论坛扩展信息表

fid 论坛id
description 论坛简介
password 访问密码
icon 论坛图标
postcredits 自定义发主题增加积分
replycredits 自定义发回复增加积分
redirect 论坛转向URL
attachextensions 本论坛允许附件类型
moderators 斑竹列表
rtablees 本论坛规则
threadtypes 主题分类
viewperm 浏览论坛许可
postperm 发新话题许可
replyperm 发表回复许可
getattachperm 下载/查看附件许可
postattachperm 上传附件许可

cdb_forumlinks 联盟论坛(1条)

id 数据ID
displayorder 显示顺序
name 网站名称
url 地址
note 说明
logo logo地址

cdb_forums 论坛表(1条)

fid 论坛id
fup 上级论坛id
type 论坛类型,cat为分类,forum为论坛,sub为子论坛
name 论坛的名字
status 显示论坛
displayorder 显示顺序
styleid 风格方案id
threads 主题数量
posts 帖子数量
todayposts 今日发帖数量
lastpost 最后发表信息
allowsmilies 允许smilies图标
allowhtml 允许html
allowbbcode 允许discuz!代码
allowimgcode 允许[img]标签
allowblog 允许加入blog
allowtrade 允许发起交易
alloweditrtablees 允许版主修改本论坛规则
modnewposts 发帖审核
jammer 启用内容干扰码
disablewatermark 禁用图片附件添加水印
inheritedmod 本论坛或分类版主的权力继承到下级论坛
autoclose 主题自动关闭

cdb_medals 勋章表

medalid 勋章id
name 勋章名称
available 是否启用
image 图片地址

cdb_memberfields 用户扩展信息表

uid 用户id
nickname 用户昵称
site 主页
alipy 支付宝帐号
icq ICQ
qq QQ
yahoo Yahoo
msn MSN
taobao 淘宝旺旺
location 来自
customstatus 自定义头衔
medals 勋章
avatar 头像
avatarwidth 头像宽度
avatarheight 头像高度
bio 生日
signature 个人签名
sightml html解析后的签名
ignorepm 忽略PM列表(拒绝接受本名单中的用户发来的短消息)
groupterms 公众用户组信息
authstr 待审核用户

cdb_members 用户表(1条)

uid 用户id
username 用户名
password 密码(md5)
secques 安全提示问题(独立加密)
gender 性别
adminid 管理组id
groupid 用户组id
groupexpiry 用户组有效期
extgroupids 扩展用户组
regip 注册ip
regdate 注册时间
lastip 最后登陆ip
lastvisit 上次访问时间
lastactivity 上次访问时间(记录)
lastpost 最后发表时间
posts 发贴数
digestposts 精华帖数
oltime 在线时间
pageviews 页面访问量
credits 总积分
extcredits1 扩展积分1
extcredits2 扩展积分2
extcredits3 扩展积分3
extcredits4 扩展积分4
extcredits5 扩展积分5
extcredits6 扩展积分6
extcredits7 扩展积分7
extcredits8 扩展积分8
avatarshowid 天下秀
email 邮箱
bday 生日
sigstatus 签名是否改动
tpp 每页显示主题数
ppp 每页显示帖子数
styleid 个性定义风格id
dateformat 个性日期格式
timeformat 个性时间格式
pmsound 短消息提示音
showemail 是否公开email地址
newsletter 是否接受论坛通知
invisible 是否隐身登录
timeoffset 时区校正
newpm 是否有新短消息
accessmasks Access标志

cdb_moderators 版主表

uid 用户id
fid 版区id
displayorder 显示顺序
inherited 是否继承

cdb_onlinelist 在线列表定制(4条)

groupid 用户组ID
displayorder 显示顺序
title 组头衔
url 用户组图例位置(相对于./images/common目录)

cdb_onlinetime 在线时间表

uid 用户id
thismonth 本月在线时间
total 总计在线时间
lastupdate 最后访问时间

cdb_orders 订单信息表

orderid 订单号
status 状态
buyer 购买者
admin 补单操作者
uid 购买人id
amount 数量
price 价格
submitdate 提交日期
confirmdate 确认日期

cdb_paymentlog 帖子买卖表

uid 用户id
tid 主题id
authorid 作者id
dateline 时间
amount 价格
netamount 作者收入

cdb_plugins 插件管理表

pluginid 插件id
available 是否启用
adminid 管理插件的管理组id
name 插件名称
identifier 唯一标识符
description 描述
datatables 插件的数据表
directory 插件目录
copyright 版权信息
modtablees 记录插件详细信息

cdb_pluginvars

plginvarid 插件变量id
pluginid 插件id
displayorder 显示顺序
title 标题
description 描述
variable 变量
type 类型
value 数值
extra 存储下拉列表的详细信息

cdb_pms 短消息表

pmid 数据ID
msgfrom 发送者名
msgfromid 发送者id
msgtoid 接收者id
folder 文件夹
new 是否为已读
subject 消息标题
dateline 发送时间
message 内容

cdb_polls 投票(0条)

tid 主题ID
pollopts 投票数据

cdb_posts 帖子表(0条)

pid 帖子id
fid 论坛id
tid 主题id
first 是否为主题(1为主题,0为帖子)
author 帖子作者用户名
authorid 帖子作者用户id
subject 帖子标题
dateline 帖子发表时间
message 帖子正文内容
useip 发贴时的IP
invisible 帖子状态(是否是被审核或者是否在回收站)
usesig 是否显示签名
htmlon 是否开启html
bbcodeoff 是否允许Discuz!代码标签
smileyoff 是否允许Smile表情图标
parseurloff 是否允许自动加链接
attachment 是否有附件
rate 本帖子被评分数
ratetimes 本帖子被评分次数

cdb_profilefields 用户栏目定制(0条)

fieldid 数据id
available 是否可用
invisible 是否隐藏
title 栏目标题
description 简短描述
size 内容最大长度
displayorder 显示顺序
required 必填内容
unchangeable 不可修改
showinthread 在帖子中显示
selective 是否可选
choices 选项内容

cdb_ranks (用户级别表)

rankid 级别id
ranktitle 发帖数级别头衔
postshigher 发帖数级别阀值
stars 星星数
color 颜色

cdb_ratelog(帖子评分记录表)

pid 帖子id
uid 用户id
username 用户名
extcredits 评分字段
dateline 时间
score 分数
reason 操作原因

cdb_regips (注册ip表(开启新用户注册验证后记录))

ip IP
dateline 时间
count 次数

cdb_rsscaches rss缓存表

lastupdate 最后更新
fid 版块id
tid 主题id
dateline 发表时间
forum 版块名称
author 作者
subject 标题
description 简短描述

cdb_searchindex 论坛搜索索引(0条)

searchid 数据ID
keywords 搜索类型/关键字
searchstring 搜索内容
useip 搜索者IP
uid 用户id
dateline 搜索开始时间
expiration 搜索失效时间
threads 主题数量
tids 主题id多个以,分割

cdb_sessions 在线统计(0条)

sid 数据ID
ip1 IP地址第一栏
ip2 IP地址第二栏
ip3 IP地址第三栏
ip4 IP地址第四栏
uid 用户id
username 用户名
groupid 用户组id
styleid 风格id
invisible 是否隐身登陆
action 当前动作
lastactivity 最后活动时间
lastolupdate 在线时间最后更新
pageviews 页面访问量
seccode 记录验证码
fid 正在浏览的版区id
tid 正在浏览的主题id
bloguid 记录blog用户id

cdb_settings 论坛基本设置表(64条)

variable 变量名
value 赋值

cdb_smilies 论坛表情符号(18条)

id 数据ID
displayorder 显示顺序
type 类别(smiley/icon)
code smilies代码(对于type=smiley有效)
url 图标位置

cdb_stats 论坛统计记录(50条)

type 统计类别
variable 统计的变量名
count 统计计数

cdb_statvars
论坛统计记录(在后台启用了论坛统计以后有记录)

type 统计类别
variable 统计的变量名
value 统计的数值

cdb_styles 风格样式(1条)

styleid 风格id
name 风格的名称
available 是否可用
templateid 关联的模板id

cdb_stylevars 风格变量设置(25条)

stylevarid 数据ID
styleid 关联的风格id
variable 风格的变量名
substitute 变量赋值

cdb_subscriptions 用户定阅表(0条)

uid 订阅用户id
tid 用户订阅的主题id
email 用户email地址
lastnotify 上次email通知时间

cdb_templates 模板表(1条)

templateid 数据ID
name 模板的名称
directory 模板所在的目录
copyright 设计者版权信息

cdb_threads 主题表(0条)

tid 主题id
fid 论坛id
iconid 主题前面的表情图标id
typeid 主题类型id
readperm 阅读权限
price 售价
author 作者的用户名
authorid 作者的id
subject 标题
dateline 主题发表时间
lastpost 最后回复者的id
lastposter 最后回复者的用户名
views 浏览次数
replies 回复数量
displayorder 显示顺序(0为普通主题,1~3分别为I,II,III级置顶)
highlight 是否高亮显示
digest 是否精华
rate 是否评分
blog 是否加入blog
poll 是否为投票帖
attachment 是否包含附件,且附件类型
moderated 是否被编辑过
closed 主题是否关闭
cdb_threadsmod 主题管理记录表
tid 主题id
uid 用户id
username 用户姓名
dateline 操作时间
action 什么操作

&nbsp;

不见不散 宁财神

我坐在领奖台上,看着赞助商们一张张狰狞恐怖的脸庞,准备开始哭泣。看到我的脸涨得通红,妈妈把我抱过来安慰着,疼惜着。当听到喇叭里传出的刺耳声音时,我实在没忍住,哭了,哭得极伤心,台下的观众们先是一脸诧异,然后他们开始笑,笑得很开心,任凭我在妈妈的怀中挣扎抽泣。

今年我一岁零三个月,几个巨大的电脑集团合资搞了一个未来天才的奖学金,我是过来领奖的,因为在同龄儿童中,我是唯一一个懂得如何设置proxy的人,这个对他们来说是个奇迹。虽然我还不是很会说话,但起码的礼貌还是有的,接过了主办者递来的金色奖牌后,我带着满脸的泪花儿对他说“啪啪”。我比他们想象得更聪明,因为在他们的视线之外,我还会做更多的事,比如在线聊天,我每分钟可以用那双面积不到一寸的手打出一百二十个字来,如果高兴的话,我会在一个能看得见阳光的日子里背着妈妈用photoshop画一张抽象画,这些不能被他们发现,否则我会有很多麻烦,我的潜意识告诉我,一个少年天才会在众人的崇拜目光的狙击之下变成彻底的白痴。

其实我不算是个天才,之所以能做到这些,也只因为当初我狠下心来没喝那个叫孟婆的人递来的一碗汤,现在的这些雕虫小技只是我前生的一点回忆。而我之所以没喝那碗汤,除了因为它非常刺鼻之外,还有个很重要的原因:我不能忘了她,我们之间还有一个不见不散的约会,我必须回来找她。记得以前看过一个叫胭脂扣的电影,那里面的女鬼带着一串数字去寻找前世的缘分,我和她有区别,我不是鬼,而是个投胎重生过的人。不过我们却有相同的境遇,我也带着一串数字来找人,那串数字是她的ICQ号码,这使我能在internet蓬勃发展的今天从世界的任何一个角落找到她。说到这里,我想有必要回忆一下过去,让我们从头说起。

三年零三个月前,也就是一九九六年的冬季的某一天,在网上闲逛的我(不知道用我是不是合适,因为这几段里的我属于前世,为了图个方便,就先不改称呼了吧)无意间闯入了一个叫青草地的论坛,在那里我碰到了一个叫莲的女子,也就是上文中提到的她。第一次见她的时候,她正在贴一首席慕容的诗:我,是一朵盛开的夏荷。多希望,你能看见现在的我。风霜还不曾来侵蚀,秋雨还未滑落,青涩的季节又已离我远去,我已亭亭
不忧 亦不惧。现在正是最美丽的时刻,重门却已深锁,在芬芳的笑颜之后,谁人知我莲的心事。无缘的你啊,不是来得太早
就是,太迟。我没多想,直接回了一贴,把这首诗连带她那无病呻吟的小资情趣批驳得体无完肤,后果可想而知,我们大吵,揭开了我们之间的爱情故事的第一幕:不打不相识。风雨之后,我问她在哪儿,她说人在朝阳门。我们之间只距离一站路,我在东四十条。

接下来的数月,我心存邪念,准备把这个清纯温顺的女孩骗到手,我放弃了所有的业余时间回到网上与她见面,总算皇天不负有心人,有一天她说她爱上我了,欣喜之余我想邀她出来见一面,要求被驳回,她说她还是喜欢在网络的幻境里飘浮游离,我说随你,我会等你。那时候,我并不清楚我是不是爱她,因为现实中的我很空虚,总是在人前显露出一丝孤寂,有个叫师爷的同事说我有点自闭,我把它叫作忧郁。在金秋的某一个凌晨,我突然发现自己是真的爱上她了,因为那天我睡不着,就起床画画,一开始神智还算清醒,到后来就漫无目的地乱涂了,迷糊中睡去,第二天中午起床时,我发现那张速写纸上除了一张模糊的面孔外,还写了无数个我爱你。我把这件事告诉莲,想证明我的真心,她不太相信,因为一直以来我把自己伪装得玩世不恭,她怕我在打什么坏主意。那天的事其他都记不太清了,只记得她对我说过的最后一句话:这么老套的游戏你也拿出来玩,没劲。我好象是气冲冲下网的,隔了许久也没再去那个地方。在其他的聊天室和论坛逛了许久,也没再碰到一个让人心动的女子,只能讪讪地回去,发现她又在灌水,还是席慕容的诗:人若真能转世,世间若真有轮回,那么,我爱,我们前生曾是什么?你若曾是江南采莲的女子,我必是你皓腕下错过的那一朵。你若曾是那个逃学的顽童,我必是你袋中掉落的那颗弹珠,在路旁草丛里,目送你毫不知情地远去,你若曾是面壁的高僧,我必是殿前的那一炷香,焚烧著,陪伴过你一段静穆的时光。我觉得那首诗该是送给我的,就换了名字上去,我问她:“是在想念什么人么?”,她说是,“为什么不和他联系?”,她说:“我在守株待兔,他一定会回来找我”,然后就毫不留情地拆穿了我,她竟然记得我用过的所有proxy的IP。

我们终于见面了,在布满了金色树叶的日坛东门,手持一个黑色Gucci手包的她比我早到了三分钟,满头大汗的我连连陪不是。我想不起来是怎么样去牵她的手了,记忆这种东西不太靠得住,不可能象红木家具一样历久弥新,转过一世之后,留在我脑海里影像只剩下一副模糊的画面:我们在一个不知所谓的公园里追逐嬉戏,是泛黄的慢镜头,没有背景音乐,在一洼绿色的水面旁我唱歌给她听,是那首“初初见你,人群中独自美丽”,她骂我五音不全,但从表情上看来,她对我还算满意。那天我带了许多胶卷,全部拍光后才悻悻归去。回了家我给她打电话,问:“现在信不信我爱你?”,她说:“这有什么关系,两个人在一起玩得开心就是真理”。虽然我是个大她八岁并且已经没有太多时间去玩去选择的老男人,可对这个观点,我还是表示同意。到这里,我怎么也想不起下面的故事了,只能把这一格跳过,接下来的画面就是:年龄之间的差异使我们的感情生活产生了较大的距离,我们又吵。象所有的爱情故事一样,她对于所谓的沧桑男人心存痴迷,而我则对她的贪玩习气不太满意。

回想起那夜在三里屯吵架的一幕,她那些伤人的话象一个个炸雷在我的耳边响起,那天我喝高了暴吐,她拎着那只漆黑依旧的Gucci手包扬长而去,这使我对我们之间的感情产生了怀疑,回到单位,师爷劝我说小女孩都不懂事,想哄就哄,想蹬就蹬,千万别陷进去,我很沮丧地告诉他:“很可惜,我陷进去了”,我才不管别人是否骂我没出息。过了几天,我想给她打电话,手刚触到话筒,铃声响了,她在电话里带着哭腔说:“我想你”,我说:“咱们还真是心有灵犀”。我们坐下来谈论关于以后的生活问题,她说:“我想嫁给你”,我说:“其实我早盘算着非你莫娶”。可我当时还是没什么勇气和她同居,我潜意识里一直认为距离保持美感,我不希望这么快就打破了她对我的幻想,不能让她发现我原来是这么平庸和碌碌无为的老男人,我拒绝了她提出的“搬到一起住”的提议。

我到现在还不太能想清楚,当初在旺死城的时候,是什么使我有勇气拒绝那碗孟婆汤的,因为他们告诉我,如果不消除前生的回忆,那么前世和今生就会纠缠在一起,届时将产生的精神分裂使人痛苦之极。老太太最后一次把碗端到我面前的时候,我礼貌地再一次拒绝了那碗汤,我告诉她,我还有一个约会未了。说到这儿,我想起来了,的确答应过她的,我们约好了在最寒冷的冬季带她去我的老家无锡,去看满树盛开的梅花。其实我并不算是个一诺千金的人,这个理由也许只是自己的一个托辞,用我现在的智慧去想,是肯定想不清楚的,毕竟经过一道轮回的心灵,如同开过十万公里的越野车一样,动不动就要出毛病。

我们都爱看话剧,尤其是孟京辉的戏,在实验剧场,我们看了一出叫“思凡”的戏,那里面小尼姑高唱着寂寞难奈朝山下飞奔,满心欢喜地朝着她见到的第一个男人抛着真诚的媚眼,而那第一个男人却只是一个同样寂寞难奈的小僧。看完戏我问她:“如果你的生命中再多些选择,你能确定你会选择我吗?”,她在路上跳着格子,边跳边气踹嘘嘘地回答着:“不会,肯定不会,如果可以任我选的话,我一定会选TomHanks”,我紧紧拽着她的手,让她看我的眼睛:“你会吗?”她有些楞了,用力甩开我的手,开始喊:“为什么对你自己没有信心?为什么?只因为你是个而立之年的老男人?还是因为你在社里呆了这么久连个职称也没混上?或者说是因为师爷的稿费千字八百而你只有千字五十?”,她边说边退,在漆黑的没有路灯的北兵马司胡同里,她滑倒在地上开始抽泣,我呆立在她面前,有些惶恐,有些无奈,她知道所有关于我的事,甚至知道我存心掩盖过的一些小秘密,而这么久以来我精心为自己设计的面具也在那一刹那被撕得粉碎,我无话可说。她捡起地上的小石子儿往我身上扔,边哭边扔,我没躲,因为这大概是我最后一次能表现自己豪迈一面的机会了。我的膝盖被一块尖利的石子打中,我呻吟了一声,她爬起来帮我揉,说对不起,我说没事,这时她不哭了,换我哭,倒不是因为我窝囊,我想主要还是因为那一刻她那种关怀备至的眼神触痛了我心里较为柔软的部分。我说:“你走吧,我们这样下去估计戏不大”,她没吭声,转身就走,把我一个人留在漆黑的胡同里,我点了支烟抽起来,看着烟头红色的光晕在黑夜里一闪一闪,心特乱。三分钟以后,她又回来了,递了个麦当劳的汉堡给我:“吃吧,你就跟猪一样,夜里吃饭才香,撑死你得了”,我说:“我没开玩笑,你真的可以走了”,她说:“怎么着啊?这么就想甩了我?分手费的问题咱得好好谈谈”,我边啃汉堡边含糊其词:“什么分手费,我怎么你了就分手费?”,她笑着,“那你还想怎么着啊,我都非你不嫁了,你这儿说分手就分手,就算没分手费也得给点遮羞费啊”,我哭笑不得,手僵在半空中,她又递了包橙汁过来:“喝点,回头再噎着”,我低着头继续吃东西,狼吞虎咽,她也点了只烟,用一种我从来没听到过的语气说:“其实你不说我也知道,你爱我比我爱你多挺多,这么久以来,能忍受我这么任性的人也就你一个,我也是混得走投无路了才跟了你的,你呢,千万别自卑,咱们俩绝对算是同病相怜了”,我乐了:“哈,合着你也知道自己这点臭毛病啊”。她说:“少废话,今天我底儿也跟你露了,你丫要走要留给个准话儿”,我拉起她的手深情地道了句:“都到这份儿上了,我无路可逃,就依了你吧”。

我们相遇一周年的时候,师爷赞助了我一大捧玫瑰花,是他大力吹捧过的一个花店免费提供的,我带着那束花和一枚从灯市口买的小钻戒前往朝阳门。进了门第一句话:“嫁我得了,都是熟张儿,回头嫁不出去再砸手里,多不值当啊”,她半掩房门,从门缝里接过花和戒指就把门关了,在里面喊:“忒便宜了吧,你这个有半克拉吗?这么就想娶媳妇了?”,我掏出一个从白云观求来的铜制弥乐佛说:“还有呢”,她一开门,我把佛像给她看:“这个估计一千克拉都有了”。我告诉她:“你也老大不小的了,再不嫁更待何时啊,我这儿一早准备好了,大龄男青年,要模样有模样,要文化有文化,要婚房有婚房,最主要的是,这位男青年决定这辈子娶鸡随鸡、娶狗随狗”,“别贫,就烦你这样的,要不是看在咱多年深厚感情的份上,你这号人我一早大鸡毛掸子哄将出去”。此时夕阳美景,人约黄昏,两颗假装苍老的心灵紧靠在二十八楼A座的窗台上,滋拉滋拉冒着电火花。她点头应许时,我实在是按捺不住心头的愉悦,吼了两嗓子“你总是心太软心太软”。经过仔细筹划后,我们决定旅行结婚。在网上贴完婚讯后,似乎全世界的闲人都在那一刹那涌到了台前,端详者有之,艳羡者有之,祝福者有之,狂砸不已者亦有之,我们才不管别人怎么想,最后夫妻俩合着回了一贴“祝我们自己个儿白头偕老百姓永结同心”后,就义无反顾地下网收拾行李去了。那次,是我最后一次上网。

居委会大妈要了几颗喜糖,呲着没牙的嘴笑眯眯说“一路顺风,要注意计划生育啊”。她得回单位去办交接,到时候单位车送她去机场,她让我先把行李带过来,我们在机场碰头。她从家出去的时候,让我把护身符带上,我没搭茬,直接揽将过来狂吻一口,道声:“去吧,机场见,不见不散”,“恩,不见不散”。看着她的背影消失在胡同口,我拎上行李直奔机场,一路上,看不尽的大路牌,数不清的老杨树,这些原本熟视无睹的景致在我眼中曼妙之极。开到四元桥的时候,很不幸,我们的车出事了,被路上的薄冰搓了一下,整个车“轰”地飞天而起,估计在旁人眼里就是那些警匪片里的飞车特技,我只觉得头晕目眩,眼冒金星,人随着车在空中翻了无数个滚儿,比坐过山车刺激,落地的一刹那,我才想起来忘了系安全带,于是我的大脑袋磕在了前挡风板上,顿时晕菜。迷蒙中,觉得一股热流从头顶向下流淌,热热的湿湿的….不知过了多久,我又醒了,眼前一片光海,乌泱乌泱的各色人等如潮水般朝着最亮的地方挺进,我属于爱凑热闹的人,也跟着毯儿哄,勇往直前。走到一半才想起来今儿旅行结婚的事,赶紧四处张望,发现每个人神情肃然,身板儿挺直,我觉得有些怪异,皱着眉头硬着头皮往脚下看,好家伙,哥们儿竟然悬浮在半空中往前飘着,这才知道,刚才那场车祸使我当场歇菜。也罢,即来之则安之,跟着蹭吧,继续前行。到了中转站的时候,那个叫孟婆的老太太如期出现在我们的眼帘,再接下去就是我拒绝喝汤的那一幕了。孟婆说:“很多人不喝汤是为了回去报仇的,你这种事也有过,但结局好象都不算太好”,我说没关系,我这人没别的好,就是负责任,答应人家的事一定得办到。孟老太太继续说:“你现在回去投胎的话,就比她小了二十几岁,她会等你吗?这样值得吗?”,我白了她一眼:“看来你们真是在下面呆久了不了解行情,现在都是棒小伙儿傍老太太的,小三四张的都有,我这算什么”。在众人诧异的目光中,我施施然回到了人间,在通过一条极其黑暗的隧道之后,我的眼前又是一片光明,此时,一双巨手将我从隧道中拽将出来,用一种带着回音儿的声音说话:“恭喜你啊,张太太,是个大胖儿子”。

那,上面就是我前世的故事了。现在对我来说,最艰巨的任务就是在世界上寻找她了。我们的新家没装电话,老家已经拆迁,估计靠电话找她是没戏了,最可恨的是,我根本不知道我身处何方,这要万一生在了台湾,那何年何月才能与她重逢啊。我眯着怕见光的小眼睛四处打探,终于在窗口的一隅看到了我期待已久的字样:积水潭医院。哈哈,合着转半天又转回来了,从这儿回家估计打车都不出起步费。可我怎么才能使她相信那就是我呢?我甚至还不会说话啊,迄今为止,我只能用哭声来表达吃喝拉撒的要求,这使我很羞涩,所以我尽量少哭,于是我那新妈就被所有人簇拥着夸道:“张太太真是好福气,你儿子不哭不闹,性格随你,特恬静”。爱谁谁吧,我现在一门心思得出去找她,可实在是动弹不得,只能在无聊无知和空虚中虚度每一天,过了些日子,我出院了。襁褓中的我好奇地观察着窗外的每一处熟悉而又陌生的景致,赫然发现,这才几天啊,北京怎么变得面目全非了,一没留神,三环旁边多了这么多高层,我心里有点发毛,顺着车里的挂历看去,竟然已是一九九八年,也就是说我在那条隧道里虚度了整整一年,天那。想到这儿,我眼框又湿了,我知道她等得好辛苦,心里念叨着:“我回来了我回来了”。很令人头疼的是,我那抹清泪被误认成某种讯息,我被新妈当场从襁褓中拽出来,检视我那块一尘不染的尿不湿,TMD,什么世道。

到了家,我欣喜地发现新家里有电脑,还有一个56K的白猫,这说明,我可以在熟练使用双手以后,凭一己之力去寻找她了。想到这里,我双拳紧握,下定决心排除万难,一定要在最短时间内找回失去的春天。七八个月有余,我已经能顺利地爬行,但还不足以爬到电脑桌上去,我试过很多次,都失败了,那桌子太高,后来新妈见我爬的辛苦,就抱了我上桌,鼓励着:“宝贝儿子,以后好好学习,长大了当个科学家”,我没搭理她,死命地按开关,经过数次不懈的努力与尝试后,我把机器打开了。这时门铃响了,家里开了客人,新妈去开门,我继续操作,在她与客人寒喧的那几分钟内,我上了网,等他们发现时,每个人都惊呆了。妈妈把我举得老高,笑着说:“我儿子是个天才”,她大概认为我是看了爸爸平时的操作才懂这东西的。从这以后,我有很多机会接触电脑,终于在我满一岁的那天,趁他们不注意,我成功地down了一个ICQ下来。我心中狂喊着:“等我等我,我这就来了”。

我成功地与她联系上了,虽然她不给我确认讯息,使我无法看到她的在线情况,但我不气馁,我孜孜不倦地给她发着消息,当然不会是以前那段往事的暗示,那会使她伤心,甚至恐惧,我不能这么做,我尝试着把自己伪装成一个与前世的我性格差不多的人,事实上也无需伪装,我坚信,如果她第一次能爱上我,那第二次也不成问题。终于在一个深夜,她给我回了一个MSG,当时我真的是欣喜若狂,要不是怕被爸妈听见,我真想大哭一场以示极度兴奋。我们开始交谈了,她看上去变了许多,有种历遍红尘的感觉,那件事对她的伤害太大了。她说她不想再嫁人了,我百感交集。我尝试着安慰她,鼓励她,但并未要求她开始新生活,我说我想见她,她说不方便,我没再强求。但日子久了,我知道我们的感情在一天天加深。有一天,新妈兴冲冲地过来捏我的脸蛋儿,她说:“宝贝儿子,你帮妈妈赚了五千块钱,妈妈明天带你领奖”,这对我来说是个机会,因为这是我唯一能见到她的机会。妈妈看我笑得开心,赏了我一个喜之郎果冻,撑得我半死。晚上的时候,我告诉她我明天去领奖,让她来看我,她答应了。

我坐在领奖台上,看着赞助商们一张张狰狞恐怖的脸庞,准备开始哭泣。看到我的脸涨得通红,妈妈把我抱过来安慰着,疼惜着。当听到喇叭里传出的刺耳声音时,我实在没忍住,哭了,哭得极伤心,台下的观众们先是一脸诧异,然后他们开始笑,笑得很开心,任凭我在妈妈的怀中挣扎抽泣。我试图在人群中寻找她,可是乱无头绪,人太多,我眼花缭乱。有个很胖的四眼把我抱过去高高举在天上,我奋力挣扎,这时,一袭黑衣的她,出现在门旁,漠然扫视着云云众生,我大喊大哭,想引起她的注意,可她没看我,只是在寻找着那个网络上的我有可能出现的形象。人渐渐散了,她还没走,场内只剩下不到十个人,她终于看到我了,她朝我走过来了,越来越近,我几乎不能控制自己的情绪,不争气的眼泪顺腮直下,她走到了我的面前,饶有兴致地看着我,嘴里说着谁也听不清的话,我想问她“这么久以来,你过的好吗?”,可话到嗓子眼儿里只剩下哽咽,她掏出纸巾来帮我擦鼻涕,使我有机会拉住她的手,我死死拽住那只手,想永远永远都不放开,我把另外一只手臂张开,让她抱我,在得到妈妈的允许后,她把我抱起来了,我把头埋着她的颈中继续抽泣,低声说“我想你”,她把我的头扳起来,诧异地看着我,然后觉得自己大概是产生错觉了,我继续把嘴埋到她的耳边,在她的脸上吻了一下,含含糊糊说“终于回到你身边了”,这下她有些慌了,我再也控制不住自己的情绪了,只是一个劲儿抓住她的手不肯放,妈妈很奇怪,因为在这以前,我对陌生人一向是爱理不理的。她凝视着我,我看着她的眼睛,用手在她的脸庞上疼惜地摩梭着。妈妈这时被组委会和记者围住采访,无暇顾及这边的事,电脑旁只剩下我和她。

我指了指电脑,她把我抱过去了,我打开写字板打道:“莲,我想你,所以我回来了”。她惊呆了,我运手如飞在键盘上敲着:“你若曾是江南采莲的女子,我必是你皓腕下错过的那一朵”,她摇着头后退,我继续打“是我啊,咱们说过要不见不散的”,她几乎崩溃,呆在原地不动。我死盯着她,她的眼框里瞬间渗满了泪,可她还是不敢靠近我,我打道:“过来抱抱我好么?”,她慢慢地走近我,小心翼翼地摸着我的头颅,我把手臂张开,拥她入怀,这次她紧紧地抱着我,贴在她的心上,我能感觉到那里在剧烈跳动,我的手在她那滑满泪水的脸上和那头黑发上轻柔抚摸,我把她的手托到我的胸口,让她感觉我的心跳,她一句话也说不出来,只是在我的脸上狂吻不已,直到被妈妈发现后喝止。妈妈把我抢回怀抱,她魂不守舍站在原地,我又哭又闹,还是被带走了,离开的那一刹那,她冲过来拽住我的手,哑着嗓子说了句:“我等你,不见不散”。在迅速后退的视野中,我看到她慢慢地瘫软,颓坐在地上。当她的影像差不多消失在走廊尽头时,我死命昂着头用心喊了句:“不见不散”。

财神按:好也罢赖也罢,总算是把这段子写完了,用了整整一个晚上,真累。谢谢您又看到了结尾,这次除了欣慰之外,我还多了一种成就感,再次感谢。

《网民大辞典》新成语词条:正龙拍虎

新成语:【正龙拍虎】

   
词目:正龙拍虎

   
发音:zh&egrave;ng l&oacute;ng
p&#257;i h&#468;

    释义:
   
&#9312; 意指某人或某集团为利益驱动做假,被揭穿后还抵死不认;
   
&#9313; 社会公信力缺失;

    典故:
   
&#9312; 《史记·周正龙列传》:
“周氏正龙者,秦地金州镇坪人也…正龙置彼画于深山密林中,遮淹修饰,远近数数摄之,得虎照数十副.照中虎卧于林下,双目炯炯,俨然真大虫也.归而献
之县官,官喜,以呈上官,州府台阁皆不疑,布之互联网,传告天下,厚赏正龙.网民见之,咸以为假,竟相怒骂之,有好事者遍搜天下旧年画,果得虎照原版画,
多不可数.正龙之谋遂败焉,天下皆以为耻.”
   
&#9313;
《正龙列传之龙克赝虎》第一篇:“呜呼!彼以其伪虎诈利为可恒也哉,是囚灾物也!只增龙克赝虎笑.”
   
&#9314; 《诌氏全书·正龙传》:“古有武松打虎,今有正龙拍虎,更有关克挺虎”
   
&#9315;《天涯史记之周正龙大传》:“太史公曰:陕府本民情纯朴,素为文重德厚之地,奈其民周正龙者,心术多邪,妄以一己之智,愚天下士人,自是愚不可及,然天下愚者,又何止周正龙耶?”

    例句:
   
&#9312; 汉芯造假者正龙拍虎,最终咎由自取.[关键词:汉芯]
   
&#9313; 中石油上市,各媒体正龙拍虎,使新股民站在48元之巅.[关键词:中石油
第一套]
   
&#9314; 中国彩票正龙拍虎,再次告诉国民双色球再创彩市中奖纪录
一名彩民独中1.02亿元,使彩民趋之若骛.[关键词:双色球 1.02亿]

vsftpd 配置手册

施文建

0 关于本文档
1 VSFTPD简述
2 VSFTPD的安装
2.1 RHL9+vsftpd-1.1.3-8.i386.rpm包的安装
2.2 vsftpd-1.2.0.tar.gz的安装
3 VSFTPD的文件结构
4 VSFTPD的启动与停止
5 VSFTPD的设置选项
5.1 连接选项
5.1.1 监听地址与控制端口
5.1.2 FTP模式与数据端口
5.1.3 ASCII模式
5.2 性能与负载控制
5.2.1 超时选项
5.2.2 负载控制
5.3 用户选项
5.3.1 匿名用户
5.3.2 本地用户
5.3.3 虚拟用户
5.4 安全措施
5.4.1 用户登录控制
5.4.2 目录访问控制
5.4.3 文件操作控制
5.4.4 新增文件权限设定
5.5 提示信息
5.6 日志设置
5.7 其他设置
6 VSFTPD应用
6.1 允许匿名用户上传文件
6.2 限制用户在自家目录
6.3 配置高安全级别的匿名FTP服务器
6.4 基于IP地址的虚拟FTP服务器
6.5 虚拟用户的配置
6.5.1 VSFTPD的虚拟用户介绍
6.5.2 用户创建和目录设置
6.5.3 配置文件的设置
6.5.3.1 基本设置
6.5.3.2 权限设置
6.5.3.3 虚拟用户的其他配置
6.5.3.4 虚拟用户个人目录设置
6.5.4 MySQL保存虚拟用户

——————————————-

0、关于本文档

本文档是个人的学习整理。允许大家翻阅,摘抄,引用。更欢迎指出其中不对之处。文档的内容主要来自VSFTPD自身文档、个人学习心得以及网络资料,若有类同,实属正常,∶)。

本文档基于RedHat Linux 9和VSFTPD-1.1.3-8。如果有不同版本,则有专门文字说明。

Read More

vsftpd 配置手册

时间:2005-04-27
作者:施文建 来源:不详

VSFTPD

  施文建

0 关于本文档
1 VSFTPD简述
2 VSFTPD的安装
2.1 RHL9+vsftpd-1.1.3-8.i386.rpm包的安装
2.2 vsftpd-1.2.0.tar.gz的安装
3 VSFTPD的文件结构
4 VSFTPD的启动与停止
5 VSFTPD的设置选项
5.1 连接选项
5.1.1 监听地址与控制端口
5.1.2 FTP模式与数据端口
5.1.3 ASCII模式
5.2 性能与负载控制
5.2.1 超时选项
5.2.2 负载控制
5.3 用户选项
  5.3.1 匿名用户
   5.3.2 本地用户
5.3.3 虚拟用户
5.4 安全措施
5.4.1 用户登录控制
5.4.2 目录访问控制
5.4.3 文件操作控制
5.4.4 新增文件权限设定
5.5 提示信息
5.6 日志设置
5.7 其他设置
6 VSFTPD应用
6.1 允许匿名用户上传文件
6.2 限制用户在自家目录
6.3 配置高安全级别的匿名FTP服务器
6.4 基于IP地址的虚拟FTP服务器
6.5 虚拟用户的配置
6.5.1 VSFTPD的虚拟用户介绍
6.5.2 用户创建和目录设置
6.5.3 配置文件的设置
6.5.3.1 基本设置
6.5.3.2 权限设置
6.5.3.3 虚拟用户的其他配置
6.5.3.4 虚拟用户个人目录设置
6.5.4 MySQL保存虚拟用户

——————————————-

0、关于本文档

  本文档是个人的学习整理。允许大家翻阅,摘抄,引用。更欢迎指出其中不对之处。文档的内容主要来自VSFTPD自身文档、个人学习心得以及网络资料,若有类同,实属正常,&#8758;)。

  本文档基于RedHat Linux 9和VSFTPD-1.1.3-8。如果有不同版本,则有专门文字说明。

1、VSFTPD简述

   如果试问哪种FTP服务器最安全?那么在UNIX和Linux中,首推的就是VSFTP(Very Secure FTP
Daemon,非常安全的FTP服务器)。顾名思义,VSFTPD设计的出发点就是安全性。同时随着版本的不断升级,VSFTPD在性能和稳定性上也取得
了极大的进展。象RedHat、SUSE、Debian、GNU、GNOME、KDE等一些大型站点都采用VSFTPD作为它们的FTP服务器。大家可以
到http://vsftpd.beasts.org/了解它的最新情况。

2、VSFTPD的安装

2.1、RHL9+vsftpd-.1.1.3-8.i386.rpm包的安装

  VSFTPD的安装很简单。在RHL9中,在图形界面下依次执行“Main Menu”-“System
Settings”-“Add/Remove
Applications”-选择FTP服务器-“更新”,或者在字符界面中执行以下命令,就可以完成安装。
  rpm -ivh vsftpd-1.1.3-8.i386.rpm

2.2、vsftpd-1.2.0.tar.gz的安装

  &#9332;准备条件

  VSFTPD默认配置中需要“nobody”用户。在系统中添加此用户,如果用户已经存在,useradd命令有相应提示。
  [root@hpe45 root]# useradd nobody
  useradd: user nobody exists

  VSFTPD默认配置中需要“/usr/share/empty”目录。在系统中此目录,如果目录已经存在,mkdir命令有相应提示。

  [root@hpe45 root]# mkdir /usr/share/empty/
  mkdir: cannot create directory ‘/usr/share/empty’: File
exists

  VSFTPD提供匿名FTP服务时,需要“ftp”用户和一个有效的匿名目录。
  [root@hpe45 root]# mkdir /var/ftp/
  [root@hpe45 root]# useradd -d /var/ftp ftp
  接下来的操作对于ftp用户是否已经存在都是有用的。
  [root@hpe45 root]# chown root.root /var/ftp
  [root@hpe45 root]# chmod og-w /var/ftp

  &#9333;编译VSFTPD

  从官方站点下载到/root目录,执行以下命令:
  [root@hpe45 root]# tar zxvf vsftpd-1.2.0.tar.gz
  [root@hpe45 root]# cd vsftpd-1.2.0
  [root@hpe45 vsftpd-1.2.0]# make

  &#9334;安装编译好的VSFTPD

  执行“make install”将编译好的二进制文件、手册等复制到相应目录。在RHL9上,可能需要手动执行以下复制:
  [root@hpe45 vsftpd-1.2.0]# cp vsftpd /usr/local/sbin/vsftpd
  [root@hpe45 vsftpd-1.2.0]# cp vsftpd.conf.5
/usr/local/share/man/man5
  [root@hpe45 vsftpd-1.2.0]# cp vsftpd.8
/usr/local/share/man/man8
  此外,“make install”没有复制简单的配置文件,建议执行以下命令:
  [root@hpe45 vsftpd-1.2.0]# cp vsftpd.conf /etc

  &#9335;为本地用户设置PAM

  如果允许本地用户登录VSFTPD,执行以下操作:
  [root@hpe45 vsftpd-1.2.0]# cp RedHat/vsftpd.pam
/etc/pam.d/ftp

3、VSFTPD的文件结构

  VSFTPD的文件结构是很简洁的,主要包括:
  /usr/sbin/vsftpd —- VSFTPD的主程序
  /etc/rc.d/init.d/vsftpd —- 启动脚本
  /etc/vsftpd/vsftpd.conf —- 主配置文件
  /etc/pam.d/vsftpd —- PAM认证文件
  /etc/vsftpd.ftpusers —- 禁止使用VSFTPD的用户列表文件
  /etc/vsftpd.user_list —- 禁止或允许使用VSFTPD的用户列表文件
  /var/ftp —- 匿名用户主目录
  /var/ftp/pub      —- 匿名用户的下载目录
  此外,还有一些说明文档和手册文件。

  此外VSFTPD的日志文件位于/etc/logrotate.d/vsftpd.log。

4、VSFTPD的启动与停止

 
 VSFTPD可以单独(Standalone)方式运行,如同httpd、named这类的服务器的运行方式,这是RHL9中默认的方式;也可以采用
xinetd方式运行,这是RHL7.x、8中的默认方式。具体的运行方式由参数listen决定。从RHL中VSFTPD的运行方式,也可以看出
VSFTPD的逐步发展。

  当listen参数值为YES时,RHL9中的默认值,VSFTPD单独运行,我们可以使用脚本/etc/rc.d/init.d/vsftpd来启动、关闭以及重启VSFTPD。命令如下:

  /etc/rc.d/init.d/vsftpd start|stop|restart

  如果说在RHL9上,您还希望使用Xinetd启动VSFTPD的运行方式,那么首先要将vsftpd.conf配置文件中的listen参数值改为NO。其次,生成一个/etc/xinetd.d/vsftpd文件,内容如下:

  service vsftpd
  {
  disable = no
  socket_type = stream
  wait = no
  user = root
  server = /usr/sbin/vsftpd
  port = 21
  log_on_success += PID HOST DURATION
  log_on_failure += HOST
  }
  通过修改disable值为no或yes,并重新启动xinetd,从而启动或停止VSFTPD。

  由于VSFTPD的单独模式已经拥有足够的能力,所以后面6中讨论到的应用,都是以单独模式来运行的,而非Xinetd方式。

  注:还可以直接执行vsftpd来启动FTP服务,关闭时使用“kill”命令。
  [root@hpe45 root]# /usr/local/sbin/vsftpd &

5、VSFTPD的设置选项

 
 VSFTPD的配置文件/etc/vsftpd/vsftpd.conf是个文本文件。以“#”字符开始的行是注释行。每个选项设置为一行,格式为
“option=value”,注意“=”号两边不能留空白符。除了这个主配置文件外,还可以给特定用户设定个人配置文件,具体介绍见后。

  VSFTPD包中所带的vsftpd.conf文件配置比较简单,而且非常偏执狂的(文档自称:-))。我们可以根据实际情况对其进行一些设置,以使得VSFTPD更加可用。

5.1、连接选项

  本部分主要是一些与建立FTP链接相关的选项。

5.1.1、监听地址与控制端口

  listen_address=ip address
 
 此参数在VSFTPD使用单独(standalone)模式下有效。此参数定义了在主机的哪个IP地址上监听FTP请求,即在哪个IP地址上提供FTP
服务。对于只有一个IP地址的主机,不需要使用此参数。对于多址主机,不设置此参数,则监听所有IP地址。默认值为无。

  listen_port=port_value
  指定FTP服务器监听的端口号(控制端口),默认值为21。此选项在standalone模式下生效。

5.1.2、FTP模式与数据端口

   FTP 分为两类,PORT FTP和PASV FTP,PORT
FTP是一般形式的FTP。这两种FTP在建立控制连接时操作是一样的,都是由客户端首先和FTP服务器的控制端口(默认值为21)建立控制链接,并通过
此链接进行传输操作指令。它们的区别在于使用数据传输端口(ftp-data)的方式。PORT
FTP由FTP服务器指定数据传输所使用的端口,默认值为20。PASV FTP由FTP客户端决定数据传输的端口。PASV
FTP这种做法,主要是考虑到存在防火墙的环境下,由客户端与服务器进行沟通(客户端向服务器发出数据传输请求中包含了数据传输端口),决定两者之间的数
据传输端口更为方便一些。

  port_enable=YES|NO
  如果你要在数据连接时取消PORT模式时,设此选项为NO。默认值为YES。

  connetc_from_port_20=YES|NO
  控制以PORT模式进行数据传输时是否使用20端口(ftp-data)。YES使用,NO不使用。默认值为NO,但RHL自带的vsftpd.conf文件中此参数设为YES。

  ftp_data_port=port number
  设定ftp数据传输端口(ftp-data)值。默认值为20。此参数用于PORT FTP模式。

  port_promiscuous=YES|NO
  默认值为NO。为YES时,取消PORT安全检查。该检查确保外出的数据只能连接到客户端上。小心打开此选项。

  pasv_enable=YES|NO
  YES,允许数据传输时使用PASV模式。NO,不允许使用PASV模式。默认值为YES。

  pasv_min_port=port number
  pasv_max_port=port number
  设定在PASV模式下,建立数据传输所可以使用port范围的下界和上界,0
表示任意。默认值为0。把端口范围设在比较高的一段范围内,比如50000-60000,将有助于安全性的提高。

  pasv_promiscuous=YES|NO
  此选项激活时,将关闭PASV模式的安全检查。该检查确保数据连接和控制连接是来自同一个IP地址。小心打开此选项。此选项唯一合理的用法是存在于由安全隧道方案构成的组织中。默认值为NO。

  pasv_address=
  此选项为一个数字IP地址,作为PASV命令的响应。默认值为none,即地址是从呼入的连接套接字(incoming connectd
socket)中获取。

5.1.3 ASCII模式

  默认情况下,VSFTPD是禁止使用ASCII传输模式。即使FTP客户端使用asc命令,指明要使用ASCII模式,但是,VSFTPD表面上接受了asc命令,而在实际传输文件时,还是使用二进制方式。下面选项控制VSFTPD是否使用ASCII传输模式。

  ascii_upload_enable=YES|NO
  控制是否允许使用ascii模式上传文件,YES允许,NO不允许,默认为NO。

  ascii_download_enable=YES|NO
  控制是否允许使用ascii模式下载文件,YES允许,NO不允许,默认为NO。

5.2、性能与负载控制

5.2.1、超时选项

  idle_session_timeout=
  空闲(发呆)用户会话的超时时间,若是超出这时间没有数据的传送或是指令的输入,则会强迫断线。单位为秒,默认值为300。

  data_connection_timeout=
  空闲的数据连接的超时时间。默认值为300 秒。

  accept_timeout=numerical value
  接受建立联机的超时设定,单位为秒。默认值为60。

  connect_timeout=numerical value
  响应PORT方式的数据联机的超时设定,单位为秒。默认值为60。以上两个选项针对客户端的,将使客户端空闲1分钟后自动中断连接,并在中断1分钟后自动激活连接。

5.2.2 负载控制

  max_clients=numerical value
  此参数在VSFTPD使用单独(standalone)模式下有效。此参数定义了FTP服务器最大的并发连接数,当超过此连接数时,服务器拒绝客户端连接。默认值为0,表示不限最大连接数。

  max_per_ip=numerical value
  此参数在VSFTPD使用单独(standalone)模式下有效。此参数定义每个IP地址最大的并发连接数目。超过这个数目将会拒绝连接。此选项的设置将影响到象网际快车这类的多进程下载软件。默认值为0,表示不限制。

  anon_max_rate=value
  设定匿名用户的最大数据传输速度value,以Bytes/s为单位。默认无。

  local_max_rate=value
  设定用户的最大数据传输速度value,以Bytes/s为单位。默认无。此选项对所有的用户都生效。此外,也可以在用户个人配置文件中使用此选项,以指定特定用户可获得的最大数据传输速率。

  步骤如下:
  &#9312;在vsftpd.conf中指定用户个人配置文件所在的目录,如:
  user_config_dir=/etc/vsftpd/userconf
  &#9313;生成/etc/vsftpd/userconf目录。
  &#9314;用户个人配置文件是在该目录下,与特定用户同名的文件,如:
  /etc/vsftpd/userconf/xiaowang
  &#9315;在用户的个人配置文件中设置local_max_rate参数,如:
  local_max_rate=80000
  以上步骤设定FTP用户xiaowang的最大数据传输速度为80KBytes/s。

  VSFTPD 对于速度控制的变化范围大概在80%到120%之间。比如我们限制最高速度为100KBytes/s,
但实际的速度可能在80KBytes/s 到120KBytes/s 之间。当然,若是线路带宽不足时,速率自然会低于此限制。

5.3 用户选项

  VSFTPD的用户分为三类:匿名用户、本地用户(local user)以及虚拟用户(guest)。

5.3.1、匿名用户

  anonymous_enable=YES|NO
  控制是否允许匿名用户登录,YES允许,NO不允许,默认值为YES。

  ftp_username=
  匿名用户所使用的系统用户名。默认下,此参数在配置文件中不出现,值为ftp。

  no_anon_password=YES|NO
  控制匿名用户登入时是否需要密码,YES不需要,NO需要。默认值为NO。
  
  deny_email_enable=YES|NO
 
 此参数默认值为NO。当值为YES时,拒绝使用banned_email_file参数指定文件中所列出的e-mail地址进行登录的匿名用户。即,当
匿名用户使用banned_email_file文件中所列出的e-mail进行登录时,被拒绝。显然,这对于阻击某些Dos攻击有效。当此参数生效时,
需追加banned_email_file参数

  banned_email_file=/etc/vsftpd.banned_emails
  指定包含被拒绝的e-mail地址的文件,默认文件为/etc/vsftpd.banned_emails。

  anon_root=
  设定匿名用户的根目录,即匿名用户登入后,被定位到此目录下。主配置文件中默认无此项,默认值为/var/ftp/。

  anon_world_readable_only=YES|NO
  控制是否只允许匿名用户下载可阅读文档。YES,只允许匿名用户下载可阅读的文件。NO,允许匿名用户浏览整个服务器的文件系统。默认值为YES。

  anon_upload_enable=YES|NO
  控制是否允许匿名用户上传文件,YES允许,NO不允许,默认是不设值,即为NO。除了这个参数外,匿名用户要能上传文件,还需要两个条件:一,write_enable参数为YES;二,在文件系统上,FTP匿名用户对某个目录有写权限。

  anon_mkdir_write_enable=YES|NO
  控制是否允许匿名用户创建新目录,YES允许,NO不允许,默认是不设值,即为NO。当然在文件系统上,FTP匿名用户必需对新目录的上层目录拥有写权限。

  anon_other_write_enable=YES|NO
  控制匿名用户是否拥有除了上传和新建目录之外的其他权限,如删除、更名等。YES拥有,NO不拥有,默认值为NO。

  chown_uploads=YES|NO
  是否修改匿名用户所上传文件的所有权。YES,匿名用户所上传的文件的所有权将改为另外一个不同的用户所有,用户由chown_username参数指定。此选项默认值为NO。

  chown_username=whoever
  指定拥有匿名用户上传文件所有权的用户。此参数与chown_uploads联用。不推荐使用root用户。

5.3.2、本地用户

  在使用FTP服务的用户中,除了匿名用户外,还有一类在FTP服务器所属主机上拥有账号的用户。VSFTPD中称此类用户为本地用户(local
users),等同于其他FTP服务器中的real用户。

  local_enable=YES|NO
  控制vsftpd所在的系统的用户是否可以登录vsftpd。默认值为YES。

  local_root=
  定义所有本地用户的根目录。当本地用户登入时,将被更换到此目录下。默认值为无。

  user_config_dir=
 
 定义用户个人配置文件所在的目录。用户的个人配置文件为该目录下的同名文件。个人配置文件的格式与vsftpd.conf格式相同。例如定义
user_config_dir=/etc/vsftpd/userconf,并且主机上有用户xiaowang,lisi,那我们可以在
user_config_dir的目录新增名为xiaowang、lisi的两个文件。当用户lisi
登入时,VSFTPD则会读取user_config_dir下lisi这个文件中的设定值,应用于用户lisi。默认值为无。

5.3.3、虚拟用户

  guest_enable=YES|NO
  若是启动这项功能,所有的非匿名登入者都视为guest。默认值为关闭。

  guest_username=
  定义VSFTPD的guest用户在系统中的用户名。默认值为ftp。

5.4、安全措施

5.4.1、用户登录控制

  pam_service_name=vsftpd
  指出VSFTPD进行PAM认证时所使用的PAM配置文件名,默认值是vsftpd,默认PAM配置文件是/etc/pam.d/vsftpd。

  /etc/vsftpd.ftpusers
  VSFTPD禁止列在此文件中的用户登录FTP服务器。这个机制是在/etc/pam.d/vsftpd中默认设置的。

  userlist_enable=YES|NO
 
 此选项被激活后,VSFTPD将读取userlist_file参数所指定的文件中的用户列表。当列表中的用户登录FTP服务器时,该用户在提示输入密
码之前就被禁止了。即该用户名输入后,VSFTPD查到该用户名在列表,VSFTPD就直接禁止掉该用户,不会再进行询问密码等后续步聚。默认值为NO。

  userlist_file=/etc/vsftpd.user_list
  指出userlist_enable选项生效后,被读取的包含用户列表的文件。默认值是/etc/vsftpd.user_list。

  userlist_deny=YES|NO
   决定禁止还是只允许由userlist_file指定文件中的用户登录FTP服务器。此选项在userlist_enable
选项启动后才生效。YES,默认值,禁止文件中的用户登录,同时也不向这些用户发出输入口令的提示。NO,只允许在文件中的用户登录FTP服务器。

  
  tcp_wrappers=YES|NO
  在VSFTPD中使用TCP_Wrappers远程访问控制机制,默认值为YES。

5.4.2、目录访问控制

  chroot_list_enable=YES|NO
  锁定某些用户在自家目录中。即当这些用户登录后,不可以转到系统的其他目录,只能在自家目录(及其子目录)下。具体的用户在chroot_list_file参数所指定的文件中列出。默认值为NO。

  chroot_list_file=/etc/vsftpd/chroot_list
  指出被锁定在自家目录中的用户的列表文件。文件格式为一行一用户。通常该文件是/etc/vsftpd/chroot_list。此选项默认不设置。

  chroot_local_users=YES|NO
 
 将本地用户锁定在自家目录中。当此项被激活时,chroot_list_enable和chroot_local_users参数的作用将发生变化,
chroot_list_file所指定文件中的用户将不被锁定在自家目录。本参数被激活后,可能带来安全上的冲突,特别是当用户拥有上传、shell访
问等权限时。因此,只有在确实了解的情况下,才可以打开此参数。默认值为NO。

  passwd_chroot_enable
  当此选项激活时,与chroot_local_user选项配合,chroot()容器的位置可以在每个用户的基础上指定。每个用户的容器来源于/etc/passwd中每个用户的自家目录字段。默认值为NO。

5.4.3、文件操作控制

  hide_ids=YES|NO
  是否隐藏文件的所有者和组信息。YES,当用户使用”ls
-al”之类的指令时,在目录列表中所有文件的拥有者和组信息都显示为ftp。默认值为NO。

  ls_recurse_enable=YES|NO
  YES,允许使用”ls -R” 指令。这个选项有一个小的安全风险,因为在一个大型FTP站点的根目录下使用”ls
-R”会消耗大量系统资源。默认值为NO。

  write_enable=YES|NO
  控制是否允许使用任何可以修改文件系统的FTP 的指令,比如STOR、DELE、RNFR、RNTO、MKD、RMD、APPE
以及SITE。默认值为NO,不过自带的简单配置文件中打开了该选项。

  secure_chroot_dir=
  这选项指向一个空目录,并且ftp用户对此目录无写权限。当vsftpd不需要访问文件系统时,这个目录将被作为一个安全的容器,用户将被限制在此目录中。默认目录为/usr/share/empty。

5.4.4、新增文件权限设定

  anon_umask=
  匿名用户新增文件的umask 数值。默认值为077。

  file_open_mode=
  上传档案的权限,与chmod 所使用的数值相同。如果希望上传的文件可以执行,设此值为0777。默认值为0666。

  local_umask=
  本地用户新增档案时的umask
数值。默认值为077。不过,其他大多数的FTP服务器都是使用022。如果您的用户希望的话,可以修改为022。在自带的配置文件中此项就设为了022。

5.5、提示信息

  ftpd_banner=login banner string
  此参数定义了login banner
string(登录欢迎语字符串)。用户可以自行修改。预设值为无。当ftpd_banner设置后,将取代系统原来的欢迎词。

  banner_file=/directory/vsftpd_banner_file
   此项指定一个文本文件,当使用者登入时,会显示此该文件的内容,通常为欢迎话语或是说明。默认值为无。与ftpd_banner相比,
banner_file是文本文件的形式,而ftpd_banner是字串格式。banner_file选项将取代ftpd_banner选项。

  dirmessage_enable=YES|MO
  控制是否启用目录提示信息功能。YES启用,NO不启用,默认值为YES。此功能启用后,当用户进入某一个目录时,会检查该目录下是否有message_file选项所指定的文档,若是有,则会出现此文档的内容,通常这个档案会放置欢迎话语,或是对该目录的说明。

  message_file=
  此选项,仅在dirmessage_enable选项激活方生效。默认值为.message。

5.6、日志设置

  xferlog_enable=YES|NO
  控制是否启用一个日志文件,用于详细记录上传和下载。该日志文件由xferlog_file选项指定。默认值为NO,但简单配置文件中激活此选项。

  xferlog_file=
  这个选项设定记录传输日志的文件名。默认值为/var/log/vsftpd.log。

  xferlog_std_format=YES|NO
  控制日志文件是否使用xferlog的标准格式,如同wu-ftpd一样。使用xferlog格式,可以重新使用已经存在的传输统计生成器。然而,默认的日志格式更为可读性。默认值为NO,但自带的配置文件中激活了此选项。

  log_ftp_protocol=YES|NO
  当此选项激活后,所有的FTP请求和响应都被记录到日志中。提供此选项时,xferlog_std_format不能被激活。这个选项有助于调试。默认值为NO。

5.7、其他设置

  setproctitle_enable=YES|NO
 
 YES,VSFTPD将在系统进程列表中显示每个会话(session)的状态。也就是说,进程报告将显示每个vsftpd会话在做什么(挂起、下载
等),如用ps -ef|grep
ftp。出于安全的目的,可以考虑将此选项关闭。NO,进程报告只显示一个vsftpd进程在运行。默认值为NO。

  text_userdb_names=YES|No
  当使用者登入后使用ls -al
之类指令时,目录列表的用户和组信息域,默认是出现拥有者的UID,而不是该档案拥有者的名称。若是希望出现拥有者的名称,则将此功能开启。默认值为NO。

  user_localtime=YES|NO
  默认为NO。YES,VSFTPD显示目录列表时使用你本地时区的时间。默认是显示GMT时间。同样,由ftp命令“MDTM”返回的时间值也受此选项影响。

  check_shell=YES|NO
  此选项仅对不使用PAM方式的VSFTPD生效。当此选项关闭后,当本地用户登录时,VSFTPD不会检查/etc/shells文件以寻找一个有效的用户shell。默认为YES。

  nopriv_user=
  指定一个用户,当VSFTPD不想要什么权限时,使用此用户身份。这用户最好是一个专用的用户,而不是用户nobody。在大多数的机器上,nobody用户被用于大量重要的事情。默认值为nobody。

  pam_service_name=
  指明VSFTPD使用用PAM验证服务时的PAM配置文件名。默认值为ftp。

6、VSFTPD应用

  本部分介绍VSFTPD的具体应用方法。

6.1、允许匿名用户上传文件

  在vsftpd.conf文件中修改或增加以下选项:
  write_enable=YES
  anon_world_readable_only=NO
  anon_upload_enable=YES
  anon_mkdir_write_enable=YES

  然后创建供匿名用户上传文件的目录,并设定权限:
  # mkdir /var/ftp/incoming
  # chmod o+w /var/ftp/incoming
  由于匿名用户(ftp)上传文件,需要对incoming目录进行操作,而incoming为root所有,匿名用户(ftp)对于incoming来说是其他用户,所以要加入其他用户(o)的写权限。

6.2、限制用户在自家目录

  在默认配置中,本地用户可以切换到自家目录以外的目录进行浏览,并在权限范围内进行上传和下载,这无疑是个不安全因素。
  我们可以设置chroot,让本地用户登录后只能访问自家目录,无法访问其他目录。相关的选项有三个:chroot_local_user、chroot_list_enable、chroot_list_file。限制用户在自家目录有两种做法:

  1、限制所有的本地用户在自家目录
  chroot_local_user=YES
  这种做法,可能会带来一些安全性上的冲突。参见前面的chroot_local_user选项描述。
  2、限制部分本地用户在自家目录
  chroot_local_user=NO
  chroot_list_enable=YES
  chroot_list_file=/etc/vsftpd.chroot_list
  在/etc/vsftpd.chroot_list文件中加入要限制的本地用户名。注意一个用户名一行。

6.3、配置高安全级别的匿名FTP服务器

  VSFTPD自带的简单配置文件已经自称是偏执狂了,这里看看能否更加偏执一些,:)。有些选项默认已经采用安全性的设置,这里就不再写出了。

  #只允许匿名访问,不允许本地用户访问
  anonymous_enable=YES
  local_enable=NO

  #使用ftpd_banner取代VSFTPD默认的欢迎词,免得泄漏相关信息
  ftpd_banner=Welcome to this FTP Server
  #只让匿名用户浏览可阅读的文件,不可以浏览整个系统
  anon_world_readable_only=YES
  #隐藏文件的所有者和组信息,匿名用户看到的文件的所有者和组全变为ftp
  hide_ids=YES

  #取消写权限
  write_enable=NO
  anon_upload_enable=NO
  anon_mkdir_write_enable=NO
  anon_other_write_enable=NO

  #使用单独模式,并指定监听的IP地址
  listen_address=ip address
  #对连接进行控制,还有超时时间,那就根据具体情况再说了。
  connect_from_port_20=YES
  pasv_min_port=50000
  pasv_max_port=60000
  #控制并发数,限定每个IP地址的并发数,这个嘛,根据用户自已定了。
  max_clients=numerical value
  max_per_ip=numerical value
  #限定下载速度,具体限多大,就由用户自己定了,80KB/s,也很快了吧。
  anon_max_rate=80000

  #启用详细的日志记录格式
  xferlog_enable=YES

6.4、基于IP地址的虚拟FTP服务器

  假定服务器有两个IP地址,192.168.0.1和192.168.0.2。VSFTPD是建立在192.168.0.1上的,现在我们在192.168.0.2上再提供一个虚拟FTP服务器。如何在一台服务器上使用多个IP
地址,请参考相关文档。

  1、创建虚拟FTP服务器的根目录。
  mkdir -p /var/ftp2/pub
  确保/var/ftp2和/var/ftp2/pub目录的拥有者和组均为root,掩码为755。

  2、增加虚拟FTP服务器的匿名用户帐号。原先的FTP服务器使用系统用户ftp作为其匿名用户帐号。我们要增加一个ftp2用于虚拟FTP服务器。

  useradd -d /var/ftp2 -M ftp2

  3、创建虚拟FTP服务器的配置文件。复制原来的vsftpd.conf作为虚拟FTP服务器的配置文件,并修改相关参数。
  cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd2.conf
  新添或修改以下参数:
  listen=YES
  listen_address=192.168.0.2
  ftp_username=ftp2

 
 注:由于VSFTPD默认是监听所有的IP地址,当我们设定基于IP的虚拟FTP服务器时,为防止原来的FTP服务器与虚拟FTP服务器发生监听上的冲
突,原FTP服务器需要指定监听的IP地址。在这里,原来的配置文件中就要设置listen_address=192.168.0.1。

  4、启动虚拟FTP服务器。

 
 /etc/rc.d/init.d/vsftpd脚本在启动时,扫描/etc/vsftpd/目录下所有的*.conf文件,按照*.conf文件的先
后,依次启用vsftpd进程,每个vsftpd进程对应一个.conf文件。即,“ls /etc/vsftpd/”列表的次序与“ps
-aux |grep vsftpd”中的顺序一样。当然了,“ps -aux | grep
vsftpd”中也显示出vsftpd所使用的配置文件,从中也可以看哪个vsftpd进程对应哪个FTP服务器。如果没有列出配置文件,那就是默认的
vsftpd.conf,那么该进程也就是原来的FTP服务器进程。
  由于第3步中虚拟FTP服务器的配置文件被命名为vsftpd2.conf文件,所以我们可以用/etc/rc.d/init.d/vsftpd脚本同时启动或关闭原FTP服务器和新加的虚拟FTP服务器。

  以下命令单独启动虚拟FTP服务器:
  /usr/sbin/vsftpd /etc/vsftpd/vsftpd2.conf &
  单独关闭虚拟FTP服务器,用“ps -aux | grep
vsftpd”查出进程号,再用kill指令杀死虚拟FTP的进程。

6.5、虚拟用户的配置

6.5.1、VSFTPD的虚拟用户介绍

 
 VSFTPD的本地用户本身是系统的用户,除了可以登录FTP服务器外,还可以登录系统使用其他系统资源,而VSFTPD的虚拟用户则是FTP服务的专
用用户,虚拟用户只能访问FTP服务器资源。对于只需要通过FTP对系统有读写权限,而不需要其他系统资源的用户或情况来说,采用虚拟用户方式是很适合
的。
  VSFTPD的虚拟用户采用单独的用户名/口令保存方式,与系统账号(passwd/shadow)分离,这大大增强了系统的安全
性。VSFTPD可以采用数据库文件来保存用户/口令,如hash;也可以将用户/口令保存在数据库服务器中,如MySQL等。VSFTPD验证虚拟用
户,则采用PAM方式。由于虚拟用户的用户名/口令被单独保存,因此在验证时,VSFTPD需要用一个系统用户的身份来读取数据库文件或数据库服务器以完
成验证,这就是guest用户,这正如同匿名用户也需要有一个系统用户ftp一样。当然,guest用户也可以被认为是用于映射虚拟用户。

  配置虚拟用户分为几部分:guest用户的创建、用户/口令的保存、PAM认证配置、vsftpd.conf文件设置等。具体的配置方法,参考下面小节。注:在后面的例子中,假定存在虚拟用户xiaotong和xiaowang。

6.5.2 用户创建和目录设置

  在系统中添加vsftpdguest用户,作为虚拟用户在系统中的代表。

  useradd vsftpdguest

  当虚拟用户登录后,所在的位置为vsftpdguest的自家目录/home/vsftpdguest。如果要让虚拟用户登录到/var/ftp等其他目录,修改vsftpdguest的自家目录即可。

6.5.3、配置文件的设置

6.5.3.1、基本设置。

  在vsftpd.conf配置文件中,加入以下参数:
  guest_enable=YES
  guest_username=vsftpdguest

6.5.3.2、虚拟用户的权限配置。

 
 VSFTPD-1.2.0添加了virtual_use_local_privs参数,当该参数激活(YES)时,虚拟用户使用与本地用户相同的权限。
当此参数关闭(NO)时,虚拟用户使用与匿名用户相同的权限,这也就是VSFTPD-1.2.0之前版本对虚拟用户权限的处理方法。这两者种做法相比,后
者更加严格一些,特别是在有写访问的情形下。默认情况下此参数是关闭的(NO)。
  下面先介绍virtual_use_local_privs=NO时,即VSFTPD-1.2.0之前版本对虚拟用户权限的配置方法:

  &#9312;控制虚拟用户浏览目录
  如果让用户不能浏览目录,但仍可以对文件操作,那么需要执行以下二个步骤:一,配置文件中,anon_world_readable_only=YES。二,虚拟用户目录的权限改为只能由vsftpdguest操作:

  [root@hpe45 vsftpd]# chown vsftpdguest.vsftpdguest
/home/vsftpdguest
  [root@hpe45 vsftpd]# chmod 700 /home/vsftpdguest
  &#9313;允许虚拟用户上传文件
  write_enable=YES
  anon_upload_enable=YES
  &#9314;允许虚拟用户修改文件名和删除文件
  anon_other_write_enable=YES
  由于以上选项的设置同样会对匿名用户生效。如果不想匿名用户趁机拥有同样的权限,最好是禁止匿名用户登录。

  在VSFTPD-1.2.0中当virtual_use_local_privs=YES时,只需write_enable=YES,虚拟用户就可以就拥有写权限。

6.5.3.3、虚拟用户的其他配置

  &#9312;限定虚拟用户在自家目录。

  chroot_local_user=NO
  chroot_list_enable=YES
  chroot_list_file=/etc/vsftpd.chroot_list
  在/etc/vsftpd.chroot_list文件中加入xiaotong和xiaowang。
  或者,chroot_local_user=YES

  &#9313;虚拟用户的个人配置。

  如果想让个别的虚拟用户拥有自己特别的配置,同样可以建立虚拟用户的个人配置文件。在主配置文件中加入:
  user_config_dir=/etc/vsftpd/vsftpd_user_conf
  生成/etc/vsftpd/vsftpd_user_conf目录,在该目录下建立与特定虚拟用户同名的文件:
  [root@hpe45 vsftpd]# mkdir vsftpd_user_conf
  [root@hpe45 vsftpd]# cd vsftpd_user_conf
  [root@hpe45 vsftpd_user_conf]# touch xiaowang
  然后在xiaowang文件中就可以加入专对xiaowang生效的选项设置了。
  注:如果在个人配置文件中加入chroot_local_user=YES是无效的。

6.5.3.4、虚拟用户个人目录设置

  大家可以发现,无论是哪个虚拟用户,登录后所在的目录都是/home/vsftpdguest,即都是guest_username用户的自家目录。下面,介绍如何为每个虚拟用户建立自家目录。

  一种作法是在虚拟用户的个人配置文件中使用local_root选项指定虚拟用户的自家目录。以xiaowang为例,在第上步的基础上,首先/etc/vsftpd/vsftpd_user_conf/xiaowang文件中加入:

  local_root=/home/xiaowang
  新建xiaowang目录,并将权限设为vsftpdguest:
  [root@hpe45 home]# mkdir xiaowang
  [root@hpe45 home]# chown vsftpdguest.vsftpdguest ./xiaowang

6.5.4、MySQL保存虚拟用户

 
 本节介绍如何将虚拟用户的用户名和口令保存在MySQL的数据库中。这主要分二个部分,一是将用户和口令保存在数据库,二是设置相应的PAM认证。为了
方便论述,做如下假定:数据库vsftpdvu,表users,字段name和passwd用于保存虚拟用户的用户名和口令;为了安全,只授权
vsftpdguest读vsftpdvu数据库的users表。

  1、虚拟用户的用户名/口令的保存。这部分在MySQL数据库中完成。首先,创建数据库vsftpdvu以及表users,并插入虚拟用户xiaotong、xiaowang。执行以下命令:

  [root@hpe45 vsftpd]#mysql -p
  mysql>create database vsftpdvu;
  mysql>use vsftpdvu;
  mysql>create table users(name char(16)
binary,passwd char(16) binary);
  mysql>insert into users (name,passwd) values
(‘xiaotong’,password(‘qqmywife’));
  mysql>insert into users (name,passwd) values
(‘xiaowang’,password(‘ttmywife’));
  mysql>quit

  然后,授权vsftpdguest只能读vsftpdvu数据库的users表。执行以下命令:
  [root@hpe45 vsftpd]#mysql -u root mysql -p
  mysql>grant select on vsftpdvu.users to vsftpdguest@localhost identified by
‘i52serial0’;
  mysql>quit

  如果要验证刚才的操作是否成功可以执行下面命令:
  [root@hpe45 vsftpd]#mysql -u vsftpdguest -pi52serial0
vsftpdvu
  mysql>select * from users;
  如果成功,将会列出xiaotong、xiaowang和加密后的密码。

   2、设置PAM认证。这里我们要用到一个利用mysql进行pam验证的开源项目(http:
//sourceforge.net/projects/pam-mysql/)。首先从网站下载它的程序包pam_myql-0.5.tar.gz,复
制到/root目录中。在编译安装之前,要确保mysql-devel的RPM包已经安装在你的机器上,如果没有请从RHL安装光盘中安装该包。然后,执
行以下命令:
  [root@hpe45 root]#tar xvzf pam_mysql-0.5.tar.gz
  [root@hpe45 root]#cd pam_mysql
  [root@hpe45 pam_mysql]#make
  [root@hpe45 pam_mysql]#make install
  make
install这一步可能会出现错误,那只好手动将该目录下生成的pam_mysql.o复制到/lib/security目录下。

  接下来,我们要设置vsftpd的PAM验证文件。打开/etc/pam.d/vsftpd文件,加入以下内容:
   auth required pam_mysql.o user=vsftpdguest passwd=i52serial0
host=localhost db=vsftpdvu table=users usercolumn=name
passwdcolumn=passwd crypt=2
  account required pam_mysql.o user=vsftpdguest passwd=i52serial0
host=localhost db=vsftpdvu table=users usercolumn=name
passwdcolumn=passwd crypt=2
  上面涉及到的参数,
只要对应前面数据库的设置就可以明白它们的含义。这里需要说明的是crypt参数,crypt=0,口令以明文方式(不加密)保存在数据库中;crypt
=1,口令使用UNIX系统的DES加密方式加密后保存在数据库中;crypt=2,口令经过MySQL的password()函数加密后保存。