从Java程序写入终端
我想写一个java程序,打开在每个终端“cd go/to/a/specitic/folder”中执行的一些终端。(我不想执行批处理/脚本/shell文件。) 如果这些可以是平台独立的,那就太好了。目前我正在使用mac电脑 我在网上搜索了hole weekend,并用netbeans进行了x次尝试,但没有得到积极的结果。一次近距离的尝试,我发现就在这里 我尝试过的最好的代码是:从Java程序写入终端,java,bash,shell,terminal,Java,Bash,Shell,Terminal,我想写一个java程序,打开在每个终端“cd go/to/a/specitic/folder”中执行的一些终端。(我不想执行批处理/脚本/shell文件。) 如果这些可以是平台独立的,那就太好了。目前我正在使用mac电脑 我在网上搜索了hole weekend,并用netbeans进行了x次尝试,但没有得到积极的结果。一次近距离的尝试,我发现就在这里 我尝试过的最好的代码是: public class NewClass1 { public static void main(String[] a
public class NewClass1 {
public static void main(String[] args) {
try {
Desktop.getDesktop().open(new File("/Applications/Utilities/Terminal.app"));
} catch (IOException ex) {
Logger.getLogger(StartDevelop.class.getName()).log(Level.SEVERE, null, ex);
}
// opens a terminal but no comments / parameters could be used
}
}
另一种尝试是通过以下方式更改主要部分中的所有代码:
ProcessBuilder builder = new ProcessBuilder(
"/Applications/Utilities/Terminal.app/Contents/MacOS/Terminal");
builder.redirectErrorStream(true);
try {
String command = "ls -lai";
Process process = builder.start();
BufferedReader read = new BufferedReader(new InputStreamReader(
process.getInputStream()));
String s;
while ((s = read.readLine()) != null) {
System.out.println(s);
}
} catch (Exception e1) {
// TODO Auto-generated catch block
System.out.println(e1);
}
//open a terminal but command is executed in terminal
还有另一种选择:
try {
String command = "ls -lai";
Process process = Runtime.getRuntime().exec(command);
BufferedReader read = new BufferedReader(new InputStreamReader(process.getInputStream()));
String s;
while ((s = read.readLine()) != null) {
System.out.println(s);
}
} catch (IOException e1) {
// TODO Auto-generated catch block
System.out.println(e1);
}
// works with output in netbeans
// but no terminal is opening
我还尝试使用Outputwriter:
BufferedWriter outWrite = new BufferedWriter(
new OutputStreamWriter(process.getOutputStream(), command));
outWrite.flush();
outWrite.newLine();
但没有效果
提前谢谢。简短回答:你不能 详细回答:问题是,即使您成功地调用了您的终端,您也需要知道中每个终端的tty,这意味着您需要知道它的stdin是什么。。。前提是操作系统没有做一些奇怪的机制,使得终端甚至不用文件描述符0、1和2来表示stdin、stdout和stderr 即使你能做到这一点,你也需要能够给tty写信。Cupido 您需要“SSHforJava” 试一试 它提供的服务甚至超过您的需要。
以下是其他Java SSH库的列表
htp://linuxmafia.com/SSH/Java.html。
我建议使用Ganymed SSH,因为它被广泛使用,并且是在BSD许可下使用的(您不必开放源代码)。
也许您希望更好地控制登录/密码信息。在Java代码中硬编码登录名和密码是个坏主意,原因有两个:
-密码不应以明文形式存储(获取您的程序的每个人都可以访问您的服务器。即使编译的Java类也将包含用于登录和密码的清晰字符串。这不是您想要的)
-如果密码已更改,则不希望更改Java程序
您可以在要连接的主机上生成密钥对,然后交换密钥。更多关于这个 . 因此,不会询问您配置的主机的登录名和密码
祝你好运。如果你不需要交互访问终端窗口,你可以动态创建一个shell脚本并使用xterm来运行脚本 例如:
xterm -e path-to-script.sh
要在执行后保持应用程序打开,请使用-hold
选项
最简单的例子:
echo "echo hello;/bin/bash" > /tmp/tmp123.sh; chmod +x /tmp/tmp123.sh;xterm -hold -e /tmp/tmp123.sh
为完整起见,这是在Windows上执行的方法(用您要执行的命令替换echo hello
):
要在执行后保持窗口打开,请使用
/K
选项,而不是/C
@同上,可能是为了销毁操作系统或访问机器?它已经是操作系统特定的了--为什么要在Java中这么做?写一个批处理文件,写一个shell文件。@Kowser,你为什么这么认为?我可以想出几个非恶意的答案来回答我的问题。我使用一些控制台工作,但在重新启动后,我需要启动并转到它们的手册目录。所以我想我可以写一个小小的java文件,让它自动变得简单,不要太认真。是的,任何电源都可以用于好/坏。。。所以肯定也会有很好的用途
start cmd /C echo hello