如何使用Java在SFTP服务器文件中附加数据

问题描述 投票:1回答:2

我已经尝试了所有可能的方法将一些内容附加到SFTP文件路径中存在的文件中。我收到成功消息,但找不到更新的文件。不知道是什么原因。

请在下面找到我的代码:

jsch = new JSch();
jsch.addIdentity(privateKey); 
session = jsch.getSession(SFTPUSER, SFTPHOST, SFTPPORT);
session.setConfig("PreferredAuthentications", "publickey,keyboard-interactive,password");
ProxyHTTP  proxy = new ProxyHTTP(PROXY, 8080);
session.setProxy(proxy);

session.setConfig("StrictHostKeyChecking", "no");
session.setConfig("cipher.s2c", "aes128-ctr,aes128-cbc,3des-ctr,3des-cbc,blowfish-cbc,aes192-cbc,aes256-cbc,aes256-ctr");
session.setConfig("cipher.c2s", "aes128-ctr,aes128-cbc,3des-ctr,3des-cbc,blowfish-cbc,aes192-cbc,aes256-cbc,aes256-ctr");
session.connect();

sftpChannel = (ChannelSftp)session.openChannel("sftp");
sftpChannel.connect();
if(sftpChannel.getSession().isConnected())
    logger.debug("Remote session established through the channel");

sftpChannel.cd(remoteDirectory);

List<String> list = new ArrayList<>();

ChannelSftp sftp = (ChannelSftp) sftpChannel;
Vector<LsEntry> files = sftp.ls(remoteDirectory);

for (LsEntry entry : files)
{
    if (!entry.getFilename().equals(".") && !entry.getFilename().equals(".."))
    {
        list.add(entry.getFilename());
    }
}

System.out.println(list);

InputStream stream = sftp.get(remoteDirectory + remoteFile);
try {
    BufferedReader br = new BufferedReader(new InputStreamReader(stream));
    String line;
    while ((line = br.readLine()) != null) {
        System.out.println(line);
    }
    // read from br
} finally {
    stream.close();
}
Files.write(Paths.get(remoteFile), "CH|OK|en,ch,de,it|CH ".getBytes(), StandardOpenOption.APPEND);
System.out.println("added country to remote path");
sftpChannel.exit();
session.disconnect();
java sftp jsch
2个回答
1
投票

ChannelSftp.put method overloads参数设置为ChannelSftp.put使用mode之一。

例如:

ChannelSftp.APPEND

请注意,您甚至无法远程编码所需的内容。 ChannelSftp.APPEND写入一个local文件,而不是一个remote文件。


强制警告:请勿使用String s = "CH|OK|en,ch,de,it|CH "; sftp.put(new ByteArrayInputStream(s.getBytes()), remoteFile, ChannelSftp.APPEND); 盲目接受所有主机密钥。那是一个安全漏洞。您失去了针对Files.write的保护。

有关正确(且安全)的方法,请参阅:StrictHostKeyChecking=no


0
投票

public void put(String src,String dstDir)引发SftpException,IOException,JSchException {InputStream inputStream = Files.newInputStream(Paths.get(src));尝试(BufferedReader br = new BufferedReader(new InputStreamReader(inputStream))){字符串行;StringBuilder stringBuilder = new StringBuilder();while((line = br.readLine())!= null){sftpChannel.cd(dstDir);字符串oldCardNumber = line.substring(35,51);log.info(oldCardNumber);如果(oldCardNumber.contains(“ *”))stringBuilder.append(line.replace(oldCardNumber,“ Shubham”)).append(“ \ n”);其他stringBuilder.append(line).append(“ \ n”);

MITM attacks

我尝试执行相同的步骤,但出现异常->文件已存在。没有截断标志就无法创建文件

有人可以帮忙吗?

© www.soinside.com 2019 - 2024. All rights reserved.