我无法使用getOutputStream与流程进行交互。这是我的代码:
Process p = null;
ProcessBuilder pb = new ProcessBuilder("/home/eric/this.sh");
pb.directory(new File("/home/eric/"));
p = pb.start();
InputStream in = null;
OutputStream outS = null;
StringBuffer commandResult = new StringBuffer();
String line = null;
int readInt;
int returnVal = p.waitFor();
in = p.getInputStream();
while ((readInt = in.read()) != -1)
commandResult.append((char)readInt);
outS = (BufferedOutputStream) p.getOutputStream();
outS.write("Y".getBytes());
outS.close();
System.out.println(commandResult.toString());
in.close();
这是输出:
Reading package lists...
Building dependency tree...
Reading state information...
The following packages were automatically installed and are no longer required:
libmono2.0-cil libmono-data-tds2.0-cil libmono-system-data2.0-cil
libdbus-glib1.0-cil librsvg2-2.18-cil libvncserver0 libsqlite0
libmono-messaging2.0-cil libmono-system-messaging2.0-cil
libmono-system-data-linq2.0-cil libmono-sqlite2.0-cil
libmono-system-web2.0-cil libwnck2.20-cil libgnome-keyring1.0-cil
libdbus1.0-cil libmono-wcf3.0-cil libgdiplus libgnomedesktop2.20-cil
Use 'apt-get autoremove' to remove them.
The following extra packages will be installed:
firefox-globalmenu
Suggested packages:
firefox-gnome-support firefox-kde-support latex-xft-fonts
The following NEW packages will be installed:
firefox firefox-globalmenu
0 upgraded, 2 newly installed, 0 to remove and 5 not upgraded.
Need to get 15.2 MB of archives.
After this operation, 30.6 MB of additional disk space will be used.
Do you want to continue [Y/n]? Abort
this.sh只运行“gksudo apt-get install firefox”
我不知道为什么它正在中止而不是我的输入“Y”谢谢。
答案 0 :(得分:1)
有几个问题。
首先:gksudo(1)
使用它启动的命令的标准输入和标准输出执行一些脏的,非标准的技巧。它失败了。一个很好的例子就是这个命令行:
$ echo foo | gksudo -g cat
cat
一旦传递了数据,我就会期待任何输出和echo
的终止。不。 gksudo
和cat
都会永远存在。没有输出。
你的用例是
echo y |gksudo apt-get install ....
这也行不通。只要没有解决这个问题,如果启动的程序需要任何用户输入,您就可以忘记进行任何远程控制。
第二次:正如Roger waitFor()
已经指出的那样,等待命令的终止。如果没有任何用户输入和gksudo问题,这不会很快发生。
第三次稍微推迟waitFor
之后会有下一个阻止程序:您等待该进程的完整输出,直至并包括EOF。这不会很快发生(见“第一”和“第二”)。
第四只有在该过程已经死了两次之后(请参阅“第二个”和“第三个”),它可能会得到一些输入 - 您的Y
(可能还需要一个额外的{{ 1}})。
不是解决这一系列问题,而是可能有更好更简单的方法:不要试图用标准输入来控制\n
。只需给它一些适当的选项,自动“回答”你的问题。快速apt-get install
出现了一些候选人:
man apt-get
有关详细信息,请参阅手册。
我认为这是更好,更稳定的方式。
PS:现在我非常感谢-y, --yes, --assume-yes
--force-yes
--trivial-only
--no-remove
--no-upgrade
,所以原谅上面的咆哮。