2013-03-21 203 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的更多信息。