Bash Can';t使用shell脚本执行ls

Bash Can';t使用shell脚本执行ls,bash,shell,Bash,Shell,我正在尝试解析vsftpd日志,以便对成功上载的文件进行一些额外的处理 username将是用户,因此我创建了home目录 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 "$

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

username
将是用户,因此我创建了home目录
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
当上传文件时,我希望文本为“some text”。我从来没有得到过,相反,我可以看到它的报告:

ls:无法访问/home/vsftpd/user1”/foo.txt:没有这样的文件或目录

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

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

我猜是权限相关的,但我已经让它以sudo的身份运行,并且我已经给了目录完全访问权限。有什么想法吗?

如果sudo在shell中工作,那么sudo可能设置了
NOEXEC
标志,这会阻止它执行脚本。您可以阅读更多关于NOEXEC的信息。您的问题是,在需要剥离的文件名组件周围有一组额外的引号。vsftpd日志中的文件名(我刚刚验证过)用引号括起来,与username不同,您不会删除这些引号

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


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

当然!感谢您深入查看vsftpd日志。我刚刚用这行代码修复了它:
filename=$(echo“$line”| cut-d,-f2 | sed's/^[\t]*//“|tr-d””)