2015-04-22 5 views
1

Я запускаю локальный SFTP-сервер, используя Apache Mina SSHD. Вот мои связанные code. Для тестирования я использую WinSCP в качестве моего SFTP-клиента. Я могу подключиться к серверу успешно и также просматривать корневой каталог сервера. Но проблема заключалась в том, что при попытке загрузить файл в корневой каталог сервера.UnsupportedOperationException в NativeSshFile.setAttributes при загрузке файлов Apache Mina sshd Server

Я получил

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. Благодарю.

ответ

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()); 
     } 
    } 
} 
+0

Благодаря @Martin Prikryl.But проблема заключается в том, что я изменил ** Sshd-ядро ** 0.10.0 в 0.14.0 версии, но некоторые из методов отменяют не при условии, чтобы настроить корневой directory.eg : ** sshd.setFileSystemFactory (новый NativeFileSystemFactory() { \t \t \t Override \t \t \t общественного FileSystemView createFileSystemView (заключительная сессия сессия) { \t \t \t \t возвращение новый NativeFileSystemView (сессия.GetUserName(), ложные) { \t \t \t \t \t Override \t \t \t \t \t общественности Строка getVirtualUserDir() { \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t возвращение "C:/rootdirectory"; \t \t \t \t \t} \t \t \t \t}; \t \t \t}; \t \t}); ** – gihan

+0

Но это не относится к этому вопросу. Если у вас есть проблема с переопределяющими методами 'NativeFileSystemView' в 0.14.0, задайте отдельный вопрос. Я верю в этот вопрос. –

+0

Да @Martin Prikryl, который был моим предыдущим вопросом, чтобы установить root в apache mina.That ответ работает только для версии 0.10.0. Но не может применяться в версии 0.14.0. (Нет метода переопределения методов на getVirtualUserDir()). http://stackoverflow.com/questions/29389249/how-to-set-root-directory-in-apache-mina-sshd-server-in-java Я подниму новый вопрос на версию 0.14.0. Спасибо Мартину за вашу помощь. – gihan

Смежные вопросы