我使用Apache Mina SSHD启动本地SFTP服务器。这是我的相关code。为了测试我使用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服务器时如何克服上述问题。感谢。
答案 0 :(得分: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());
}
}
}