【发布时间】: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连接的持久进程?
【问题讨论】: