java - 如何在JSch中使用SFTP channel 执行shell命令?

标签 java shell sftp jsch

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

find . -type f -name *.xml

但不知 Prop 体该怎么做。 Exec channel 周围有一些示例,但是有没有办法使用 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();
}

最佳答案

您的要求是相互冲突的。

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


所以你必须选择。

  • 使用“Exec Channel”运行 find shell 命令。
  • 或者通过 ChannelSftp.ls 使用纯 SFTP 接口(interface)(并以编程方式递归到子目录)。这种方法更加费力并且速度会慢很多。另一方面,这将是一种更加稳健的方式。如果您一开始就没有 shell 访问权限,那么它实际上是唯一的解决方案。更不用说它是平台无关的(find 命令不是)。

关于java - 如何在JSch中使用SFTP channel 执行shell命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53887982/

相关文章:

objective-c - ConnectionKit 和 SFTP : How to authenticate CK2FileManager

java - 在 hibernate 中延迟加载一个 clob

java - 图形 JPanel 大小调整

regex - 删除没有 n 个特定字符的行?

bash - 在每行中查找特定单词并在 unix shell 脚本中显示结果

java - 从java从windows ssh服务器获取文件

java - 使用 Gson 将 JSON 反序列化为对象

java - 如何查看java程序的执行步骤

perl - 从另一个文件中的列表替换文件中的文本?

javascript - 在 Nodejs 中使用 ssh2 传输整个目录