You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Docker容器内获取Eclipse控制台访问权限并实现命令自动化执行?

解决Java启动Docker容器后Telnet命令无法自动执行的问题

你的问题核心在于:当telnet启动后进入了交互式会话,bash脚本里后续的testcommand并没有被发送到telnet的会话中,而是要等telnet退出后才会执行——这就是为什么手动在Eclipse控制台输入能生效,但脚本自动化不行的原因。

下面给你两种可行的解决方案:

方案一:用Bash的Here-Document给Telnet传命令

修改你的createTempScript方法,把telnet命令和要执行的指令用here-doc包裹,这样telnet启动后会自动读取并执行这些命令:

public File createTempScript() throws IOException {
    File tempScript = File.createTempFile("script", null);
    try (PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(new FileOutputStream(tempScript)))) {
        printWriter.println("#!/bin/bash");
        printWriter.println("echo test1234| sudo -S pwd");
        // 用here-doc把命令传给telnet
        printWriter.println("sudo docker exec -i MyconteinerID sh -c 'telnet localhost 2000 << EOF");
        printWriter.println("testcommand");
        printWriter.println("quit"); // 根据telnet的退出命令调整,有些环境用ctrl+]再quit,这里直接quit试试
        printWriter.println("EOF'");
    }
    return tempScript;
}

这里的<< EOF和EOF是bash的here-doc语法,它会把中间的内容作为输入传给telnet进程,相当于你手动在控制台输入这些命令。

方案二:Java直接操控Process的输入流(更灵活)

放弃临时bash脚本,直接在Java代码中控制docker exec进程的输入流,把命令直接写入telnet的会话中,这样能更精准地控制命令发送时机:

import java.io.IOException;
import java.io.OutputStream;
import java.nio.charset.StandardCharsets;

public void executeCommands() throws IOException, InterruptedException {
    // 处理sudo密码:先执行sudo命令获取权限(避免后续docker exec需要密码)
    ProcessBuilder sudoPb = new ProcessBuilder("bash", "-c", "echo test1234| sudo -S pwd");
    sudoPb.inheritIO();
    Process sudoProcess = sudoPb.start();
    sudoProcess.waitFor();

    // 启动docker exec + telnet进程
    ProcessBuilder pb = new ProcessBuilder("sudo", "docker", "exec", "-i", "MyconteinerID", "telnet", "localhost", "2000");
    pb.inheritIO(); // 继承标准输出/错误,方便查看telnet的输出
    Process process = pb.start();

    // 获取进程的输出流,用来向telnet发送命令
    try (OutputStream os = process.getOutputStream()) {
        // 发送你的测试命令,注意要加换行符模拟回车
        os.write("testcommand\n".getBytes(StandardCharsets.UTF_8));
        os.flush();

        // 发送telnet退出命令,确保进程能正常结束
        os.write("quit\n".getBytes(StandardCharsets.UTF_8));
        os.flush();
    }

    // 等待进程结束
    process.waitFor();
}

关键补充说明

  • sudo权限优化:如果不想每次都输入密码,建议给当前用户配置免sudo执行docker的权限,执行sudo usermod -aG docker $USER,然后重启终端或重新登录,这样可以去掉代码里的sudo密码处理,更安全。
  • Telnet退出命令:不同环境下telnet的退出命令可能不同,如果quit不生效,可以试试先发送\u001d(对应Ctrl+]),再发送quit\n。

内容的提问来源于stack exchange,提问作者Kamil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 04:32:35