记一沙雕期末作业

发布于 2019-12-09  111 次阅读


这学期开了Linux课程,一晃也到了期末,照常来说是有一篇期末总结要写的,其他课也就是按模式写一篇了事,但是这个课却搞了些花花,留了几个课题让我们选择,其中一个比较有意思的就是让自己搭建一个C语言的在线编译平台。

反正我是不拖到死线不会开始做的那种人,这个作业布置了也有近半个月的时间了,一直拖到这几天才开始做。

一开始没啥思路,可能是摸鱼摸久了,脑子已经全是水了,不想思考拒绝思考,只想继续摸鱼。但是没得办法,这玩意还是逃不掉的,毕竟我还是不想因为这玩意挂科的。

所以还是摸了一条思路,没考虑任何安全因素,非常的简单粗暴,毕竟只要把效果做出来,就可以关了,也不用部署多久,也不会有真正的用户。

最后还是用了php加shell脚本的方式来实现了。具体来讲就是暴力堆了两个文本框和一个按钮,两个文本框在后台对应两个txt文件,在A框输入的内容按下按钮后会成为A.txt的内容,然后按钮exec一个脚本,那个脚本直接gcc编译A.txt里的代码,把结果输出到B.txt,然后B框再显示B.txt就完事了。

说起来确实是挺简单的,因为只要把最基础的功能雏形做出来就完事了,页面也不用做得多美观(图1),嗯,这不是丑,这是简洁。

(图1)

如此这般如此这般,再本地环境上倒是测试好了,但是部署的时候又遇到麻烦了,杂七杂八的权限问题。。就是不知道为啥,php用www账户启动的,所以exec脚本的时候用的是www账户,一是这账户没加进sudoer,二是不知道为什么,运行gcc总是报错。然后就想到了另一个方法,再建一个xxx的账户,然后把xxx加进sudoer里面,然后再修改php-fpm.conf,通过xxx来启动php。这样,exec的时候就是用的有su权限能正常运行gcc的账户了(一切都是为了一瞬的成功运行)。回头看,这分明就是把自己裤裆的拉链拉开然后去商城逛街一样的迷惑行为。。。当然,弄完后还是得恢复原样的!

简陋的php代码:

<html>
<head>
<title>C语言在线编译</title>
</head>
<body>
<?php
if (isset($_POST['txt'])){
$txt=$_POST['txt'];
file_put_contents('1.txt',$txt);
}else {$txt=file_get_contents('1.txt');}
if (isset($_POST ['button']))
{
exec("/bin/sh xxxx/1.sh");
}
$txt2=file_get_contents('2.txt');
echo<<<END
<form method=post>
<textarea name=txt style="width:400px;height:260px;">$txt</textarea>
<input name="button" type=submit onclick="dlink()" style="width:100px;height:50px;" value='==>>'>
</form>
<textarea name=txt style="width:400px;height:260px;">$txt2</textarea>
END;

?>
</body>
</html>

(用是能用,但是实际效果很迷...)

然后是1.sh里写的东西:

!/bin/bash
cat 1.txt > 1.c
sudo gcc xxxx/1.c -o /home/xxx/a.out 2>>error.txt
sudo chmod 777 /home/xxx/a.out
/home/xxx/a.out > xxxx/2.txt 2>error.txt

原本这里也遇到了一些权限问题,后来干脆直接把a.out输出到/home/xxx里去了,算是规避了一下。总之就是粗糙,枯燥(

使用上正常的跑一些很简单的c程序倒是没有问题,但是不能跑带用户交互的,手贱跑了个带scanf()和一个循环的程序,结果给我跑了六个多G的输出文件。。差点直接升天。

其他应该也没什么说的了,总之思路就是,用户输入-->A.txt-->编译-->B.txt-->显示B.txt。嗯,其他都还好,就是权限问题折腾了一段时间。剩下的就是得水一篇千字总结了。


猫の手も借りたいほどだ