我有一个循环脚本,可以将文件上传到服务器,完成后会在成功时将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"
}
}
答案 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。