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

ファイルがアップロードされると、「some text」というテキストが期待されます。代わりに、それが報告するのを見ることができます:

ls: cannot access /home/vsftpd/user1"/foo.txt": No such file or directory

シェルでコマンドを実行できますが:

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

アクセス許可に関連していると推測していますが、sudoとして実行しており、ディレクトリにフルアクセスを許可しています。何か案は?

4

2 に答える 2

2

問題は、削除する必要があるファイル名コンポーネントの周りに余分な引用符があることです。vsftpd ログのファイル名 (これを自分で確認したところです) は引用符で囲まれており、ユーザー名とは異なり、それらの引用符を削除していません。

これは、引用符を含めて$filename、文字どおりに設定されることを意味します。with"/foo.txt"のファイル名を作成すると、変数が補間されますが、シェルは別のレベルの引用符を削除しません。引用符は最終的なファイル名に残り、引用符が末尾にあるディレクトリは存在しません。ls"$home$filename"/home/vsftpd/user1"

ファイル名を引用していないため、シェルからコマンドを入力すると、これが機能します。そのため、シェルは別のラウンドの引用補間を行い、二重引用符を削除します。

于 2013-03-21T20:36:11.433 に答える
0

sudoがシェルから機能する場合、sudoにNOEXECフラグが設定されている可能性があります。これにより、sudoはスクリプトを実行できなくなります。NOEXEC あなたはここでもっと読むことができます。

于 2013-03-21T20:32:54.987 に答える