1

Apache Mina SSHD を使用してローカル SFTP サーバーを起動します。これが私の関連コードです。テストするために、WinSCPを SFTP クライアントとして使用します。サーバーに正常に接続でき、サーバーのルート ディレクトリも表示できます。しかし問題は、そのサーバーのルート ディレクトリにファイルをアップロードしようとしたときです。

私は得た

Exception caught in SFTP subsystem
java.lang.UnsupportedOperationException: null 
at org.apache.sshd.common.file.nativefs.NativeSshFile.setAttributes(NativeSshFile.java:634) ~[sshd-core-0.10.0.jar:0.10.0]
    at org.apache.sshd.server.sftp.SftpSubsystem.process(SftpSubsystem.java:427) ~[sshd-core-0.10.0.jar:0.10.0]
    at org.apache.sshd.server.sftp.SftpSubsystem.run(SftpSubsystem.java:334) ~[sshd-core-0.10.0.jar:0.10.0]
    at java.lang.Thread.run(Unknown Source) [na:1.7.0_75].

以下は、関連するログ ファイルです。

10:30:46.758 [Thread-1] DEBUG o.a.s.c.file.nativefs.NativeSshFile - Authorized
10:30:46.767 [Thread-1] ERROR o.a.sshd.server.sftp.SftpSubsystem - Exception caught in SFTP subsystem
java.lang.UnsupportedOperationException: null
    at org.apache.sshd.common.file.nativefs.NativeSshFile.setAttributes(NativeSshFile.java:634) ~[sshd-core-0.10.0.jar:0.10.0]
    at org.apache.sshd.server.sftp.SftpSubsystem.process(SftpSubsystem.java:427) ~[sshd-core-0.10.0.jar:0.10.0]
    at org.apache.sshd.server.sftp.SftpSubsystem.run(SftpSubsystem.java:334) ~[sshd-core-0.10.0.jar:0.10.0]
    at java.lang.Thread.run(Unknown Source) [na:1.7.0_75]
10:30:46.767 [Thread-1] DEBUG o.a.s.server.channel.ChannelSession - Send SSH_MSG_CHANNEL_EOF on channel ChannelSession[id=0, recipient=256]
10:30:46.768 [Thread-1] DEBUG o.a.sshd.common.io.nio2.Nio2Session - Writing 64 bytes

また、私のmaven依存関係、

<dependency>
    <groupId>org.apache.mina</groupId>
    <artifactId>mina-core</artifactId>
    <version>2.0.9</version>
</dependency>
<dependency>
    <groupId>org.apache.sshd</groupId>
    <artifactId>sshd-sftp</artifactId>
    <version>0.9.0</version>
</dependency>
<dependency>
    <groupId>org.apache.sshd</groupId>
    <artifactId>sshd-core</artifactId>
    <version>0.10.0</version>
</dependency>

ローカルの SFTP サーバーにファイルをアップロードするときに、上記の問題をどのように解決できるかを知りたいです。ありがとう。

4

1 に答える 1

1

ファイルをアップロードするとき、WinSCP はその構成に応じて、アップロードされたファイルのタイムスタンプ (デフォルトでオン) および/または許可 (デフォルトでオフ) を設定します。

Mina SSHD 0.10.0 は、ファイル属性の設定をサポートしていません。

public void setAttributes(Map<Attribute, Object> attributes) throws IOException {
    if (!attributes.isEmpty()) {
        throw new UnsupportedOperationException();
    }
}

最新の Mina SSHD 0.14.0 はタイムスタンプの設定をサポートしており、デフォルトでは権限 (またはその他の属性) を設定できないことのみをログに記録します。

public void setAttributes(Map<Attribute, Object> attributes) throws IOException {
    Set<Attribute> unsupported = new HashSet<Attribute>();
    for (Attribute attribute : attributes.keySet()) {
        Object value = attributes.get(attribute);
        switch (attribute) {
        case Size: {
            long newSize = (Long) value;
            FileChannel outChan = new FileOutputStream(file, true).getChannel();
            outChan.truncate(newSize);
            outChan.close();
            continue;
        }
        case LastModifiedTime:
            setLastModified((Long) value);
            break;
        default:
            unsupported.add(attribute);
            break;
        }
    }
    handleUnsupportedAttributes(unsupported);
}

protected void handleUnsupportedAttributes(Collection<Attribute> attributes) {
    if (!attributes.isEmpty()) {
        StringBuilder sb = new StringBuilder();
        for (Attribute attr : attributes) {
            if (sb.length() > 0) {
                sb.append(", ");
            }
            sb.append(attr.name());
        }
        switch (nativeFileSystemView.getUnsupportedAttributePolicy()) {
        case Ignore:
            break;
        case Warn:
            LOG.warn("Unsupported attributes: " + sb.toString());
            break;
        case ThrowException:
            throw new UnsupportedOperationException("Unsupported attributes: " + sb.toString());
        }
    }
}
于 2015-04-22T06:10:28.927 に答える