Использование sshpass с bash работает из командной строки, а не из java exec - PullRequest
1 голос
/ 14 февраля 2012

У меня есть скрипт bash, который использует sshpass и ssh для автоматического входа на другую машину и запуска команды.Скрипт bash работает хорошо, когда запускается из командной строки, но когда он вызывается из Java-приложения, он не может продолжить работу.

sshpass -p 'password' ssh user@XXX.XXX.XXX.XXX './SleepDisplay && exit'

Сценарий bash делает много других вещей, и у меня нет способа реализовать логин ssh напрямую в Java.Кажется, я не могу понять, почему это не удалось.Все, кроме ssh, работает хорошо.

Ответы [ 3 ]

1 голос
/ 15 февраля 2012

Сначала откройте оболочку и выполните команду. Попробуйте что-то вроде следующего:

 String COMMAND = "sshpass -p 'password' ssh user@XXX.XXX.XXX.XXX './SleepDisplay && exit'";
 String[] SHELL_COMMAND = { "/bin/sh", "-c", COMMAND };
 ...
 Runtime runtime = Runtime.getRuntime();
 Process process = runtime.exec(SHELL_COMMAND);

Надеюсь, я мог бы дать вам полезную подсказку.

1 голос
/ 15 февраля 2012

При выполнении команд через Runtime.exec(), первый элемент является исполняемым , затем все остальные параметры передаются отдельно в остальной части массива.

Но вы (вероятно) передаете команду whole linux как исполняемый файл, который не работает.

Попробуйте это:

String[] cmdarray = {"sshpass", "-p", "'password'", "ssh", "user@XXX.XXX.XXX.XXX", "'./SleepDisplay && exit'"};
Runtime.getRuntime().exec(cmdarray);
0 голосов
/ 15 февраля 2012

Вы можете попробовать использовать java-библиотеку ganymed-ssh2, это позволит вам выполнять и выполнять сценарии оболочки и так далее, используя java ... Ниже приведен пример использования этой библиотеки:

{
    String hostname = "127.0.0.1";
    String username = "joe";
    String password = "joespass";

    try
    {
        /* Create a connection instance */

        Connection conn = new Connection(hostname);

        /* Now connect */

        conn.connect();

        /* Authenticate.
         * If you get an IOException saying something like
         * "Authentication method password not supported by the server at this stage."
         * then please check the FAQ.
         */

        boolean isAuthenticated = conn.authenticateWithPassword(username, password);

        if (isAuthenticated == false)
            throw new IOException("Authentication failed.");

        /* Create a session */

        Session sess = conn.openSession();

                    // here execute which command separate for ";" 
        sess.execCommand("uname -a && date && uptime && who");

        System.out.println("Here is some information about the remote host:");

        /* 
         * This basic example does not handle stderr, which is sometimes dangerous
         * (please read the FAQ).
         */

        InputStream stdout = new StreamGobbler(sess.getStdout());

        BufferedReader br = new BufferedReader(new InputStreamReader(stdout));

        while (true)
        {
            String line = br.readLine();
            if (line == null)
                break;
            System.out.println(line);
        }

        /* Show exit status, if available (otherwise "null") */

        System.out.println("ExitCode: " + sess.getExitStatus());

        /* Close this session */

        sess.close();

        /* Close the connection */

        conn.close();

    }
    catch (IOException e)
    {
        e.printStackTrace(System.err);
        System.exit(2);
    }
}
...