使用 sshj 的 SFTP 服务器上不受支持的 SETSTAT 请求的解决方法

Workaround for unsupported SETSTAT request on SFTP server with sshj

我正在尝试使用身份字符串通过 SFTP 连接到服务器:SSH-2.0-AWS_SFTP_1.0 以及使用 sshj.Java 的以下代码。

<dependency>
    <groupId>com.hierynomus</groupId>
    <artifactId>sshj</artifactId>
    <version>0.29.0</version>
</dependency>
private SSHClient setupSshj(String remoteHost, String username, String password) throws IOException {
    SSHClient client = new SSHClient();
    client.addHostKeyVerifier(new PromiscuousVerifier());
    client.connect(remoteHost);
    client.authPassword(username, password);
    return client;
}

public void sftpfiles() throws IOException {
    if (Boolean.parseBoolean(GetConfigValue("dds", "sendFiles"))) {
        SSHClient sshClient = setupSshj(GetConfigValue("dds", "RemoteAddress"), GetConfigValue("dds", "RemoteLogin"), GetConfigValue("dds", "RemotePassword"));
        SFTPClient sftpClient = sshClient.newSFTPClient();
        sftpClient.put("/home/vm/test.txt", GetConfigValue("dds", "RemoteDirectory"));
        sftpClient.close();
        sshClients.disconnect();
    }
}

并得到错误

Error SETSTAT unsupported

我了解 AWS 服务不允许在上传时设置时间戳,但我不知道需要进行哪些调整才能配置 SFTP 客户端。

问候 康特

好像sshj SSHClient API does not allow preventing the use of the SETSTAT request. You will have to use more low level API, like SFTPFileTransfer:

SFTPEngine engine = new SFTPEngine(sshClient).init();
SFTPFileTransfer xfer = new SFTPFileTransfer(engine);
xfer.setPreserveAttributes(false);
xfer.upload("/home/vm/test.txt", GetConfigValue("dds", "RemoteDirectory"));

SSHJ 支持跳过 SETSTAT 方法。

sftpClient.getFileTransfer().setPreserveAttributes(false)