【问题标题】:How to perform multiple operations with JSch如何使用 JSch 执行多项操作
【发布时间】:2011-11-17 04:25:24
【问题描述】:

我是 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);

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

【问题讨论】:

  • 请注意(正如您所说,您是 JSch 的新手):我创建了一个 JavaDoc documentation 的类,这可能会有所帮助。
  • 谢谢。我去看看……

标签: java android ssh sftp jsch


【解决方案1】:

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

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

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

【讨论】:

  • 你说的是在客户端(JSch)还是服务器(SSH服务器)上节省内存?
  • 我主要指的是客户端(因为这是您使用 JSch 控制的),但我想服务器也会对每个打开的通道产生一些开销,包括本例中的 SFTP 服务器进程。跨度>
  • 是否认为服务器上多个频道的开销,特别是exec 频道,会相当大?
  • 我不知道(请自行衡量),但一般没有理由让频道在不再使用后打开。
【解决方案2】:

通过 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();
}

【讨论】:

  • 不,最好使用 shell 通道。使用多个 exec 通道是首选方法。 shell 通道用于实现交互式会话,而不是自动化。
猜你喜欢
  • 1970-01-01
  • 2021-07-17
  • 2014-05-30
  • 2017-07-10
  • 1970-01-01
  • 2019-03-02
  • 2017-01-23
  • 2012-04-19
  • 1970-01-01
相关资源
最近更新 更多