- 论坛徽章:
- 0
|
本文原出处:Coolzsb的杂货铺子
可自由转载,但请遵循“署名-非商业用途-保持一致”的创作共用协议。
如何限制FTP的上传用户只能传文本文件到相对应的FTP服务器上?
咱用的最顺手的FTP服务程序就是<a href="http://www.pureftpd.org">Pure-FTPd</a>了,把pure-ftpd的文档翻了两遍,似乎没有看到限制文件类型的功能设置。难道就这么黄了吗?且慢,Pure-FTPd提供了个pure-uploadscript的功能,这个功能的作用就是当用户完成了一次成功的FTP上载之后,立马呼叫一个外部的程序或者脚本就刚刚上载的文件进行操作:这个操作是以刚刚上传的文件名作为第一个参数的。
于是,咱的这个技术要求就被分解为:
- 写一个脚本来判断目标文件是否为真正的txt文本文件:当然了,这个脚本唯一接受的参数就是目标文件的完全路径名
- 开启Pure-FTPd的pure-uploadscript功能,并调用咱为此写的脚本
任务被分解出来就好办了,咱就分块解决了
要判断目标文件是否为真正的文本文件,不外乎以下的判断
- 文件的后缀名为 txt
- 这个文件是真正的文本文件:其他什么类型的文件改了文件后缀名为txt的一律不算
取文件的后缀名很简单,两个管道就可以完成;不依靠文件后缀名来判断文件类型呢?也很简单,linux本身就有一个file命令专门用于干这活,于是这个shell script就展示如下:
- #!/bin/bash
- export LANG=zh_CN
- filetype=`/usr/bin/file -bi "$1" | awk -F";" '{print $1}'`
- Exfname=`/bin/echo "$1" | /bin/sed 's/^.*\.//' | /usr/bin/tr [A-Z] [a-z]`
- if [ $Exfname != "txt" -o $filetype != "text/plain" ] ; then
- echo "有反动份子搞破坏被抓住啦,其罪恶行径$1已经被清除" >>/var/log/pureftpd.log
- rm "$1"
- fi
复制代码
保存该脚本为/etc/pure-ftpd/checkfile.sh,并赋予555的权限。
开启Pure-FTPd的pure-uploadscript功能并调用上面的脚本
找到Pure-FTPd的配置文件pure-ftpd.conf中的这么一行
把前面的#号去掉即可
为了保证Pure-FTPd服务启动自动启动pure-uploadscript去呼叫/etc/pure-ftpd/checkfile.sh,咱修改一下pure-ftpd的启动脚本/etc/init.d/pure-ftpd
- --- /tmp/init.d/pure-ftpd 2009-08-05 13:25:02.000000000 +0800
- +++ /etc/init.d/pure-ftpd 2009-08-05 13:18:48.000000000 +0800
- @@ -30,6 +30,7 @@
-
- start() {
- echo -n $"Starting $prog: "
- + /usr/sbin/pure-uploadscript -B -g 502 -u 502 -r /etc/pure-ftpd/checkfile.sh
- daemon "$pure_launch_script $pure_config --daemonize > /dev/null"
- RETVAL=$?
- [ $RETVAL = 0 ] && touch /var/lock/subsys/pure-ftpd
- @@ -39,6 +40,7 @@
- stop() {
- echo -n $"Stopping $prog: "
- killproc pure-ftpd
- + killproc pure-uploadscript
- RETVAL=$?
- [ $RETVAL = 0 ] && rm -f /var/lock/subsys/pure-ftpd
- echo
复制代码
于是,叫上兄弟部门的兄弟,让他们把一个个狡猾的非法文件传到FTP上然后看着它们的消失,世界就此清净了。
附录1:
俺写的这个脚本纯属应付这趟差事而作,如果有更复杂的应用需求的话,翻阅Pure-FTPd的配置手册可见下面段落:
The absolute path of the newly uploaded file is passed as a first argument.
Some environment variables are also filled with interesting values:
- UPLOAD_SIZE : the size of the file, in bytes.
- UPLOAD_PERMS : the permissions, as an octal value.
- UPLOAD_UID : the uid of the owner.
- UPLOAD_GID : the group the file belongs to.
- UPLOAD_USER : the name of the owner.
- UPLOAD_GROUP : the group name the file belongs to.
- UPLOAD_VUSER : the full user name, or the virtual user name. (127 chars max)
所以,要针对对不同用户做不同的控制也是可以的,只不过,你的shell script要写得更复杂些。
附录2:
Pure-FTPd的用户权限控制实在是太让人烦躁了:不同的虚拟用户要对同一个目录有不同的权限还需要将之对应到不同的系统用户,然后再来chmod、umask......
[ 本帖最后由 coolzsb 于 2009-8-7 11:38 编辑 ] |
|