我试图使用HTTP POST请求,通过上传一个HTML格式的文件,然后将其写入一个文件名为configuration.xml中在我的本地服务器上。我只能使用服务器的库存功能,因此,尽可能多地使用cURL,PHP,Perl或任何我必须在服务器上安装的服务。我试过的做法是让HTML表单打开一个CGI文件作为表单动作,并且这个CGI文件所做的就是用适当的HTML格式运行Bash脚本。我会直接从HTML表单运行Bash脚本,但是我的研究让我相信,如果不编辑.htaccess或其他hacky替代品,这不是不可能的,但这不是我想要去的道路。 (如果这可以以合理的方式完成,请赐教!)无论如何,我能够成功运行Bash脚本。我知道这是因为我在脚本中放置了“touch configuration.xml”命令,并且每次都会创建它。我的脚本也能够确定它是一个HTTP Post,如浏览器中的回显文本所示,但是我似乎无法正确读取文件中的任何数据。我尝试回显数据并将读取的数据重定向到一个文件,但浏览器中没有出现任何内容,也没有写入我指定的文件。这很好,可能是我不知道Bash脚本编写得不够好,或者是一些愚蠢的东西,但我真的不知道如何从这里开始。
代码:
UploadToServer.html:
<form action="run_script.cgi" method="POST" enctype="multipart/form-data">
<input type="file" name="file" />
<input type="submit" name="submit" value="Submit">
</form>
run_script.c:
注:我编译这一个CGI文件用以下命令:gcc run_script.c -o run_script.cgi
#include <stdlib.h>
#include <stdio.h>
int main() {
system("./test.sh &");
printf("Content-Type: text/html\r\n\r\n");
printf(""); // print blank line for proper HTML header formatting
printf("<html>\n");
printf("</HTML>\n");
}
test.sh:
非注释的代码在第二if语句是从here。评论的代码是从here。
#!/bin/bash
touch configuration.xml
if [[ $REQUEST_METHOD = 'POST' ]]; then
echo "this is a post!"
if [ "$CONTENT_LENGTH" -gt 0 ]; then
echo "entered second if statement!"
# read -n $CONTENT_LENGTH POST_DATA <&0
# echo "$CONTENT_LENGTH"
while read line
do eval "echo ${line}"
done
fi
fi
我也试过在this post第三代码块的方法,但没有得到任何输出。我也查看了this post,但它似乎并没有像我需要的那样从文件中获取所有数据。我也尝试过使用像这篇文章中建议的CGI文件(_http://blog.purplepixie.org/2013/08/cc-cgi-file-upload/),但是,再次没有输出。当我尝试新事物时,我一直在浏览Apache错误日志,并且没有出现错误。
任何人有什么想法,我可能做错了什么?有不同的方法值得研究吗?任何建议,非常感谢!
请注意bash脚本中的echo语句:它们是在C代码的http头之前发出的,因此您的浏览器会感到困惑。 – 2014-10-09 13:28:32
@glennjackman:我将'printf(“ \ n”);'移到'system'调用之前的行,但是我的浏览器显示内部服务器错误,并且在Apache错误日志中出现以下错误:脚本标题。 Bad header = '。我原来把标签的printf放在相应的结束标签之前,以摆脱这个确切的格式错误的标题错误。有没有更好的/正确的方法来摆脱这个错误,并让我的回声语句被包含在我的C代码的头文件中?这是你指的还是我的方式? – 2014-10-13 21:30:31
“内容类型”标题**必须是**。 – 2014-10-13 23:33:48