Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Что должен возвращать сервер при выполнении shell скрипта, используя библиотеку jsch? / 16 сообщений из 16, страница 1 из 1
31.10.2014, 18:54
    #38793345
mr_virtus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что должен возвращать сервер при выполнении shell скрипта, используя библиотеку jsch?
Привет! Подскажите, пожалуйста,

Я подключаюсь к серверу через ssh и хочу выполнить shell скрипт.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
public void executeShellCommand(String shellCommand) {
        try {
            ChannelExec channelExecutable = (ChannelExec) session.openChannel("exec");
            channelExecutable.setCommand(shellCommand);
            channelExecutable.connect();
            logSSHOutput(channelExecutable);
            channelExecutable.disconnect();
        } catch(Exception e) {
            e.printStackTrace();
        }
    }



методы, выполняющие чтение ответа от сервера:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
private void logSSHOutput(ChannelExec channelExecutable) throws IOException, InterruptedException {
        if (!channelExecutable.isClosed()) {
            // waiting for response
            // timeout is 3 minutes
            for (int i = 0; i < 180; i++) {
                if (channelExecutable.isClosed()) {
                    break;
                }
                // sleep for 1 second
                Thread.sleep(1000);
            }
        }

        int exitCode = channelExecutable.getExitStatus();
        String out = readAll(channelExecutable.getInputStream());
        System.out.println(out);

        if (exitCode != 0) {
            String err = readAll(channelExecutable.getErrStream());
        }
    }

    private String readAll(InputStream in) throws IOException {
        InputStreamReader reader = new InputStreamReader(in);
        StringWriter writer = new StringWriter();

        while (in.available() > 0) {
            int c = reader.read();
            if (c == -1) {
                break;
            }
            writer.write(c);
        }
        reader.close();
        return writer.toString();
    }



условие in.available() > 0 оказывается ложным.

Что должен возвращать сервер при выполении shell скрипта?
Я хочу видеть обратную связь, как выполнился скрипт. Не знаю, имеет ли смысл возвращать все что скрипт выводит в консоль.

Спасибо.
...
Рейтинг: 0 / 0
31.10.2014, 19:50
    #38793363
YamahaR1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что должен возвращать сервер при выполнении shell скрипта, используя библиотеку jsch?
mr_virtus,

Для выполения shell скриптов лучше используйте session.openChannel("shell") вместо session.openChannel("exec"), плюс у вас появляется возможность выполнять множество channel в рамках одной сессии. У меня шелл выполняется так:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
  public String runNexusCommandViaSSH(String command) throws Exception {
        StringBuilder sb = new StringBuilder();
       /* List<String> results = new ArrayList<String>();
        StringBuilder sb = new StringBuilder();

        java.util.Properties config = new java.util.Properties();
        config.put("StrictHostKeyChecking", "no");

        JSch jsch = new JSch();

        Session session = jsch.getSession("usr", "host", 22);

        session.setPassword("pwd");
        session.setConfig(config);
        //session.setTimeout(10000);
        session.connect();*/
        System.out.println("we are in nexus command");
        Channel channel = session.openChannel("shell");
        System.out.println("we have got channel object");

        //channel.setInputStream(null);
        //channel.setOutputStream(null);

        InputStream in = channel.getInputStream();
        OutputStream out = channel.getOutputStream();

        ((ChannelShell) channel).setPty(false);
        channel.connect();

        byte[] tmp = new byte[1024];

        //out.write((command + ";exit").getBytes());
        out.write((command).getBytes());
        out.write(("exit").getBytes());
        out.write(("\n").getBytes());
        out.flush();
        System.out.println("enter command to output stream");
        Thread.sleep(1000);
        while (true) {
            while (in.available() > 0 ) {
                System.out.println("Some info available for us");
                int i = in.read(tmp, 0, 1024);
                if (i < 0) {
                    break;
                }
                String buffer = new String(tmp, 0, i);
                sb.append(buffer);
                if (buffer.contains("REMOTE JSH COMMAND FINISHED")) {
                    System.out.println("[debug] breaking at finished");
                    break;
                }
            }
            
            if (channel.isClosed()) {
                System.out.println("Close input stream..");
                in.close();
                break;
            }
            // wait some time while script will be executed
            Thread.sleep(1000);
        }
        channel.disconnect();
        System.out.println("Channel disconnect..");
        //session.disconnect();        
        System.out.println("Rezult of runNexusCommandViaSSH: " + sb.toString());
        
        return sb.toString();
    }



Можете поиграться еще с параметром setPty(false) or setPty(true), в моем коде я использую глобальный session, что бы протестировать можете просто раскоментировать мой код и передать путь к шелл-скрипту либо какую-нибудь другую команду.
...
Рейтинг: 0 / 0
31.10.2014, 19:53
    #38793365
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что должен возвращать сервер при выполнении shell скрипта, используя библиотеку jsch?
mr_virtus
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
        if (!channelExecutable.isClosed()) {
            // waiting for response
            // timeout is 3 minutes
            for (int i = 0; i < 180; i++) {
                if (channelExecutable.isClosed()) {
                    break;
                }
                // sleep for 1 second
                Thread.sleep(1000);
            }
        }




Что это за лютый звиздец Ну вот пример гуглится же -

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
Channel channel=session.openChannel("exec");
            ((ChannelExec)channel).setCommand(command1);
            channel.setInputStream(null);
            ((ChannelExec)channel).setErrStream(System.err);
             
            InputStream in=channel.getInputStream();
            channel.connect();
            byte[] tmp=new byte[1024];
            while(true){
              while(in.available()>0){
                int i=in.read(tmp, 0, 1024);
                if(i<0)break;
                System.out.print(new String(tmp, 0, i));
              }
              if(channel.isClosed()){
                System.out.println("exit-status: "+channel.getExitStatus());
                break;
              }
              try{Thread.sleep(1000);}catch(Exception ee){}
            }
            channel.disconnect();
            session.disconnect();



Если не работает - то тогда искать причину ошибки
...
Рейтинг: 0 / 0
31.10.2014, 19:55
    #38793366
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что должен возвращать сервер при выполнении shell скрипта, используя библиотеку jsch?
YamahaR1setPty(false) or setPty(true),

Да, вот эта штука может помочь
...
Рейтинг: 0 / 0
31.10.2014, 19:58
    #38793373
YamahaR1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что должен возвращать сервер при выполнении shell скрипта, используя библиотеку jsch?
И не забудьте множетсвенные команды отделять знаком ;

например:

Код: java
1.
ls -la; cd /opt/script; up.sh



вконце добавляйте exit, т.е. в результате команда будет такой:
Код: java
1.
ls -la; cd /opt/script; up.sh; exit



Да и в таком случае в моем коде надо будет закоментировать:
Код: java
1.
2.
out.write((command).getBytes());
out.write(("exit").getBytes());



и раскоментировать
Код: java
1.
out.write((command + ";exit").getBytes());
...
Рейтинг: 0 / 0
31.10.2014, 22:38
    #38793443
mr_virtus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что должен возвращать сервер при выполнении shell скрипта, используя библиотеку jsch?
YamahaR1, забыл ник

спасибо большое!

буду пробывать!
...
Рейтинг: 0 / 0
05.11.2014, 10:05
    #38795816
mr_virtus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что должен возвращать сервер при выполнении shell скрипта, используя библиотеку jsch?
YamahaR1,

спасибо, Ваш код помог!
...
Рейтинг: 0 / 0
20.11.2014, 13:18
    #38811822
mr_virtus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что должен возвращать сервер при выполнении shell скрипта, используя библиотеку jsch?
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
byte[] tmp=new byte[1024];
            while(true){
              while(in.available()>0){
                int i=in.read(tmp, 0, 1024);
                if(i<0)break;
                System.out.print(new String(tmp, 0, i));
              }
              if(channel.isClosed()){
                System.out.println("exit-status: "+channel.getExitStatus());
                break;
              }
              try{Thread.sleep(1000);}catch(Exception ee){}
            }



чем обусловлен тут выбор размера байтового массива равным 1024?

в интернете не получилось найти объяснения.

может кто подскажет.

спасибо.
...
Рейтинг: 0 / 0
20.11.2014, 13:32
    #38811846
YamahaR1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что должен возвращать сервер при выполнении shell скрипта, используя библиотеку jsch?
mr_virtus,

Что бы не получить OutOfMemory, вы вычитываете файл блоками по 4Mb. 1024 - это минимальный размер.
...
Рейтинг: 0 / 0
20.11.2014, 13:34
    #38811847
mr_virtus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что должен возвращать сервер при выполнении shell скрипта, используя библиотеку jsch?
YamahaR1,

спасибо. а не подскажите ещё где про это можно почитать?
...
Рейтинг: 0 / 0
20.11.2014, 13:46
    #38811858
YamahaR1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что должен возвращать сервер при выполнении shell скрипта, используя библиотеку jsch?
YamahaR1mr_virtus,

Что бы не получить OutOfMemory, вы вычитываете файл блоками по 4Mb. 1024 - это минимальный размер.
И откуда я взял 4MB, если там 1 Kb...
Ну например тут посмотрите http://www.coderanch.com/t/501465/java-io/java/Setting-buffer-size
...
Рейтинг: 0 / 0
20.11.2014, 13:48
    #38811865
mr_virtus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что должен возвращать сервер при выполнении shell скрипта, используя библиотеку jsch?
YamahaR1,

ага, спасибо за ссылку. сейчас поизучаю :)
...
Рейтинг: 0 / 0
20.11.2014, 13:59
    #38811887
mr_virtus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что должен возвращать сервер при выполнении shell скрипта, используя библиотеку jsch?
mr_virtus,

авторThe ideal size is the page size used, but that's determined by the OS and/or the file system. Optimal buffer sizes on one system may be just so-so on other systems


а если у меня поток открыт с одной стороны на линуксовой машине а с другой стороны на виндовой, мне где page size смотреть, для какой системы?
...
Рейтинг: 0 / 0
20.11.2014, 14:03
    #38811898
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что должен возвращать сервер при выполнении shell скрипта, используя библиотеку jsch?
Размер страницы сейчас стандартный и равен четырём килобайтам.
Кроме этого есть "большие страницы", где может быть разнобой, но вероятно, два мегабайта будут в списке допустимых размеров.
Размер страниц определяется исключительно архитектурой процессора и не зависит от операционной системы.
...
Рейтинг: 0 / 0
20.11.2014, 14:04
    #38811900
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что должен возвращать сервер при выполнении shell скрипта, используя библиотеку jsch?
mr_virtusа если у меня поток открыт с одной стороны на линуксовой машине а с другой стороны на виндовой, мне где page size смотреть, для какой системы?
Здесь речь скорее о файловой системе.
Best Guess для всех случаев это 8Kb. Это размер и используется в JSE.
Классы
BufferenInputStream\BufferedReader\InputStreamReader
уже реализуют нормальную буферизацию и вычитку текста, вместо той галиматьи что приведена выше.
...
Рейтинг: 0 / 0
20.11.2014, 14:06
    #38811903
mr_virtus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что должен возвращать сервер при выполнении shell скрипта, используя библиотеку jsch?
Blazkowicz, Basil A. Sidorov ,

спасибо большое за разъяснения.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Что должен возвращать сервер при выполнении shell скрипта, используя библиотеку jsch? / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]