我一直在尝试检索文件名列表中不包含字符串" -ingested - "来自远程服务器的SCP(我的经理不想使用SFTP)。
这些文件是zip文件,其中至少包含一个.txt文件和一个相关的.txt.count文件。
所以,一旦我对允许通过SCP检索文件的java库进行了一些研究,我就把这个任务分解如下:
使用JSch-done
运行一个通过SCP检索特定文件的命令 - 已完成
运行一个命令,通过SCP检索指定目录中的所有文件 - 卡在此上,无法在JSch中找到任何这样做的例子
运行一个命令,检索指定目录中的所有文件,这些文件的文件名不包含字符串" -ingested - "在其中
重命名远程服务器上没有字符串" -ingested - "的所有文件。在他们的文件名中,添加字符串" -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 '\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库的公司友好许可证,请告诉我!
答案 0 :(得分:1)
使用如下命令:
scp -r -d -f /remote/path/*
然后遍历服务器发送给您的文件。你的代码似乎已经做了什么。
请注意,我担心您在使用SCP协议实施第4步时会遇到麻烦。 &#34;不包含&#34; 条件很麻烦。
使用SFTP! SCP是传统的过时协议。
当然,你可以做的是执行ls
shell命令。解析结果以查找所有文件的列表。然后在本地过滤它们。
一些相关问题: