Linux非su脚本间接触发su脚本?

时间:2014-01-13 19:24:17

标签: linux shell su spool

我想为Linux系统上的学生创建一个自动测试/评分脚本,以便:

  • 任何学生用户都可以随时启动脚本。
  • 单独的脚本(具有root权限)将学生代码复制到非学生可访问的文件空间,使用非学生可访问的单元测试等。
  • 用户以评分脚本生成的文本文件的形式收到有限的反馈。

简而言之,我希望创建类似于编程竞赛提交系统的东西,但是在不泄露所有教师单元测试的情况下允许更丰富的反馈。

我认为一个启动脚本和一个root-permission cron脚本之间的假脱机行为可能是有序的。是否有任何模型/示例可以说明如何最好地构建用户启动的脚本与单独的根启动脚本之间的通信?

2 个答案:

答案 0 :(得分:0)

有很多选择。

我在第一行提到的事情:

  • 不要使用 su ;使用 sudo ;有几个原因,主要原因是,使用 su 你需要你想要的用户的密码和 sudo - 你没有;
  • 脚本不能 suid ,您必须使用二进制文件或仅使用sudo启动的普通脚本(当然学生必须有sudoers条目允许他们使用脚本);
  • Cron 并不是那么快,理论上你可能需要; cron每分钟都会执行任务;请考虑 inotify 用法;
  • 要在系统组件之间进行通信,您需要能够实时响应的内容;有许多开源组件/库/框架可以帮助你,但我建议你看看 ZeroMQ Redis ;
  • 脚本的执行/测试结果可以写入文件系统(我认为会更好),也可以写入DBMS。

答案 1 :(得分:0)

如果你想坚持使用shell脚本,我建议在进程之间进行通信的方法是让root脚本连续检查命名管道的输入(即在每次eof之后保持打开它)并通过各种各样的方式发送每个输入必须进行测试。将部分输入作为“返回地址” - 将结果发送到何处。

这应允许在特权空间中执行测试,而不会向学生公开对特权空间的任何控制。学生不需要sudo,也不需要拉图书馆。只需让学生将他们的代码传递给一个非特权脚本,该脚本会添加返回地址和您可能需要的任何其他标记,然后将其提供给命名管道。