Jsch - несколько каналов за сеанс - PullRequest
1 голос
/ 28 марта 2012

Возникает проблема, когда я пытаюсь запустить вторую команду в том же сеансе, используя Jsch API

package examples.com;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelExec;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;

public class TempFile {

private static Session connectSession(String userName, String password, String host) throws Exception {
        JSch.setLogger(new MyLogger());
        JSch jsch = new JSch();
        Session session = null;
        try {
            session = jsch.getSession(userName, host, 22);
            session.setPassword(password);
            session.setTimeout(10000);
            java.util.Properties config = new java.util.Properties();
            config.put("StrictHostKeyChecking", "no");
            session.setConfig(config);
            session.connect();                      
        }
        catch (JSchException ex) {
            System.out.println(ex);
        }
        return session;
    }

    private static void connectChannel(Session session, String command) throws JSchException, IOException {
        System.out.println(command);
        Channel channel = null;
        channel = session.openChannel("exec");
        ((ChannelExec) channel).setCommand(command);
        InputStream in = channel.getInputStream();
        channel.connect();
        System.out.println("channel.isConnected()  "+channel.isConnected());
        setInAndOutStream(channel, in);
        channel.disconnect();
        System.out.println("channel.isClosed()  "+channel.isClosed());
    }

    private static void setInAndOutStream(Channel channel, InputStream in) throws IOException, JSchException {
        BufferedReader br = new BufferedReader(new InputStreamReader(in));
        StringBuilder outPutResult = new StringBuilder("");
        int exitStatus = -100;
        String output;
        while (true) {
            while (true) {
                try {
                    String result = br.readLine();
                    if (result == null)
                        break;
                    outPutResult.append(result);
                } catch (Exception ex) {
                    ex.printStackTrace();
                    break;
                }
            }
            output = outPutResult.toString();

            if (channel.isClosed()) {
                exitStatus = channel.getExitStatus();
                break;
            }
        }
        System.out.println(exitStatus);
        System.out.println(output);
    }

    private static void executeCommand(Session session, String command) throws JSchException, IOException{
        connectChannel(session,command);
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        System.out.println("starting");
        // TODO Auto-generated method stub
        try {
            Session session = connectSession("username", "password", "host");
            if(session!=null) {
                executeCommand(session, "ls");
                executeCommand(session, "cp out.txt copy.txt");

                session.disconnect();
            }
        } catch (JSchException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println("done..");
    }

}

Работает нормально, если я использую Linux-машину в качестве хоста. Но если я пытаюсь подключиться к машине с Windows Server 2008, имеющей openssh, он не может выполнить вторую команду, т.е. "executeCommand (session," cp out.txt copy.txt ");" возвращает статус 255.

Что должно быть не так ?? Нужно ли нам устанавливать какую-то опцию в файле конфигурации ssh для поддержки одного сеанса и нескольких каналов ??

1 Ответ

0 голосов
/ 20 апреля 2013

попробуйте изменить

        channel = session.openChannel("exec");

с

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