使用JSch

时间:2017-06-15 14:59:36

标签: java scp jsch

我一直在尝试检索文件名列表中不包含字符串" -ingested - "来自远程服务器的SCP(我的经理不想使用SFTP)。

这些文件是zip文件,其中至少包含一个.txt文件和一个相关的.txt.count文件。

所以,一旦我对允许通过SCP检索文件的java库进行了一些研究,我就把这个任务分解如下:

  1. 使用JSch-done

  2. 连接到远程服务器(仅限密钥身份验证)
  3. 运行一个通过SCP检索特定文件的命令 - 已完成

  4. 运行一个命令,通过SCP检索指定目录中的所有文件 - 卡在此上,无法在JSch中找到任何这样做的例子

  5. 运行一个命令,检索指定目录中的所有文件,这些文件的文件名不包含字符串" -ingested - "在其中

  6. 重命名远程服务器上没有字符串" -ingested - "的所有文件。在他们的文件名中,添加字符串" -ingested - "到他们的文件名。 这样,当我几小时后从服务器检索文件时,我无法检索到我已经读过的文件。

  7. 我目前在第3步难倒,因为我似乎无法在任何地方找到这样的例子。

    以下是步骤1和2的代码:

    final JSch jsch = new JSch();
    
    final String authenticationKeyFilePath = "/var/myprivatekey.rsa";
    
    jsch.addIdentity(authenticationKeyFilePath);
    
    final String knownHostFilePath = "/home/user1/.ssh/known_hosts";
    
    jsch.setKnownHosts(knownHostFilePath);
    
    final String userName = "p";
    final String host = "example.com";
    final int port = 22;
    
    final Session session = jsch.getSession(userName, host, port);
    
    session.connect();
    
    final String channelType = "exec";
    
    final Channel channel = session.openChannel(channelType);
    
    final String query = "scp -f /home/download/50347_SENT_20170614_025807.txt.count";
    
    ((ChannelExec)channel).setCommand(query);
    
    // Todo: Dispose of these streams if necessary.
    final OutputStream outputStream = channel.getOutputStream();
    final InputStream inputStream = channel.getInputStream();
    
    channel.connect();
    
    byte[] buffer = new byte[1024];
    buffer[0] = 0;
    
    final int outputStreamOffset = 0;
    final int outputStreamLength = 1;
    outputStream.write(buffer, outputStreamOffset, outputStreamLength);
    outputStream.flush();
    
    while (true) {
        final int c = checkAck(inputStream);
    
        if (c != 'C') break;
    
        // read '0644 '
        inputStream.read(buffer, 0, 5);
    
        long filesize = 0L;
    
        while (true) {
            if (inputStream.read(buffer, 0, 1) < 0) break;
    
            if (buffer[0] == ' ') break;
            filesize = filesize * 10L + (long)(buffer[0] - '0');
        }
    
        String file = null;
    
        for (int i = 0; ; i++) {
            inputStream.read(buffer, i, 1);
    
            if (buffer[i] == (byte)0x0a){
                file = new String(buffer, 0, i);
                break;
            }
        }
    
        // send '\0'
        buffer[0] = 0;
        outputStream.write(buffer, 0, 1);
        outputStream.flush();
    
        // read a content of lfile
        FileOutputStream fos = new FileOutputStream(file);
        int foo;
    
        while (true) {
            if (buffer.length < filesize) foo = buffer.length;
            else foo = (int)filesize;
            foo = inputStream.read(buffer, 0, foo);
    
            if (foo < 0){
                // error
                break;
            }
    
            fos.write(buffer, 0, foo);
            filesize -= foo;
    
            if (filesize == 0L) break;
        }
    
        final String textFromDownloadedFile = fos.toString();  
    
        fos.close();
        fos = null;
    
        if (checkAck(inputStream) != 0) System.exit(0);
    
        // send '\0'
        buffer[0] = 0;
        outputStream.write(buffer, outputStreamOffset, outputStreamLength);
        outputStream.flush();
    }
    
    session.disconnect();
    
    System.exit(0);
    

    因此,在一个理想的世界中,我会将查询字符串更改为符合我在步骤4中所需的内容并将其读入字符串列表或任何最有效的内容,然后我可以存储它们并转到第5步。 非常感谢任何帮助。

    P.S。如果有一个更容易使用Java SCP库的公司友好许可证,请告诉我!

1 个答案:

答案 0 :(得分:1)

使用如下命令:

scp -r -d -f /remote/path/*

然后遍历服务器发送给您的文件。你的代码似乎已经做了什么。

请注意,我担心您在使用SCP协议实施第4步时会遇到麻烦。 &#34;不包含&#34; 条件很麻烦。

使用SFTP! SCP是传统的过时协议。

当然,你可以做的是执行ls shell命令。解析结果以查找所有文件的列表。然后在本地过滤它们。

一些相关问题: