2013-03-21 199 views
2

我想解析vsftpd日志做一些额外的处理上成功上传的文件。无法执行ls使用shell脚本

username将是用户,所以我创建的主目录 filename是日志文件名:它给出了一个靠不住的结果,即“/foo.txt”但是,这并不重要

#!/bin/sh 
sudo tail -F /var/log/vsftpd.log | while read line; do 
    if sudo echo "$line" | grep -q 'OK UPLOAD:'; then 
    username=$(echo "$line" | cut -d" " -f8 | sed 's/\[\(.*\)\]/\1/') 
    filename=$(echo "$line" | cut -d, -f2 | sed 's/^[ \t]*//') 
    home="/home/vsftpd/$username" 
    if sudo ls "$home$filename" &> /dev/null; then 
     # do something with $filename 
     echo "some text" 
    fi 
    fi 
done 

当文件上传时,我期望文本“一些文本”。我从来没有拿到,而不是我可以看到它的报道:

ls: cannot access /home/vsftpd/user1"/foo.txt": No such file or directory

虽然我可以在shell中运行以下命令:

$ sudo ls /home/vsftpd/user1"/foo.txt" 
/home/vsftpd/user1/foo.txt 

我猜权限相关的,但我有它运行作为sudo,我给了目录完全访问权限。有任何想法吗?

回答

2

你的问题是你有一个额外的文件名组件周围的引号,你需要去掉。 vsftpd日志中的文件名(仅为自己验证过)被引号括起来,与用户名不同,您不会删除这些引号。

这意味着$filename最终会被设置为包含引号的字面意思"/foo.txt"。当您使用"$home$filename"ls构建文件名时,将对这些变量进行插值,但该shell不会去除另一个引号级别。引号保留在最终的文件名中,并且尾随引号的目录/home/vsftpd/user1"不存在。

当你从shell输入命令,因为你没有引用文件名,所以shell执行另一轮引用插值并删除双引号。

+0

当然!感谢您深入了解vsftpd日志。我只是用下面的代码来修复它:'filename = $(echo“$ line”| cut -d,-f2 | sed's/^ [\ t] * //'| tr -d'“')' – Tom 2013-03-21 20:51:54

0

如果sudo在shell中运行,那么sudo可能会设置NOEXEC标志,从而阻止它执行脚本。您可以阅读关于NOEXEChere的更多信息。