2

我正在尝试解析 vsftpd 日志以对成功上传的文件进行一些额外的处理。

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 运行,并且我已授予目录完全访问权限。有任何想法吗?

4

2 回答 2

2

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

这意味着$filename最终被设置为,从字面上看,"/foo.txt"包括引号。ls当您为with构造文件名时"$home$filename",会插入变量,但 shell 不会再剥离另一层引号。引号保留在最终文件名中,并且/home/vsftpd/user1"带有尾随引号的目录不存在。

这在您从 shell 输入命令时有效,因为您没有引用文件名,因此 shell 会执行另一轮引号插值并删除双引号。

于 2013-03-21T20:36:11.433 回答
0

如果 sudo 从 shell 工作,则 sudo 可能NOEXEC设置了标志,这会阻止它执行脚本。NOEXEC 您可以在此处阅读更多信息。

于 2013-03-21T20:32:54.987 回答