Bak*_*riu 6 ssh permissions tmux afs kerberos
我必须在大学的服务器上运行一些测试。我可以从办公室的桌面 ssh 访问服务器。我想在服务器上启动一个 python 脚本,该脚本将在周末运行多个测试。
办公室的桌面将在周末进入待机状态,因此即使 SSH 会话终止,该进程也必须继续在服务器上运行。
我知道nohup
和screen
和tmux
,在这样的问题描述:
我现在正在做的是:
ssh username@server
tmux
python3 run_my_tests.py
-> 这个脚本做了一堆subprocess.check_output
其他脚本,这些脚本本身会启动一些 Java 进程。tmux attach
我重新获得仍然运行良好的 tmux 会话,没有任何错误。我一直检查这个几分钟,测试运行良好。在此之后,如果我通过 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
是219fs listacl <name>
我可以确认我对脚本使用的目录/文件有权限。感谢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
kinit && aklog