我正在尝试解析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运行,并且我已经完全访问了目录。有什么想法吗?
答案 0 :(得分:2)
您的问题是您需要在文件名组件周围添加一组额外的引号。 vsftpd日志中的文件名(仅为我自己验证过这个名称)用引号括起来,与用户名不同,你不会删除这些引号。
这意味着$filename
最终被设置为"/foo.txt"
,包括引号。当您使用ls
构造"$home$filename"
的文件名时,会对插值进行插值,但shell不会去除另一个级别的引号。引号保留在最终文件名中,并且带有尾随引号的目录/home/vsftpd/user1"
不存在。
当您从shell输入命令时,这是有效的,因为您没有引用文件名,因此shell执行另一个轮引用插值并删除双引号。
答案 1 :(得分:0)
如果sudo在shell中运行,则sudo可能设置了NOEXEC
标志,这会阻止它执行脚本。您可以详细了解NOEXEC
here。