Чтение расширенных атрибутов файлов файлов на SFTP-сервере с помощью JSch

Я хочу прочитать расширенные атрибуты файла, используя com.jcraft.JSch 0.1.55 (файл находится на SFTP-сервере). Я знаю, что у класса SftpATTR действительно есть метод

public String[] getExtended()

но в моем случае он возвращает ноль.

Я вижу это в этом коде

static SftpATTRS getATTR(Buffer buf){
    SftpATTRS attr=new SftpATTRS(); 
    attr.flags=buf.getInt();
    if((attr.flags&SSH_FILEXFER_ATTR_SIZE)!=0){ attr.size=buf.getLong(); }
    if((attr.flags&SSH_FILEXFER_ATTR_UIDGID)!=0){
      attr.uid=buf.getInt(); attr.gid=buf.getInt();
    }
    if((attr.flags&SSH_FILEXFER_ATTR_PERMISSIONS)!=0){ 
      attr.permissions=buf.getInt();
    }
    if((attr.flags&SSH_FILEXFER_ATTR_ACMODTIME)!=0){ 
      attr.atime=buf.getInt();
    }
    if((attr.flags&SSH_FILEXFER_ATTR_ACMODTIME)!=0){ 
      attr.mtime=buf.getInt(); 
    }
    if((attr.flags&SSH_FILEXFER_ATTR_EXTENDED)!=0){
      int count=buf.getInt();
      if(count>0){
    attr.extended=new String[count*2];
    for(int i=0; i<count; i++){
      attr.extended[i*2]=Util.byte2str(buf.getString());
      attr.extended[i*2+1]=Util.byte2str(buf.getString());
    }
      }
    }
    return attr;
  } 

последний оператор if отвечает за чтение расширенных атрибутов, но мне кажется, что он всегда оценивается как false, потому что

int flags=0;

а также

public static final int SSH_FILEXFER_ATTR_EXTENDED=     0x80000000;

Я не могу изменить флаги напрямую, потому что у его установщика нет общедоступного модификатора.

Есть ли другой способ изменить флаги или как-то прочитать расширенные атрибуты?


person jaros    schedule 09.10.2019    source источник
comment
И предоставляет ли ваш SFTP-сервер какие-либо расширенные атрибуты? Что это за сервер?   -  person Martin Prikryl    schedule 09.10.2019
comment
@MartinPrikryl Если я не ошибаюсь, sftp-сервер является частью пакета SSH, который является OpenSSH_7.4p1 на моем Centos 7. Я вижу, вы уже ответили на аналогичный вопрос в stackoverflow.com/questions/48687079/ . К сожалению, этот sftp-сервер, похоже, не поддерживает расширенные атрибуты файлов.   -  person jaros    schedule 09.10.2019
comment
Это похоже на проблему XY. Что вы пытаетесь реализовать?   -  person Martin Prikryl    schedule 09.10.2019
comment
@MartinPrikryl Хорошо, я буду доставлять пакеты .tar.gz на sftp-сервер. Я хочу периодически распаковывать их в одну и ту же папку с помощью скрипта bash. Затем я получу файлы результатов с входящей конечной точкой wso2 (это требование). Дополнительным требованием является знать, из какого пакета .tar.gz они происходят. Это то, что я хотел сохранить в расширенном атрибуте.   -  person jaros    schedule 09.10.2019
comment
Вы имеете в виду в расширенный атрибут файловой системы?   -  person Martin Prikryl    schedule 09.10.2019
comment
@MartinPrikryl Да, знаю. Я установил их командой attr. Это не то, что может вернуть метод JSch getExtended(), не так ли?   -  person jaros    schedule 09.10.2019


Ответы (1)


Похоже, вы предполагаете, что "расширенные атрибуты" SFTP являются "file системные расширенные атрибуты".

Они не.

"расширенные атрибуты" SFTP — это механизм расширения, с помощью которого SFTP-сервер может предоставлять или устанавливать дополнительные атрибуты для файлов, которые не являются частью стандартных атрибутов файлов SFTP.

Они действительно теоретически могут быть сопоставлены с расширенными атрибутами файловой системы. Но на самом деле большинство SFTP-серверов, и особенно самый распространенный OpenSSH, вообще не поддерживают никаких расширенных атрибутов SFTP, если только расширенные атрибуты файловой системы. См. также Установка расширенных атрибутов файла с помощью SSH.NET SftpClient.

person Martin Prikryl    schedule 09.10.2019