我正在用Java寫一個服務器程序,允許用戶使用DRMAA提交作業。雖然主服務器進程的運行時間爲root
,但它所做的只是對用戶進行身份驗證,然後啓動另一個以該用戶身份運行的Java程序並實際完成該工作以符合最小化特權的原則。最初,我是在Runtime.exec()
和sudo
(下面的例子)這樣做的情況下正常工作,直到該進程被分類爲止,此時sudo
因爲沒有終端而變得不安。用Java的叉和下降權限
String[] command = {"sudo", "-i", "-u", username, java, theOtherJavaProgram};
Runtime.getRuntime().exec(command, null, getHomeDirectory(username));
當作爲守護程序運行時,在Java中執行這種fork和drop權限模式的最佳方式是什麼?有沒有辦法?我將不得不突破C並學習如何使用JNI創建JVM?
這段代碼在某些時候會產生錯誤,因爲'uid_t'在一些系統上是無符號的,'jint'是有符號的。鑄造通常非常糟糕 - 如果所有的JNI庫都使用了鑄造,則會有設計缺陷。 – specializt 2015-03-25 22:12:56