Запись в терминал из программы Java - PullRequest
0 голосов
/ 18 декабря 2011

Я хотел написать Java-программу, которая открывает некоторые терминалы, которые выполняются в каждом терминале "cd go / to / a / specitic / folder". (Я не хочу выполнять пакетный / скрипт / файл оболочки.)

Было бы здорово, если бы они могли быть независимыми от платформы. В настоящее время я работаю с Mac.

Я искал в Интернете дырочные выходные и делал x попыток с netbeans, но положительного результата не было. Одна близкая попытка, которую я нашел, была здесь http://www.coderanch.com/t/532229/java/java/Writing-terminal-Java-program.

Лучшие коды, которые я пробовал, были:

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();

но без эффекта.

Заранее спасибо.

Ответы [ 3 ]

1 голос
/ 19 декабря 2011

Cupido,

вам нужен "SSH для Java".

Попробуйте Ganymed SSH-2 для Java

Это обеспечивает еще большечем вам нужно.

Вот список других библиотек Java SSH
http://linuxmafia.com/ssh/java.html.

Я быпредложите Ganymed SSH, потому что он широко используется и под лицензией BSD (вам не нужно открывать исходный код).

Возможно, вы захотите улучшить контроль над информацией логина / пароля.Это плохая идея жестко кодировать логины и пароли в коде Java по двум причинам:
- пароли не должны храниться в виде открытого текста (каждый, кто получает вашу программу, получает доступ к вашим серверам. Даже скомпилированные классы Java будут содержать ясныестроки для логина и пароля. Это не то, что вам нужно)
- вы не хотите менять свою программу Java, если пароли были изменены

Вы можете генерировать пары ключей на хостах, где выхотите подключиться, затем обменяйтесь ключами.Подробнее об этом здесь .В результате у вас не спросят логин и пароли для настроенных вами хостов.

Удачи.

0 голосов
/ 28 мая 2013

Если вам не нужен интерактивный доступ к окну терминала, вы можете динамически создать сценарий оболочки и использовать 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 командамихотите выполнить):

start cmd /C echo hello

Чтобы оставить окно открытым после выполнения, используйте параметр /K вместо /C.

0 голосов
/ 18 декабря 2011

Краткий ответ: вы не можете.

Длинный ответ: проблема в том, что даже если вы успешно вызвали свои терминалы, вам нужно будет знать, что такое tty для каждого из этих терминалов, что означаетвам нужно знать, что это за стандартный stdin ... При условии, что ОС не выполняет какой-то странной механики, которая делает так, что терминалы даже не используют файловые дескрипторы 0, 1 и 2 для stdin, stdout и stderr.

И даже если бы вы могли это сделать, вам все равно нужно было бы писать в tty.

...