如何在不终止正在运行的进程的情况下分离 ssh 会话?

如何在不终止正在运行的进程的情况下分离 ssh 会话?

我通过 ssh 在服务器上启动了测试文件系统大小调整,但完全忘记在会话中执行此操作screen。现在它正在运行,而我的笔记本电脑的互联网速度非常慢。如果我丢失了 ssh 连接,有什么方法可以让它继续运行?

它还输出进度,但我不必关心获取进度。

操作系统:RHEL7.2 同等版本 (SL7)。

将其链接为解决方案可能更好:https://stackoverflow.com/questions/625409/how-do-i-put-an-already-running-process-under-nohup

不知道如何链接该链接而不是建议的链接,所以请随意添加并标记为重复

答案1

使用reptyr

事实确实如此man 1 reptyr明确提到:

reptyr是一个实用程序,用于获取正在运行的现有程序并将其附加到新终端。通过 ssh 启动了一个长时间运行的进程,但必须离开并且不想中断它?只需启动一个screen,使用reptyr来获取它,然后终止 ssh 会话并返回主页。

(手册中提到screen,您可以tmux根据自己的喜好使用)。

请不要错过以下提示:

reptyr取决于ptrace(2)附加到远程程序的系统调用。在 Ubuntu Maverick 及更高版本中,出于安全原因,此功能默认被禁用。您可以通过执行以下操作暂时启用它

echo 0 > /proc/sys/kernel/yama/ptrace_scope

以 root 身份进行设置,或者通过编辑文件来永久更改/etc/sysctl.d/10-ptrace.conf,该文件还包含有关此设置的更多信息。

如果文件不存在但/etc/sysctl.d/目录存在,那么使用以下内容创建它就足够了:

kernel.yama.ptrace_scope = 0

该设置将在下次重启时应用。请参阅下面的安全注意事项。


基本用法

基本用法很简单:

reptyr PID

其中PID是要附加到新终端的进程的 PID。注意,reptyr这只会将进程附加到另一个终端。这并不意味着该进程成为新 shell 的子进程。


安全注意事项

不建议设置ptrace_scope为。0

随着 Linux 越来越受欢迎,它将成为恶意软件的更大目标。Linux 进程接口的一个特别令人不安的弱点是单个用户能够检查其任何进程的内存和运行状态。例如,如果一个应用程序(例如 Pidgin)受到攻击,攻击者就有可能附加到其他正在运行的进程(例如 Firefox、SSH 会话、GPG 代理等)以提取其他凭据并继续扩大攻击范围,而无需诉诸用户协助的网络钓鱼。

这不是一个理论问题。SSH 会话劫持(http://www.storm.net.nz/projects/7) 和任意代码注入(http://c-skills.blogspot.com/2007/05/injectso.htmlptrace) 攻击已经存在,如果允许像以前一样运行,攻击仍然可能存在。由于ptrace非开发人员和非管理员不常用,因此系统构建者应该被允许选择禁用此调试系统。

[…]

sysctl 设置(仅可使用 写入CAP_SYS_PTRACE)包括:

0- 经典ptrace权限:一个进程可以PTRACE_ATTACH访问在同一个 uid 下运行的任何其他进程,只要它是可转储的 […]

1- 受限ptrace:进程必须与其想要调用的下级进程具有预定义的关系PTRACE_ATTACH。默认情况下,当上述经典标准也得到满足时,此关系仅是其后代的关系。[…]

2- 仅限管理员连接:只有具有 的进程CAP_SYS_PTRACE可以使用ptracePTRACE_ATTACH或者通过调用 的子进程使用PTRACE_TRACEME

3- 无附加:任何进程都不能使用ptracePTRACE_ATTACH通过PTRACE_TRACEME。一旦设置,此 sysctl 值就无法更改。

来源

合理的方法是设置ptrace_scope2,然后允许reptyr使用ptrace

echo 2 | sudo tee /proc/sys/kernel/yama/ptrace_scope
sudo setcap CAP_SYS_PTRACE+pe /usr/bin/reptyr

不要忘记保存永久设置的文件。

存储能力在文件的 inode 中reptyr。因此,如果它在更新时(自动被新的可执行文件替换)失去功能,我不会感到惊讶。

答案2

使用

Ctrl-Z

暂停应用程序并返回命令行。然后使用

bg

允许进程在后台继续。最后使用

disown

这样,当您断开会话并关闭终端时,该进程就不会关闭。

该过程将继续运行,但如果您重新连接到新会话,就无法“重新连接”到终端来查看我所知道的输出。

答案3

您可以完全取消命令与命令的关联(在bash或中zsh,也可能在其他 shell 中)disown。但是,如果命令需要 tty,则可能对此不满意,在这种情况下请参阅答案reptyr

$ ssh somecentos7system
-bash-4.2$ sleep 252727
^Z
[1]+  Stopped                 sleep 252727
-bash-4.2$ bg
[1]+ sleep 252727 &
-bash-4.2$ disown
-bash-4.2$ logout
Connection to somecentos7system closed.
$ ssh somecentos7system
-bash-4.2$ pgrep -lf 252727
20089 sleep
-bash-4.2$ 

另一个选项是让屏幕(或 tmux)会话自动启动,这样您就不会忘记启动一个会话,因为您这样设置后,一个会话已经为您启动了。其他地方还有其他关于如何做到这一点的帖子。

答案4

您可以通过以下方式进行screen

screen -S ssh -dm bash -c 'sshpass -p <your_ssh_pass> ssh [email protected] -p 2222'

相关内容