powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Что должен возвращать сервер при выполнении shell скрипта, используя библиотеку jsch?
16 сообщений из 16, страница 1 из 1
Что должен возвращать сервер при выполнении shell скрипта, используя библиотеку jsch?
    #38793345
mr_virtus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет! Подскажите, пожалуйста,

Я подключаюсь к серверу через 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
Что должен возвращать сервер при выполнении shell скрипта, используя библиотеку jsch?
    #38793363
YamahaR1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Что должен возвращать сервер при выполнении shell скрипта, используя библиотеку jsch?
    #38793365
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Что должен возвращать сервер при выполнении shell скрипта, используя библиотеку jsch?
    #38793366
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YamahaR1setPty(false) or setPty(true),

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

например:

Код: 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
Что должен возвращать сервер при выполнении shell скрипта, используя библиотеку jsch?
    #38793443
mr_virtus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YamahaR1, забыл ник

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

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

спасибо, Ваш код помог!
...
Рейтинг: 0 / 0
Что должен возвращать сервер при выполнении shell скрипта, используя библиотеку jsch?
    #38811822
mr_virtus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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
Что должен возвращать сервер при выполнении shell скрипта, используя библиотеку jsch?
    #38811846
YamahaR1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mr_virtus,

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

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

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

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

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


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