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

xco*_*rat 9 linux ssh gnu-screen

我通过 ssh 在服务器上启动了一个测试文件系统调整大小,但完全忘记在screen会话中这样做。现在它正在运行,我的笔记本电脑的互联网速度很慢。如果我断开 ssh 连接,有什么办法可以让它继续运行吗?

它也输出进度,但我不必关心得到它。

操作系统:RHEL7.2 等效 (SL7)。

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

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

小智 11

Ctrl-Z
Run Code Online (Sandbox Code Playgroud)

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

bg
Run Code Online (Sandbox Code Playgroud)

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

disown
Run Code Online (Sandbox Code Playgroud)

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

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


Kam*_*ski 8

reptyr

这正是man 1 reptyr明确提到的情况:

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

(手册中提到screen,您可以tmux改用,无论您喜欢哪个)。

不要错过这个注意事项:

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

echo 0 > /proc/sys/kernel/yama/ptrace_scope
Run Code Online (Sandbox Code Playgroud)

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

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

kernel.yama.ptrace_scope = 0
Run Code Online (Sandbox Code Playgroud)

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


基本用法

基本用法很简单:

reptyr PID
Run Code Online (Sandbox Code Playgroud)

PID您要附加到新终端的进程的 PID在哪里。注意reptyr只将一个进程附加到另一个终端。这并不意味着该进程成为新 shell 的子进程。


安全考虑

不推荐设置ptrace_scope0

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

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

[…]

sysctl 设置(只能用 写CAP_SYS_PTRACE)是:

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

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

2- 仅限管理员附加:只有进程CAP_SYS_PTRACE可以使用ptracewith PTRACE_ATTACH,或通过调用 的子进程PTRACE_TRACEME

3- 无附加:任何进程都不能使用ptracewithPTRACE_ATTACH或 via 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
Run Code Online (Sandbox Code Playgroud)

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

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