我正在使用 nohup 啟動 matlab 並運行一個需要讀取和寫入一些給定文件的腳本。
nohup matlab -nojvm -nodisplay -r 'MyScript'&
當我登入時,它運行順利,但一旦我登出並再次登錄,我就會看到我的 matlab 進程不再運行。檢查 nohup.out 檔案後,我發現以下錯誤訊息:
Unable to write file $HOME/matlab/my_mat_file.mat: permission denied
看來,一旦我註銷,matlab 進程的所有者就會發生變化,他將無法再存取我的檔案。如何在不更改檔案權限的情況下防止此錯誤發生,例如,透過向每個人授予寫入權限?
使用 GNU-screen 時也會彈出此錯誤訊息。如果我ls -al $HOME
在登出之前在 GNU 螢幕會話中運行,我會
我從 GNU 螢幕會話中分離出來,註銷,登錄,然後重新連接到螢幕會話,結果發現我失去了對過去可以存取內部螢幕的檔案的存取權限。現在的輸出ls -al $HOME
是
很有趣,不是嗎?
答案1
這與身份驗證有關。
我將從有關票證和令牌的一些概念以及 Kerberos 身份驗證系統和 AFS 如何使用它們開始。到最後,我的問題的答案將會很清楚,我不允許寫入該文件,只是因為我的 AFS 令牌在登出時被刪除。也就是說,我的問題的解決方案是在 matlab 腳本中包含幾行,以確定令牌是否存在或不創建它(如果不存在)。答案到底是如何完成的。
驗證
提供可從任何地方存取的分散式檔案系統意味著強大的安全系統。這就是為什麼 AFS 具有與 Kerberos 身份驗證系統整合的強大身份驗證系統。
AFS中的身份驗證是透過令牌的方式解決的。令牌授予使用者在其生命週期內存取資料的權限。在許多情況下,令牌處理是無縫的,不需要使用者乾預。但是,用戶可以在任何給定時間使用以下命令列出以其名義發行的代幣tokens
username@machine00 ~ $ tokens
Tokens held by the Cache Manager:
User's (AFS ID xxxxx) tokens for [email protected] [Expires Mar 20 05:10]
--End of list--
AFS 令牌是從 Kerberos 識別碼票證取得的。與令牌類似,Kerberos 票證也可以識別使用者。在使用Kerberos認證系統時,KDC(金鑰分發中心)會向使用者頒發一個初始票證,稱為票證授予票證。第一張票證唯一地標識了用戶,並允許他獲得進一步服務(如 AFS 代幣)所需的特定票證。事實上,您可以直接使用具有 AFS 識別令牌的 AFS 服務的 Kerberos 票證。
大多數情況下,Kerberos 的票證授予票證是在使用者登入時自動取得的。 AFS 初始令牌也發生同樣的情況。與令牌一樣,Kerberos 票證處理在大多數情況下對使用者來說是不可見的,但您可以使用以下命令列出已發行的票證klist
username@machine00 ~ $ klist
Credentials cache: FILE:/tmp/krb5cc_V16088
Principal: [email protected]
Issued Expires Principal
Mar 19 19:10:11 Mar 20 05:10:11 krbtgt/[email protected]
Mar 19 19:10:11 Mar 20 05:10:11 afs/[email protected]
username@machine00 ~ $
憑證快取是找到票證的檔案的位置。主體是使用者 ID,基本上是使用者名稱和 Kerberos 領域的組合的結果。請注意,Kerberos 領域通常以大寫形式給出,並且區分大小寫。以下是已發行門票的列表,以及相應的發行日期和到期日期。在這種情況下,第一個票證 ( krtbg
) 對應於領域上的票證授予票證KERBEROS.REALM.DOMAIN
,而第二個票證對應於 afs 單元上的 AFS 令牌your.system.domain
(通常與可以找到它的域具有相同的名稱)。如果有人要求,其他 Kerberos 票證可能會顯示在清單中。
令牌更新
當 AFS 令牌過期時,將無法再存取 AFS 帳戶。發生此類事件的症狀因作業系統而異,但是在 Unix/Linux 中,您在嘗試存取檔案時通常會收到權限被拒絕的訊息:
username@machine00 ~ $ ls
ls: .: Permission denied
當令牌過期時,您需要更新它。一個簡單的方法是登出並再次登錄,因為在大多數情況下,令牌更新會在登入時自動發生。但事實證明,有時註銷不是一個選項,特別是如果您正在運行一些您不想退出的東西,情況就是如此。
票證續訂的另一個解決方案是依序使用kinit
和。aklog
這些命令中的第一個 ( kinit
) 需要您的密碼,允許使用者重新驗證和票證授予票證更新。接下來,aklog
命令允許您從 Kerberos 票證取得 AFS 令牌。請注意,kinit
請嘗試取得預設主體和領域的票證。如果未定義這些,或使用者在請求票證時使用不同的使用者名,kinit
則應使用kinit <principal>@<realm>
,例如:
username@machine00 ~ $ kinit [email protected]
[email protected]'s Password:
username@machine00 ~ $
aklog
與的相反unlog
,刪除 AFS 令牌。相應地,kdestroy
刪除票證文件,刪除所有 Kerberos 票證。
這如何挽救了局面並幫助我愛我的朋友和家人
正如一開始所說,了解這些概念有助於我更好地理解 matlab 會話中發生的情況。註銷後,我的 AFS 令牌不再存在,我正在運行的進程不再有權寫入我的 afs 磁碟區。因為目前我只對保證即使在註銷後我的 matlab 腳本也能繼續運行讀取和寫入文件感興趣,所以我在訪問 AFS 卷之前小心地包含了對 AFS 令牌的測試
ticket_status = unix('klist -s');
if ticket_status ~= 0,
unix 'kinit [email protected] <<< "password"';
unix aklog
end
正如我所說,這會進入 matlab 腳本,我將其放在任何save
或load
matlab 命令之前。程式碼使用 matlab 命令unix
在 Unix shell 上運行其參數並傳回結果。 Unix 指令靜默klist -s
運作klist
但回傳其退出狀態。我們測試憑證的退出狀態,並要求新的憑證,以防它們不存在或已過期。