Как сделать два или более исполняемых канала JSch синхронизированными?

Я создал сеанс ssh для удаленного компьютера с Windows, используя JSch. На машине с Windows установлен cygwin для приема ssh от удаленного клиента. Для выполнения команд я открыл исполняемые каналы с помощью команды,

Channel channel = client_session.openChannel("exec"); 

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

Но я не получаю сам ранее сопоставленный диск (тот, который я сопоставил ранее в том же коде). Как сделать эти два канала синхронизированными. Код, который я использовал, приведен ниже.

Channel channel = client_session.openChannel("exec");
((ChannelExec)channel).setCommand("net use Y: \\\\\\\\share\\\\directory /USER:WORKGROUP\\\\User password");
channel.connect();

channel = client_session.openChannel("exec");
((ChannelExec)channel).setCommand("net use");
channel.connect();

Результат, который я получил после запуска,

The command completed successfully.

exit-status: 0
New connections will be remembered.


Status       Local     Remote                    Network

-------------------------------------------------------------------------------
Unavailable  Y:        \\share\directory     Microsoft Windows Network
The command completed successfully.

exit-status: 0

Также мне нужно выполнить несколько команд в сопоставленном каталоге, основываясь на выводе предыдущей команды, мне нужно запустить еще несколько команд в том же сопоставленном каталоге. Думаю если каналы синхронизировать то проблема с запуском нескольких команд решится.

public void method()
{
    Channel channel = null;
    try
    {
        channel = client_session.openChannel("exec");
        ((ChannelExec) channel).setCommand("net use Y: \\\\\\\\share\\\\directory /USER:WORKGROUP\\\\User password");
        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;
            }
        }
    }
    catch (Exception e)
    {
        System.out.println(e.getStackTrace()[0].getLineNumber());
        System.out.println(e.toString());
    }
    try
    {
        channel = client_session.openChannel("exec");
        ((ChannelExec)channel).setCommand("net use");
        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;
            }
        }
    }
    catch(Exception e)
    {
        System.out.println(e.getStackTrace()[0].getLineNumber());
        System.out.println(e.toString());           
    }
}

person Darshan K S    schedule 29.11.2016    source источник
comment
когда не использовать канал shell   -  person Scary Wombat    schedule 29.11.2016
comment
@ScaryWombat Канал Shell не предназначен для автоматизации выполнения команд. И это также затруднит определение того, какой результат исходит от какой команды.   -  person Martin Prikryl    schedule 29.11.2016


Ответы (1)


Дождитесь закрытия первого канала, прежде чем открывать другой.

Используйте метод Channel.isClosed. .

person Martin Prikryl    schedule 29.11.2016
comment
Я даже пробовал эту штуку. Но на выходе изменений нет. - person Darshan K S; 29.11.2016
comment
создаст ли этот оператор канал другого типа сеанса или просто канал channel = client_session.openChannel("exec"); - person Darshan K S; 29.11.2016
comment
На самом деле, теперь внимательно прочитайте ваш вопрос: диск Y: находится на выходе net use. Да, я вижу статус Недоступен. Но вы уверены, что получаете разные результаты при выполнении двух команд сразу после друг друга в консоли Windows? Как 2_ - person Martin Prikryl; 29.11.2016
comment
openChannel создает новый виртуальный канал в рамках существующего соединения SSH. - person Martin Prikryl; 29.11.2016
comment
Да, я проверил это на консоли Windows. Когда я выполняю обе команды на консоли, она дает правильный вывод, т.е. статус каталога монтирования будет в порядке. Но вот недоступен. - person Darshan K S; 29.11.2016
comment
Дуд, ты их сразу один за другим выполнил с помощью оператора &? - person Martin Prikryl; 29.11.2016
comment
да, у меня правильный вывод C:\>net use Y: \\share\directory /USER:WORKGROUP\User password & net use The command completed successfully. New connections will be remembered. Status Local Remote Network ------------------------------------------------------------------------------- OK Y: \\share\directory Microsoft Windows Network The command completed successfully. - person Darshan K S; 29.11.2016
comment
Пришлите нам свой код с icClosed (добавьте его в свой вопрос). - person Martin Prikryl; 29.11.2016
comment
вывод такой же, как и в вопросе. - person Darshan K S; 29.11.2016
comment
Если это то же самое (без строки exit-status:), ваш код isClosed не срабатывает. - person Martin Prikryl; 29.11.2016
comment
Давайте попробуем с какой-нибудь тривиальной командой, такой как ping 127.0.0.1 -n 10 — будет ли ваш цикл ждать завершения 10 секунд, прежде чем сломаться? - person Martin Prikryl; 29.11.2016
comment
Да, команда ждет 10 секунд, ждет закрытия канала. Я думаю, что client_session.openChannel("exec"); создает новый виртуальный канал, похожий на сеанс. Но я не уверен в этом. - person Darshan K S; 30.11.2016
comment
Так что ваш код правильный. То, что вы испытываете с net use, является некоторой особенностью команды. Ничего плохого в вашем коде. Вы пробовали это? setCommand("net use Y: \\\\\\\\share\\\\directory /USER:WORKGROUP\\\\User password & net use")? - person Martin Prikryl; 30.11.2016
comment
да, я пробовал это, но я не получаю вывод для net use части команды. Но когда я использую setCommand("net use Y: \\\\\\\\share\\\\directory /USER:WORKGROUP\\\\User password ; net use");, я получу статус монтирования как OK. - person Darshan K S; 30.11.2016
comment
Хорошо. Так что используйте это. - person Martin Prikryl; 30.11.2016
comment
Основываясь на предыдущем выводе команды (который был выполнен с одним из каналов), мне нужно запустить еще несколько команд в том же сопоставленном каталоге. После анализа вывода, если я открою новый канал для запуска большего количества команд. В этом канале сам диск не будет отображаться. Это основная проблема, стоящая за вопросом. - person Darshan K S; 30.11.2016
comment
Хорошо, но это другой вопрос, чем вы задали. Вы спросили Как сделать два или более исполняемых канала JSch синхронизированными? - На это я дал вам ответ. Ваша проблема связана с конкретным поведением конкретной команды. Это новый вопрос. Я считаю, что на этот вопрос ответили и закрыли. И вы должны задать новый вопрос. - person Martin Prikryl; 30.11.2016