Archive for the 'Web服务 | LAMP' Category

Pure-FTPd配置笔记

Sunday, July 6th, 2008

以前曾用过Pure-FTPd提供的ftp服务,作为ftp的服务器端,其类似linux下useradd/usermod/passwd工具的用户管理方式,令人印象深刻。最近正好需要配置一台ftp服务器,当然首选这款有良好安全性口碑的Pure-FTPd。

基本需求是这样的:
虚拟用户 - 也就是说提供的ftp用户在系统里并不存在
权限 - 每个用户对自己目录拥有读写权限,但不允许访问其他目录
虚拟目录 - 每个用户目录下面需要添加一个只读的公有目录

以下为配置过程:
1. 安装
当前最新版本为1.0.21,可从官方网站下载。
wget http://download.pureftpd.org/pub/pure-ftpd/releases/pure-ftpd-1.0.21.tar.gz
tar zxvf pure-ftpd-1.0.21.tar.gz
cd pure-ftpd-1.0.21
./configure --prefix=/usr/local/stow/pure-ftpd-1.0.21 --with-puredb
make
sudo make install

其中,–with-puredb 选项代表虚拟用户支持

2. 创建用户
出于安全以及管理方便,我们让虚拟用户共享同一个系统用户。
首先,在系统中添加相应的用户和组,这里以ftpuser和ftpgroup为例:
/usr/sbin/groupadd ftpgroup
/usr/sbin/useradd -g ftpgroup -d /dev/null -s /etc ftpuser

创建虚拟用户的命令是这样的:
pure-pw useradd smzz -u ftpuser -d /home/ftpusers/smzz
其中, -u将虚拟用户 smzz 同系统用户 ftpuser 关联在一起。-d参数使 smzz 只能访问其 home 目录。而如果想让他访问整个文件系统,可以用 -D 选项。

此外,pure-pw useradd 的选项还有:

-t 下载带宽限制
-T 上传带宽限制
-n 最大文件数目
-N 磁盘配额(单位M)
-q 上传速度限制
-Q 下载速度限制
-r 允许某些ip/网段的客户端访问
-R 拒绝某些ip/网段的客户端访问
-i 允许本地某些ip/网段访问(allow local host)
-I 拒绝本地某些ip/网段访问(deny local host)
-y 同时最大连接数目
-z 允许连接服务器的时间段,格式hhmm-hhmm,如 -z 0412-1618代表用户只能在凌晨4点12分至下午4点18分连接服务器
-f passwd_file
-F puredb_file
-m

2. 更改用户
pure-pw adduser 唯一不同的是,使用 pure-pw usermod 不是创建一个用户,而是更改已经存在用户的某些属性。
如果想禁用某些属性,可直接添加空值,比如pure-pw usermod -n ‘’代表不限制文件数目

3. 更改密码
pure-pw passwd smzz -m
所有这些参数都有一个共同选项 -m ,它代表修改完毕之后不必重启Pure-FTPd以及重新生成puredb_file文件

此外,还有类似userdel命令的子选项pure-pw userdel

4. 提交更改
所有用户操作必须提交更改,方能生效。目前有两种形式
a) 通过pure-pw mkdb重新生成数据文件(/etc/pureftpd.pdb)
b) 用户操作时带上-m选项,比如 pure-pw passwd smzz -m

5. 开启服务
/usr/local/sbin/pure-ftpd -j -lpuredb:/etc/pureftpd.pdb &
其中,-j代表用户第一次登录将会创建自己的home目录,-l代表验证方式
此外,匿名、配额、发呆设置、日志文件等选项均可通过相关参数在pure-ftpd启动时设置

6. 虚拟目录
Pure-FTPd并不支持类似windows下ftp服务器那样的虚拟目录,但可以通过其他方式变相实现,比如
mount –bind /home/my_apps/lib /home/ftpusers/smzz/lib

todo:
pure-ftpd的诸多参数

参考:
man pure-ftpd
man pure-pw
pure-ftpd用户管理

vim远程修改文件产生的安全隐患

Sunday, May 25th, 2008

刚才无意中通过浏览器看到了wordpress配置文件里的信息了,现在想想仍心有余悸。

如果你像我一样,将vim作为首选编辑器;如果你也像我一样,有时候需要远程修改文件。那么,请注意了,通过vim远程修改文件,可能会产生~结尾的备份文件,由于服务器一般都无法解释~后缀文件,这将把代码泄露给客户端。如果巧好是某个配置文件,后果更是不堪设想。

解决方法:
1. 通过设置nobackup和nowritebackup参数,取消vim的自动保存功能
2. 让web服务器解释~后缀文件

gmail也有打盹的时候?

Saturday, December 1st, 2007

Google的服务一向以稳定而著称,但我却看到了gmail在打盹。

刚才打开浏览器,通过Gmail Notifier 插件登录gmail。其实我以前保存了密码,但它却提示我验证失败,于是我输入密码重新登录。一串提示性的文字一闪而过,大意是说我的网速慢之类的。此后本来应该显示熟悉的gmail首页,但是紧接着却出现了白底黑字的javascript代码,还以为是我搞错了,重新打开一个标签登录,依然如此。

gmail source
具体代码如下(为了便于阅读,我删除了其中的空行):

var BrowserSupport_ = {
IsBrowserSupported : function() {
var agt = navigator.userAgent.toLowerCase();
var is_op = (agt.indexOf("opera") != -1);
var is_ie = (agt.indexOf("msie") != -1) && document.all && !is_op;
var is_ie5 = (agt.indexOf("msie 5") != -1) && document.all && !is_op;
var is_mac = (agt.indexOf("mac") != -1);
var is_gk = (agt.indexOf("gecko") != -1);
var is_sf = (agt.indexOf("safari") != -1);
if (is_ie && !is_op && !is_mac) {
if (agt.indexOf("palmsource") != -1 ||
agt.indexOf("regking") != -1 ||
agt.indexOf("windows ce") != -1 ||
agt.indexOf("j2me") != -1 ||
agt.indexOf("avantgo") != -1 ||
agt.indexOf(" stb") != -1)  {
return false;
}
var v = BrowserSupport_.GetFollowingFloat(agt, "msie ");
if (v != null) {
return (v >= 5.5);
}
}
if (is_gk && !is_sf) {
var v = BrowserSupport_.GetFollowingFloat(agt, "rv:");
if (v != null) {
return (v >= 1.4);
} else {
v = BrowserSupport_.GetFollowingFloat(agt, "galeon/");
if (v != null) {
return (v >= 1.3);
}
}
}
if (is_sf) {
if (agt.indexOf("rv:3.14.15.92.65") != -1) {
return false;
}
var v = BrowserSupport_.GetFollowingFloat(agt, "applewebkit/");
if (v != null) {
return (v >= 312);
}
}
if (is_op) {
if (agt.indexOf("sony/com1") != -1) {
return false;
}
var v = BrowserSupport_.GetFollowingFloat(agt, "opera ");
if (v == null) {
v = BrowserSupport_.GetFollowingFloat(agt, "opera/");
}
if (v != null) {
return (v >= 8.0);
}
}
if (agt.indexOf("pda; sony/com2") != -1) {
return true;
}
return false;
},
GetFollowingFloat : function(str, pfx) {
var i = str.indexOf(pfx);
if (i != -1) {
var v = parseFloat(str.substring(i + pfx.length));
if (!isNaN(v)) {
return v;
}
}
return null;
},
tz_path : ';path=/'
};
if (window.location.href.toLowerCase().indexOf('google.com') > 0) {
BrowserSupport_.tz_path += ';domain=.google.com';
}
document.cookie = "TZ=" + (new Date()).getTimezoneOffset() +
BrowserSupport_.tz_path;
var is_browser_supported = BrowserSupport_.IsBrowserSupported();

仔细看了一下页面上的代码,主要是对域名、时区以及浏览器的兼容性做判断的。值得一提的是它还对pda、sony/com2、safari以及opera等客户端作了专门的判断。

用工具查看页面的http信息,如下:

Etag: "hyuaanj8ksp6"
Last-Modified: Fri, 05 Sep 2003 02:11:15 GMT
Content-Type: text/javascript; charset=UTF-8
Cache-Control: private
Expires: Fri, 21 Dec 2007 15:12:16 GMT
Content-Encoding: gzip
Content-Length: 684
Server: GFE/1.3
Date: Sat, 01 Dec 2007 15:12:16 GMT

200 OK

与此同时,我访问了google提供的企业邮局,则显示正常。

当雅虎邮箱再次遇上乱码

Thursday, November 22nd, 2007

最近碰到一件奇怪的事情,使用gmail收到来自雅虎信箱(yahoo.com.cn)回复的邮件时,标题总是或多或少出现乱码。

于是我注册一个雅虎信箱,分别给gmail和公司邮箱(使用客户端sylpheed收信)发送邮件。如果标题超过20个中文,收到的邮件标题确实会显示部分乱码。有意思的是两者显示乱码的方式还不一样:gmail将第20个中文后的字符显示为乱码;sylpheed则将第21、22个中文显示为乱码。

smtp协议似乎并没有对邮件标题长度做限制,不知雅虎信箱为何对标题的第40个字符这么敏感。

btw,在网上搜了一下,发现雅虎邮箱在年初也曾出现过乱码

读取mplayer/ffmpeg运行时的输出信息

Tuesday, October 30th, 2007

由于使用了退格(backspace)、覆盖(substitute)、垂直方向(vertical tab)的tab等控制字符,很难直接读到mplayer/ffmpeg运行时的信息。其实按字符读取并过滤其中的控制字符,便可以还原其输出信息的“真面目“了。以下是在php中的实现:

< ?php

$src = '/path/to/input.mp3';
$dst = '/path/to/output.flv';

$cmd = '/usr/local/bin/ffmpeg -i "%s" -acodec libmp3lame  -f flv   -y "%s" 2>&1 ‘;
$cmd = sprintf($cmd, $src, $dst);
$handle = popen($cmd, ‘r’);
while(!feof($handle)) {
    // 按字符读取
    $charset = fgetc($fd);

    // 如果是垂直tab符号
    if ($ord($charset) == 13) {
        printf(”%sn”, $line);
        $line = ‘’;
        continue;
    }

    // 如果是退格或覆盖符号
    if (ord($charset) == 10 || ord($charset) == 32) {
        continue;
    }
    $line .= $charset;
}
pclose($handle);

?>

ps: 看不出wordpress有时也很bt, 昨天这篇文章发了半天都返回503错误,后来发现是文章里popen一词导致的,我只好用字符p的html实体&#112;来代替了

mysql数据库迁移备忘(4.0.22 -> 5.0.37)

Tuesday, July 31st, 2007

旧mysql版本为4.0.22,新数据库版本为5.0.37,旧库中使用的字符集为utf8,phpmyadmin版本均为2.9.11,具体过程如下:
先在使用phpmyadmin从虚拟主机mysql4.0.22的数据以sql语句方式导出,然后在本地mysql5.0.37上同样使用phpmyadmin导入,发现有如下地方需要修改

old new 备注
`type` enum(’原创’,'转载’) NOT NULL default ‘转载’, `type` enum(’原创’,'转载’) NOT NULL, 如果enum的值为英文,则无需修改
) TYPE=MyISAM AUTO_INCREMENT=185 ; ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=185 ;
) TYPE=HEAP MAX_ROWS=500; ) TYPE=HEAP MAX_ROWS=500;

php4、php5版本while语句处理字符串’0′时的差异

Wednesday, May 30th, 2007

php版本while语句处理字符串’0′时的差异

最新碰到一个诡异问题,某些主机上的php4会把字符串’xkai200′处理成’xkai20′,但是在我的php5上显示正常。怀疑是php4和5两个版本在substr或strlen函数处理上的差异,但是仔细翻阅手册并没有发现两个版本的差别。于是怀疑while语句:

< ?php
$str = 'xkai200';
//$str = 'xkai20a';
convert($str);

function convert($str) {
while($str) {
$i++;
$str = substr($str, 1, strlen($str));
echo "<li>$str \t $i</li>\n";
}
}
echo PHP_VERSION;
?>

将’xkai20a’代替’xkai200′,发现原来while条件中如果是字符串’0′,会被当成false对待!

php4.4.2, php4.4.7上发现此问题,php5.5.2则正常。

解决方法:使用while($str != ‘’) 代替 while($str)。

.bash_profile及.bashrc

Sunday, November 19th, 2006

不像其他发行版本,本来slackware下面的bash配置文件很简单:shell启动时只认.bash_profile文件。可是我的slackware,不管是.bash_profile还是.bashrc都不生效。

怀疑是此前修改~/权限时的后遗症,ls -l ~/\.bash*查看没有x权限,于是chmod u+x ~/\.bash*、退出后满怀欣喜地查看,依然不奏效。

无奈,只好霸王硬上弓,在/etc/profile里source了一遍:

#Get the aliases and function
   if [ -f ~/.bash_profile ];then
    . ~/.bash_profile
  fi
#User specific environment and startup programs

以防万一,把.bashrc的也加上去了。btw, 感觉linux实在是个好东东,特意添加了黄嘴企鹅分类。

备忘:mount windows分区

Sunday, November 12th, 2006

换了台电脑,换了个操作系统,连fstab文件都得重新写一遍。

sudo cp /etc/fstab /etc/fstab.bak
sudo vim /etc/fstab

# /etc/fstab: static file system information.
#
#

proc /proc proc defaults 0 0
/dev/sda9 / ext3 defaults,errors=remount-ro 0 1
/dev/sda12 /home ext3 defaults 0 2
/dev/sda10 /usr ext3 defaults 0 2
/dev/sda11 none swap sw 0 0
/dev/hda /media/cdrom0 udf,iso9660 user,noauto 0 0
/dev/sda1 /mnt/win_c ntfs ro,uid=1000,iocharset=utf8 0 0
/dev/sda5 /mnt/win_d ntfs ro,uid=1000,iocharset=utf8 0 0
/dev/sda6 /mnt/win_e ntfs ro,uid=1000,iocharset=utf8 0 0
/dev/sda7 /mnt/win_f ntfs ro,uid=1000,iocharset=utf8 0 0
/dev/sda8 /mnt/win_g vfat ro,uid=1000,iocharset=utf8 0 0保存,退出。

sudo mount -a

linux命令行中横线(-)前缀的特殊文件

Thursday, August 3rd, 2006

今天才发现linux中有些命令的参数带横线(-),而有的就没有,比如ps aux,而且还不能通过rm 直接删除-name文件。请教阿官并man rm方得知,可以这样删除:

rm — -name
rm ./-name

而文件无关的命令得参数则可以省略横线,手册上讲,ps aps -a是一样的。