【问题标题】:Java persistent reverse SSH processJava 持久化反向 SSH 进程
【发布时间】:2021-03-29 08:23:15
【问题描述】:

我正在开发一个应用程序,它通过Runtime.getRuntime().exec(String[]) 创建一个进程并在 Linux 中打开一个反向 ssh 隧道。即使 java 进程被杀死,我也希望这条隧道能够持续存在。

我阅读了Runtime.getRuntime().exec(String[]) 的文档,它指定该命令在单独的进程中执行:

在单独的进程中执行指定的命令和参数。

尽管当运行 java 可执行文件的服务停止时:

systemctl stop myapp

自动关闭所有活动的反向 SSH 隧道:

Connection to localhost closed.

创建新进程的代码如下:

List<String> command = new ArrayList<>(Arrays.asList(
    "/usr/bin/sshpass", "-p", request.getHostPassword(),
    "ssh", "-f", "-N", "-M", "-S", "/tmp/socket" + request.getHostUser() + request.getHostIp(),
    "-p", String.valueOf(request.getHostSshPort()), request.getHostUser() + "@" + request.getHostIp()
));
for (SSHPortMapping mapping: request.getPortMappings()) {
    command.add("-R");
    command.add(mapping.getPretty());
}
command.add("-o");
command.add("StrictHostKeyChecking=no");
Process process = Runtime.getRuntime().exec(command.toArray(new String[0]));
int result = process.waitFor();
...

如何在java中实现一个在服务停止时不会关闭所有反向ssh连接的持久进程?

【问题讨论】:

    标签: java process


    【解决方案1】:

    从命令和它们的语法来看,我将假设一个类 Unix 系统。

    Runtime.getRuntime().exec 开头的命令确实在单独的进程中执行,但是当服务停止时,所有当前子进程通常都会被杀死。一种使用中间启动器进程的简单方法。

    如果是一个选项,您可以使用一个小的 shell 脚本来获取相关参数,启动 ssh 命令,并立即存在而无需等待其子级。从那时起,没有直接父进程的ssh 进程被init 进程(PID 1)直接采用,并且不再是Java 应用程序进程组的成员。因此,当您停止运行 java 可执行文件的服务时,它们不应再被杀死。

    【讨论】:

    • 您好,感谢您的快速回复。我在/root/reverse.sh 中创建了一个脚本,它将在进程内创建一个子shell 并执行反向ssh 命令:(sshpass -p password ssh .....)。然后在 java 代码上,我只需调用Runtime.getRuntime.exec("/bin/bash /root/reverse.sh")。然后我用ps -aux 得到进程PID,得到PID 1640。最后我得到PID 树:pstree -sg 1640 输出:systemd(1)───ssh(1640)。所以这验证了 SSH 进程归systemd(1) 所有。尽管如此,当我停止服务时,进程被终止。有什么想法吗?
    • @PauMAVA:我已经好几年没有这样编程了,所以我不确定。我认为最近的 Linux 版本有一个进程组概念,它不仅仅像我在 80 年代使用的那样与 PPID 相关联......如果你在这里没有答案,你可以尝试在 Unix&Linux 或 ServerFault 上提问
    • 好的,我会在那里询问回复,因为这是一个 PID 问题,我猜它更适合那里。我会赞成你的回答,因为它引导我朝着正确的方向前进。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-22
    • 2021-03-03
    • 2016-06-10
    • 1970-01-01
    • 2021-03-30
    • 2011-02-24
    相关资源
    最近更新 更多