如何在JSch中使用SFTP通道执行shell命令?

时间:2018-12-21 16:24:46

标签: java shell sftp jsch

我正在尝试列出目录中的所有* .xml文件。我先执行cd,然后尝试执行:

find . -type f -name *.xml

但不确定如何执行。在Exec频道周围有一些示例,但是有没有办法使用SFTP本身进行查找?

String username = "abcd";
String password = "pqrst";
String host = "xxxxxx.xxxx.xxx";
int port = 22;
String SFTPWORKINGDIR  = "/xxx/xxx/xxx/xxxx";

Session     session     = null;
ChannelSftp channelSftp = null;

try {
    JSch jSch = new JSch();
    session = jSch.getSession(username, host, port);
    session.setConfig("StrictHostKeyChecking", "no");
    session.connect();
    channelSftp = (ChannelSftp) session.openChannel("sftp");
    channelSftp.connect();
    channelSftp.cd(SFTPWORKINGDIR);

    // List all the *xml file.
    // ------------ Want to execute 'find . -type f -name "*.xml" ' here------------

    /*  Vector fileList = channelSftp.ls() 

    for(int i=0; i<fileList.size();i++){
        LsEntry entry = (LsEntry) fileList.get(i);
        System.out.println(entry.getFilename());
    }*/

} catch (JSchException | SftpException e) {
    e.printStackTrace();
}
finally {
    if(session != null) session.disconnect();
    if(channelSftp != null) channelSftp.disconnect();
}

1 个答案:

答案 0 :(得分:2)

您的要求有冲突。

您无法使用SFTP执行Shell命令。
(无论使用哪种语言或库,在任何情况下都是如此。

所以您必须选择。

  • 通过“执行通道”运行find shell命令。
  • 或者通过ChannelSftp.ls使用纯SFTP接口(并以编程方式递归到子目录中)。这种方法比较费力,幅度也会更慢。另一方面,它将是一种更强大的方法。如果您首先没有外壳程序访问权限,那么它实际上是唯一的解决方案。更不用说它是与平台无关的(find命令不是)。