如何在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
相关产品推荐
相关产品推荐

