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

вот есть небольшой участок кода, где я подключаюсь к linux и запускаю выполнение unix-команд:

Код: 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.
StringBuilder stringBuilder = new StringBuilder();

            Channel channel = session.openChannel("shell");

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

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

            byte[] tmp = new byte[1024 * 8];

            out.write((command).getBytes());
            out.write(("\n").getBytes());
            out.write(("exit").getBytes());
            out.write(("\n").getBytes());
            out.flush();


            Thread.sleep(1000);

            while (true) {
                while (in.available() > 0) {

                    int i = in.read(tmp, 0, 1024);
                    if (i < 0) {
                        break;
                    }
                    String buffer = new String(tmp, 0, i);
                    stringBuilder.append(buffer);
                }

                if (channel.isClosed()) {

                    in.close();
                    break;
                }
                //wait some time while script will be executed
                Thread.sleep(1000);
            }


            channel.disconnect();



Не происходит выход из внешнего цикла. Из внешнего цикла мы выходим, когда канал закрыт.

При этом сначала in.available() - возвращает положительные значения, а в какой - то момент 0.

По ответам в гугле не смог понять, почему начинает возвращать 0.

В доке написано, что available() для inputstream - всегда возращает 0.
http://docs.oracle.com/javase/7/docs/api/java/io/InputStream.html#available()

Поправьте, плиз, меня в чем я ошибаюсь, и в этом ли вообще дело, что цикл у меня бесконечным получается, может ещё на что мледует обратить внимание?
...
Рейтинг: 0 / 0
проблема с jsch и выполнением unix комманд из java
    #38855002
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mr_virtus,

Эта такая особенность сокетов вообще. Другая сторона может даже закрыть соединение, но ты об этом не узнаешь пока не попробуешь читать или писать. И метод isClosed() тут вообще не помошник.
На сколько я понимаю, самый правильный вариант это привязка к протоколу. То есть определять конец сессии можно по содержимому.
Можно использовать таймаут. Если в течении какого-то времени ничего нового не появилось, значит и не появится.

Если вопрос вообще только в закрытии, то отправляй команду закрытия и сам смело закрывай соединение. Для чего ждать сервер-то?
...
Рейтинг: 0 / 0
проблема с jsch и выполнением unix комманд из java
    #38855023
mr_virtus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,

а как мне команду отправить?

у меня на linux машине выполняются разные команды, shell скрипты запускаются(эти команды я предварительно отправляю из java кода на сервак).

и когда они все выполнятся, я добавляю

Код: java
1.
out.write(("exit").getBytes());



это и закрывает канал в моем случае.

Ещё интересный момент, который я тоже не понимаю.

В доке написано:

http://epaul.github.io/jsch-documentation/javadoc/com/jcraft/jsch/Channel.html#getInputStream()

авторpublic InputStream getInputStream()

я написал такую штуку:
Код: java
1.
2.
InputStream in = om.jcraft.jsch.channel.getInputStream();
System.out.println(in.getClass().getName());



и получил
авторcom.jcraft.jsch.Channel$MyPipedInputStream

Это же не InputStream.

Почему так или я неправильно что понимаю?
...
Рейтинг: 0 / 0
проблема с jsch и выполнением unix комманд из java
    #38855049
mr_virtus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
так про

авторcom.jcraft.jsch.Channel$MyPipedInputStream

понял. MyPipedInputStream - наследник InputStream.

про available так и нет пока :)
...
Рейтинг: 0 / 0
проблема с jsch и выполнением unix комманд из java
    #38855094
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mr_virtusпро available так и нет пока :)
JavaDoc прочитай. Вдумчиво.
...
Рейтинг: 0 / 0
проблема с jsch и выполнением unix комманд из java
    #38855371
mr_virtus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,

я вот не пойму.

где мне читать про метод available для MyPipedInputStream?

http://www.docjar.com/docs/api/com/jcraft/jsch/Channel$MyPipedInputStream.html

Как он работает? Или в исходники нужно лезть?

Подскажите, плиз :)
...
Рейтинг: 0 / 0
проблема с jsch и выполнением unix комманд из java
    #38855375
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mr_virtus,

Странные у тебя желания

http://docs.oracle.com/javase/7/docs/api/java/io/InputStream.html#available() Returns an estimate of the number of bytes that can be read (or skipped over) from this input stream without blocking by the next invocation of a method for this input stream. The next invocation might be the same thread or another thread. A single read or skip of this many bytes will not block, but may read or skip fewer bytes.

Note that while some implementations of InputStream will return the total number of bytes in the stream, many will not . It is never correct to use the return value of this method to allocate a buffer intended to hold all data in this stream.

A subclass' implementation of this method may choose to throw an IOException if this input stream has been closed by invoking the close() method.

The available method for class InputStream always returns 0.

This method should be overridden by subclasses.
...
Рейтинг: 0 / 0
проблема с jsch и выполнением unix комманд из java
    #38855425
mr_virtus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,

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


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