如何使用JSch执行多个操作

时间:2011-09-14 16:11:26

标签: java android ssh sftp jsch

我是SSH和JSch的新手。当我从客户端连接到服务器时,我想做两个任务:

  1. 上传文件(使用ChannelSFTP
  2. 执行命令,如创建目录,以及搜索MySQL数据库
  3. 目前我使用两个单独的shell登录来执行每个任务(实际上我还没有开始编写MySQL查询)。

    上传时,相关代码为

    session.connect();
    
    Channel channel=session.openChannel("sftp");
    channel.connect();
    ChannelSftp c=(ChannelSftp)channel;
    c.put(source, destination);
    

    对于我有的命令

    String command = "ls -l";//just an example 
    Channel channel=session.openChannel("exec");
    ((ChannelExec)channel).setCommand(command);
    

    我应该在第一个频道之后断开会话,然后打开第二个频道吗?或者完全关闭会话并开启新会话?正如我所说,我是新手。

2 个答案:

答案 0 :(得分:8)

一个SSH会话可以支持任意数量的通道 - 并行和顺序通道。 (通道标识符大小有一些理论限制,但在实践中你不会遇到它。)这对JSch也有效。这样可以节省重做昂贵的密钥交换操作。

因此,在打开新频道之前,通常无需关闭会话并重新连接。我能想到的唯一原因是你需要使用不同的凭据登录这两种行为。

为了保护一些内存,您可能希望在打开exec通道之前关闭SFTP通道。

答案 1 :(得分:3)

通过Jsch提供多个命令 使用shell而不是exec。 Shell仅支持连接系统的本机命令。 例如,当您连接Windows系统时,您无法使用exec通道提供dir之类的命令。 所以最好使用shell。

以下代码可用于通过Jsch发送多个命令

Channel channel = session.openChannel("shell");
OutputStream ops = channel.getOutputStream();
PrintStream ps = new PrintStream(ops, true);

channel.connect();
ps.println("mkdir folder");
ps.println("dir");
//give commands to be executed inside println.and can have any no of commands sent.
ps.close();

InputStream in = channel.getInputStream();
byte[] bt = new byte[1024];

while (true) {
    while (in.available() > 0) {
        int i = in.read(bt, 0, 1024);
        if (i < 0) {
            break;
        }
        String str = new String(bt, 0, i);
        //displays the output of the command executed.
        System.out.print(str);

    }
    if (channel.isClosed()) {
            break;
    }
    Thread.sleep(1000);
    channel.disconnect();
    session.disconnect();
}