【问题标题】:Linux non-su script indirectly triggering su script?Linux非su脚本间接触发su脚本?
【发布时间】:2014-01-13 19:24:17
【问题描述】:

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

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

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

我想一个启动脚本和一个 root 权限 cron 脚本之间的假脱机行为可能是有序的。是否有任何模型/示例可以最好地构建用户启动的脚本和单独的根启动的脚本之间的通信以用于此类目的?

【问题讨论】:

    标签: linux shell su spool


    【解决方案1】:

    有很多选择。

    我会在第一行提到的事情:

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

    【讨论】:

    • 我不确定我是否理解您的回复。我当然不希望学生做 sudo。这里的重点是将学生发起的提交脚本与特权测试/评估脚本分开。这将有助于封装和隐藏测试等。
    【解决方案2】:

    如果你想坚持使用 shell 脚本,我建议在进程之间进行通信的方法是让根脚本不断检查命名管道的输入(即在每个 eof 之后继续打开它)并通过任何不同的方式发送每个输入必须进行测试。让输入的一部分成为“返回地址”——将结果发送到哪里。

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

    【讨论】:

    • 谢谢。这听起来类似于我想要做的事情,但我没有写入或读取命名管道的经验。有推荐的教程或模型示例吗?
    • 我了解到命名管道允许在同一台机器上进行通信,但不能跨共享文件系统的机器进行通信,因此命名管道不能用于此目的。不过感谢您的建议!
    • 在这种情况下考虑使用套接字而不是命名管道。它们的工作方式几乎完全相同。您可以将简单的客户端/服务器“hello world”转换为调用您的检查系统的东西。 Here's a bit on using sockets over a network in linux
    • 另外,如果你不想使用Linux的C接口,其他语言比如Python有一个库可以使用sockets。
    • 刚刚想到了另一种策略:您可以使用 netcat 进行通信,使用根级脚本在特权机器上侦听(也使用 netcat)。 Netcat
    猜你喜欢
    • 1970-01-01
    • 2011-04-20
    • 1970-01-01
    • 1970-01-01
    • 2011-03-26
    • 1970-01-01
    • 2019-02-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多