5

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

  1. 上传文件(使用ChannelSFTP
  2. 执行命令,例如创建目录和搜索 MySQL 数据库

目前我使用两个单独的 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);

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

4

2 回答 2

8

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

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

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

于 2011-09-14T16:27:43.817 回答
3

要通过 Jsch 提供多个命令,请使用 shell 而不是 exec。Shell 仅支持连接系统的本机命令。例如,当您连接 windows 系统时,您不能像dir使用 exec 通道一样发出命令。所以最好用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();
}
于 2013-01-03T06:31:41.330 回答