当我退出 SSH 会话时,为什么会出现权限被拒绝错误?

Bak*_*riu 6 ssh permissions tmux afs kerberos

我必须在大学的服务器上运行一些测试。我可以从办公室的桌面 ssh 访问服务器。我想在服务器上启动一个 python 脚本,该脚本将在周末运行多个测试。

办公室的桌面将在周末进入待机状态,因此即使 SSH 会话终止,该进程也必须继续在服务器上运行。

我知道nohupscreentmux,在这样的问题描述:

我现在正在做的是:

  • ssh username@server
  • tmux
  • python3 run_my_tests.py -> 这个脚本做了一堆subprocess.check_output其他脚本,这些脚本本身会启动一些 Java 进程。
  • 测试运行良好。
  • 我使用 Ctrl+B、D 并分离会话。
  • 这样做时,tmux attach我重新获得仍然运行良好的 tmux 会话,没有任何错误。我一直检查这个几分钟,测试运行良好。
  • 我关闭了 ssh 会话

在此之后,如果我通过 SSH 登录到服务器,我确实能够重新连接到正在运行的tmux会话,但是我看到的是:

Traceback (most recent call last):
  File "run_my_examples.py", line 70, in <module>
  File "run_my_examples.py", line 62, in run_cmd_aggr
  File "run_my_examples.py", line 41, in run_cmd
  File "/usr/lib64/python3.4/subprocess.py", line 537, in call
    with Popen(*popenargs, **kwargs) as p:
  File "/usr/lib64/python3.4/subprocess.py", line 858, in __init__
    restore_signals, start_new_session)
  File "/usr/lib64/python3.4/subprocess.py", line 1456, in _execute_child
    raise child_exception_type(errno_num, err_msg)
PermissionError: [Errno 13] Permission denied
Run Code Online (Sandbox Code Playgroud)

即在SSH 会话结束后产生我的运行测试的进程完全无法产生其他子进程。我已经chmod编辑了所有涉及的文件的权限,但没有任何变化。

我相信服务器使用 Kerberos 进行登录/权限,服务器是 Scientific Linux 7.2。

当我从 ssh 会话注销时,是否有可能删除生成新进程的权限?有什么我可以做的吗?我必须启动几个测试,不知道它们需要多少时间或空间......


  • 版本systemd是219
  • 文件系统是 AFS,使用fs listacl <name>我可以确认我对脚本使用的目录/文件有权限。

Bak*_*riu 8

感谢Mark Plotnick,我能够识别并解决这个问题。

问题在于服务器使用的AFS 文件系统与处理身份验证的 Kerberos之间的交互。在关于 SO 的这个问题中提出了同样的问题。

基本上发生的事情是,当我通过 ssh 进入服务器时,Kerberos 将身份验证令牌提供给会话。此令牌还用于访问 AFS 文件系统。关闭 SSH 会话时,此令牌会被破坏,并且正在运行的进程在尝试访问 AFS 上的文件时开始出现权限被拒绝错误。

解决这个问题的方法是在screen/ 中启动一个新窗口tmux并启动命令:

kinit && aklog
Run Code Online (Sandbox Code Playgroud)

之后,您可以从screen/分离tmux并安全地关闭 ssh 会话。

上面的命令创建新的 Kerberos 令牌并将它们与screen/tmux会话相关联,这样当 ssh 连接关闭时,初始令牌将被撤销,但由于子进程现在使用您创建的那些,它们不会遭受权限被拒绝的错误。


总结一下:

  • ssh username@server
  • tmux
  • 启动您需要继续运行的进程
  • 创建一个新窗口 Ctrl+B, C
  • kinit && aklog
  • 从会话中分离 Ctrl+B, D
  • 关闭 ssh 会话