Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Java程序写入终端_Java_Bash_Shell_Terminal - Fatal编程技术网

从Java程序写入终端

从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

我想写一个java程序,打开在每个终端“cd go/to/a/specitic/folder”中执行的一些终端。(我不想执行批处理/脚本/shell文件。)

如果这些可以是平台独立的,那就太好了。目前我正在使用mac电脑

我在网上搜索了hole weekend,并用netbeans进行了x次尝试,但没有得到积极的结果。一次近距离的尝试,我发现就在这里

我尝试过的最好的代码是:

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