在inotifywait通知上运行上传和删除文件

时间:2015-07-20 20:29:49

标签: json bash curl

我有一个循环脚本,可以将文件上传到服务器,完成后会在成功时将JSON对象返回给终端,并提供有关文件/上传的各种信息。

有没有办法让第二个脚本运行来监视此上传的确认,以便我可以在本地删除该文件?

编辑:对于上下文,这是循环脚本:

#monitor directory for new files
inotifywait -m -q -r -e MOVED_TO --format '%f' /var/www/html/uploads/ | while read FILE
do
#when new file detected, upload to website
curl -u <user:pass> -T /var/www/html/uploads/$FILE https://www.website.com
done

成功上传的回应:

{
"meta": {
    "code": 200
},
"results": {
    "id": 122,
    "sha1sum": "3fcdbdb04baa29ce695ff36af81eaac496364e82",
    "status": "B"
}
}

2 个答案:

答案 0 :(得分:1)

你可以。只需使用管道或&amp;&amp ;.例如

将upload.sh的输出保存到日志文件

时删除upload.sh
./upload.sh >> uploadlog.txt && rm upload.sh

将upload.sh的输出传递给另一个处理upload.sh输出的shell脚本并删除upload.sh文件

./upload.sh | ./uploadhandler.sh

答案 1 :(得分:1)

while IFS= read -r file; do
  curl \
    --fail \
    -u "$user:$pass" \
    -T "/var/www/html/uploads/$file" \
    https://www.website.com \
    && rm -f "/var/www/html/uploads/$file"
done < <(inotifywait -m -q -r -e MOVED_TO --format '%f' /var/www/html/uploads/)

关键点:

  • 仅当远程服务器接受上传时,才使用curl --fail返回成功退出状态;只要在HTTP标头中给出退出状态,而不是仅在meta部分中,就不需要解析JSON响应。
  • 仅当&&退出且状态成功时,才使用rm运行curl命令。
  • 引用您的扩展:$file应始终在curl命令行中使用双引号,特别是,否则用户可以在您的服务器上运行任意curl命令将空格放在文件名中。
  • 这仍然有点坏,因为您的inotifywait格式使用换行符分隔符,但换行符在文件名中有效。不幸的是,由于inotifywait的设计缺陷,这很难避免,因为它不允许使用NUL分隔符。如果您希望针对带有文字换行符的上传文件名提供安全的解决方法,则此主题中存在其他StackOverflow问题。有关使用欺骗文件名的攻击示例,请参阅this reddit post