使用 JSch 下载具有 SCP 协议的目录中的所有文件



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

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

因此,一旦我对允许通过SCP检索文件的java库进行了一些研究,我就将任务分解如下:

  1. 使用 JSch 连接到远程服务器(仅限密钥身份验证) - 完成

  2. 运行通过 SCP 检索特定文件的命令 - 完成

  3. 运行一个通过SCP检索指定目录中所有文件的命令 - 卡在这个上面,在JSch中找不到任何执行此操作的示例

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

  5. 重命名远程服务器上文件名中没有字符串"-ingested-">
  6. 的所有文件,并将字符串"-ingested-"添加到其文件名中。 这样,当我几个小时后从服务器检索文件时,我不会检索我已经读入的文件。

我目前在步骤 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 ''
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 ''
buffer[0] = 0;
outputStream.write(buffer, outputStreamOffset, outputStreamLength);
outputStream.flush();
}
session.disconnect();
System.exit(0);

因此,在理想情况下,我会将查询字符串更改为与步骤 4 中所需的内容匹配的内容,并将它们读入字符串列表或任何最有效的内容,然后我可以存储它们并继续执行步骤 5。 任何帮助都非常感谢。

附言如果有一个更容易使用的Java SCP库和公司友好的许可证,请告诉我!

使用如下命令:

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

然后循环访问服务器发送给您的文件。您的代码似乎已经做了什么。


请注意,恐怕您在使用 SCP 协议实现步骤 4 时会遇到麻烦。"不包含">条件很麻烦。

使用SFTP!SCP是遗留的过时协议。

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


一些相关问题:

  • JSch 库中 SCP 协议实现的说明
  • JSch - 解释 SCP 流读取
  • JSch SCP 文件传输使用"执行"通道

相关内容

  • 没有找到相关文章

最新更新