2014-01-13 67 views
-1

我想在Linux系統上爲學生創造一個自動檢測/分級腳本這樣的:Linux非su腳本間接觸發su腳本?

  • 任何學生用戶可以隨時啓動腳本。
  • 單獨的腳本(具有root權限)使用非學生可訪問的單元測試等將學生代碼複製到非學生可訪問的文件空間。
  • 用戶以文本文件的形式接收有限反饋由分級腳本生成。

簡而言之,我期望創建類似於編程競賽提交系統的東西,但允許更豐富的反饋而不會泄露所有的老師單元測試。

我會想象一個啓動腳本和一個root權限cron腳本之間的假脫機行爲可能是按順序的。是否有任何模型/示例說明如何在用戶啓動的腳本和單獨的由根啓動的腳本之間進行通信以達到此目的?

回答

0

有很多選擇。

我會提到在第一線的東西:

  • 不要使用;使用sudo;有幾個原因,主要原因是,使用su你需要你想要的用戶的密碼和sudo - 你不需要;
  • 腳本不能SUID,你必須使用二進制或只是將使用sudo(當然學生必須sudoers條目,允許他們使用的腳本)開始正常的腳本;
  • 克朗是不是那麼快,因爲你可能理論上需要; cron每分鐘運行一次任務;請考慮使用inotify;
  • 要在系統組件之間進行通信,您需要能夠實時響應的內容;有很多開源組件/庫/框架可以幫助你,但我建議你看看ZeroMQRedis;
  • 腳本的執行結果/測試可以寫入文件系統(我認爲它會更好),也可以寫入DBMS。
+0

我不確定我瞭解您的回覆。我當然不希望學生做sudo。這裏的要點是將學生髮起的提交腳本與特權測試/評估腳本分開。這將有助於封裝和隱藏測試等。 – ProfPlum

0

如果你想堅持到shell腳本,我建議進程之間通信的方法是有根劇本不斷地檢查輸入命名管道(即保留每個EOF後打開它),併發送每個輸入通過任何必須做的各種測試。將部分輸入作爲「返回地址」 - 發送結果的位置。

這應該允許測試在特權空間中執行,而不會將對特權空間的任何控制暴露給學生。學生不需要sudo,也不需要拉圖書館。只需讓學生將他們的代碼管理到一個非特權腳本中,該腳本添加返回地址以及任何其他可能需要的標記,然後將其提供給命名管道。

+0

謝謝。這聽起來像是我想要做的事情,但我沒有寫入或讀取命名管道的經驗。是否有你會推薦的教程或模型示例? – ProfPlum

+0

我已經明白,命名管道允許在同一臺計算機上進行通信,但不能在共享文件系統的計算機上進行通信,因此命名管道不能用於此目的。還是)感謝你的建議! – ProfPlum

+1

在這種情況下,請使用套接字而不是命名管道。他們的工作幾乎完全一樣。你可以將一個簡單的客戶機/服務器'hello world'轉換成調用你的檢查系統的東西。 [http://www.linuxhowtos.org/C_C++/socket.htm] –