无法使用shell脚本执行ls

时间:2013-03-21 20:30:37

标签: bash shell

我正在尝试解析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运行,并且我已经完全访问了目录。有什么想法吗?

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:0)

如果sudo在shell中运行,则sudo可能设置了NOEXEC标志,这会阻止它执行脚本。您可以详细了解NOEXEC here