免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 6386 | 回复: 1
打印 上一主题 下一主题

[FTP] [原创]Pure-FTPd限制用户只能上传特定类型的文件 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-08-07 11:37 |显示全部楼层 |倒序浏览
本文原出处: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就展示如下:


  1. #!/bin/bash
  2. export LANG=zh_CN
  3. filetype=`/usr/bin/file -bi "$1" | awk -F";" '{print $1}'`
  4. Exfname=`/bin/echo "$1" | /bin/sed 's/^.*\.//' | /usr/bin/tr [A-Z] [a-z]`
  5. if [ $Exfname != "txt" -o $filetype != "text/plain" ] ; then
  6.         echo "有反动份子搞破坏被抓住啦,其罪恶行径$1已经被清除" >>/var/log/pureftpd.log
  7.         rm "$1"
  8. fi
复制代码


保存该脚本为/etc/pure-ftpd/checkfile.sh,并赋予555的权限。

开启Pure-FTPd的pure-uploadscript功能并调用上面的脚本
找到Pure-FTPd的配置文件pure-ftpd.conf中的这么一行

  1. #CallUploadScript yes
复制代码

把前面的#号去掉即可

为了保证Pure-FTPd服务启动自动启动pure-uploadscript去呼叫/etc/pure-ftpd/checkfile.sh,咱修改一下pure-ftpd的启动脚本/etc/init.d/pure-ftpd

  1. --- /tmp/init.d/pure-ftpd     2009-08-05 13:25:02.000000000 +0800
  2. +++ /etc/init.d/pure-ftpd     2009-08-05 13:18:48.000000000 +0800
  3. @@ -30,6 +30,7 @@

  4. start() {
  5.   echo -n $"Starting $prog: "
  6. + /usr/sbin/pure-uploadscript -B -g 502 -u 502 -r /etc/pure-ftpd/checkfile.sh
  7.   daemon "$pure_launch_script $pure_config --daemonize > /dev/null"
  8.   RETVAL=$?
  9.   [ $RETVAL = 0 ] && touch /var/lock/subsys/pure-ftpd
  10. @@ -39,6 +40,7 @@
  11. stop() {
  12.   echo -n $"Stopping $prog: "
  13.   killproc pure-ftpd
  14. + killproc pure-uploadscript
  15.   RETVAL=$?
  16.   [ $RETVAL = 0 ] && rm -f /var/lock/subsys/pure-ftpd
  17.   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 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-08-15 13:12 |显示全部楼层
这个用pure-ftpd很容易实现啊:

  • 不能删除:控制一下默认的umask即可
  • 控制只能上传,不能下载:用Upload/download ratio就可以控制了,把download 设为0即可



原帖由 ruochen 于 2009-8-12 16:50 发表
ftp的有些配置要求很变态的
曾经碰到一个:

只能上传,而且上传后不能删除,不能下载

[ 本帖最后由 coolzsb 于 2009-8-15 13:14 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP