为什么使用 nohup 启动的命令在用户注销后无法写入文件?

为什么使用 nohup 启动的命令在用户注销后无法写入文件?

我正在使用 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-screen 会话中运行,则会出现

注销前命令

我断开 GNU-screen 会话,注销,登录,然后重新连接到 screen 会话,结果发现我失去了以前在 screen 中可以访问的文件的访问权限。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 令牌)所需的特定票证。事实上,您可以直接使用 Kerberos 票证,因为 AFS 服务具有 AFS 标识令牌。

在大多数情况下,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 ~ $

凭证缓存是找到票证的文件的位置。Principal 是用户 ID,基本上是用户名和 Kerberos 领域域的组合。请注意,Kerberos 领域通常以大写形式给出,并且区分大小写。接下来是已颁发票证的列表,以及相应的颁发日期和到期日期。在这种情况下,第一张票证 ( krtbg) 对应于领域中的票证授予票证,KERBEROS.REALM.DOMAIN而第二张票证对应于 afs 单元上的 AFS 令牌your.system.domain(通常与可以找到它的域同名)。如果已请求,其他 Kerberos 票证可能会显示在列表中。

令牌续订

当 AFS 令牌过期时,将无法再访问 AFS 帐户。发生此类事件的症状因操作系统而异,但在 Unix/Linux 中,您尝试访问文件时通常会收到权限被拒绝的消息:

username@machine00 ~ $ ls
ls: .: Permission denied

当令牌过期时,您需要更新它。一个简单的方法是注销并再次登录,因为在大多数情况下,令牌更新会在登录时自动进行。但事实证明,有时注销不是一个选择,特别是当你正在运行一些你不想退出的东西时。

票证续订的另一种解决方案是按顺序使用kinitaklog。这些命令中的第一个(kinit)需要您的密码,允许用户重新进行身份验证和票证授予票证续订。接下来,aklog命令允许您从 Kerberos 票证中获取 AFS 令牌。请注意,kinit尝试获取默认主体和领域的票证。如果未定义这些,或者用户在请求票证时使用了不同的用户名,kinit则应将其用作kinit <principal>@<realm>,例如:

username@machine00 ~ $ kinit [email protected]
[email protected]'s Password: 
username@machine00 ~ $

与之相反的aklogunlog,删除 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 脚本,我将其放在任何saveloadmatlab 命令之前。代码使用 matlab 命令unix在 Unix shell 上运行其参数并返回结果。Unix 命令以静默方式klist -s运行klist,但返回其退出状态。我们测试退出状态以获取凭据,并在凭据不存在或已过期的情况下请求新的凭据。

相关内容