Java中向外部进程发送控制字符

Java中向外部进程发送控制字符,java,process,ctrl,Java,Process,Ctrl,我使用以下方式连接到ubuntu中的/bin/bash: process = Runtime.getRuntime().exec(cmd); 这里的cmd是一个字符串,包含我从进程中读取和写入的不同命令。 现在我遇到了一种情况,我使用ssh登录到远程机器,在向ext进程读写信息时,为了从远程机器注销,我必须发送如下控制字符: CTRL+]以优雅地注销会话并返回到我的本地计算机。假设cmd是字符串类型,如何将此CTRL-chracter写入进程?Control-]在ASCII中相当于035八进制

我使用以下方式连接到ubuntu中的/bin/bash:

process = Runtime.getRuntime().exec(cmd);
这里的cmd是一个字符串,包含我从进程中读取和写入的不同命令。 现在我遇到了一种情况,我使用ssh登录到远程机器,在向ext进程读写信息时,为了从远程机器注销,我必须发送如下控制字符:


CTRL+]以优雅地注销会话并返回到我的本地计算机。假设cmd是字符串类型,如何将此CTRL-chracter写入进程?

Control-]在ASCII中相当于035八进制。在Java中,可以将其表示为\035

Writer writer = new OutputStreamWriter(process.getOutputStream());
writer.write("\035");
writer.flush();
它也相当于十进制值29,所以如果你可以写一个值为29的字节,那么它也可以工作

OutputStream os = process.getOutputStream();
os.write(29);
os.flush();
我认为控制-]与远程程序有关。你说的是telnet?但是,写入退出\n也将关闭远程bash

Writer writer = new OutputStreamWriter(process.getOutputStream());
writer.write("exit\n");
writer.flush();
显然,您还可以关闭OutputStream,从而关闭远程进程的STDIN

os.close();

ASCII中的控件-]相当于035八进制。在Java中,可以将其表示为\035

Writer writer = new OutputStreamWriter(process.getOutputStream());
writer.write("\035");
writer.flush();
它也相当于十进制值29,所以如果你可以写一个值为29的字节,那么它也可以工作

OutputStream os = process.getOutputStream();
os.write(29);
os.flush();
我认为控制-]与远程程序有关。你说的是telnet?但是,写入退出\n也将关闭远程bash

Writer writer = new OutputStreamWriter(process.getOutputStream());
writer.write("exit\n");
writer.flush();
显然,您还可以关闭OutputStream,从而关闭远程进程的STDIN

os.close();

实际上,在xen虚拟机上,它是CTRL+],但无论哪种方式,我都对CTRLDid感兴趣,您是否尝试发送CTRL 17,然后再发送]93?我的意思是只需将这些整数写入进程的输入流?@AlexR,是的,谢谢,它会起作用,我想在发送代码之前需要一些特殊的编码,但结果非常简单。实际上在xen虚拟机上,它是CTRL+],但无论哪种方式,我都对CTRLDid感兴趣。您是否尝试发送CTRL 17,然后]93?我的意思是只需将这些整数写入进程的输入流?@AlexR,是的,谢谢,它会起作用,我想在发送代码之前需要一些特殊的编码,但结果非常简单。谢谢你,作者。write\035很有魅力,但十进制不起作用。但无论如何,它解决了问题。实际上,我正在ssh’ing一台运行在另一台机器上的虚拟机,为了返回原始提示,我需要这个CTR+],因为退出在这里不起作用。谢谢你,作者。write\035非常有效,但是小数点不起作用。但无论如何,它解决了问题。实际上,我正在ssh一台运行在另一台机器上的虚拟机,为了返回原始提示符,我需要这个CTR+],因为退出在这里不起作用。