java - Jsch - 每个 session 多个 channel

标签 java session ssh channel jsch

当我尝试使用 Jsch API 在同一 session 中触发第二个命令时出现问题

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机器作为主机,它工作得很好。 但是,如果我尝试连接到具有 openssh 的 Windows Server 2008 计算机,它无法执行第二个命令,即“executeCommand(session, “cp out.txt copy.txt”);”它返回状态 255。

一定出了什么问题?我们是否需要在 ssh 配置文件中设置一些选项来支持这一 session 和多个 channel ?

最佳答案

尝试改变

        channel = session.openChannel("exec");

    channel = session.openChannel("shell");

关于java - Jsch - 每个 session 多个 channel ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9903597/

相关文章:

java - Android:强制音频到耳机 >> setDeviceConnectionState 失败:java.lang.NoSuchMethodException:

linux - 后台运行Linux命令,关闭SSH后继续运行

php - 查找具有特定文本的文件并删除该文本

python - 在 Python 中的多个服务器(路由器)上运行命令(以备份配置)

java - 在 textView 内显示可点击的链接

java - 用字符替换字符串中的字母

Java:线程不会同时 ping

java - Spring MVC 中 session 过期

c# - ASP.NET:为无 cookie session 实现 ISessionIDManager?

asp.net - SQLServer 与 StateServer 的 ASP.NET session 状态性能比较