使用 JSch 读取 SFTP 服务器上文件的文件扩展属性
Read file extended attributes of files on SFTP server with JSch
我想使用 com.jcraft.JSch 0.1.55 读取文件扩展属性(文件在 SFTP 服务器上)。我知道 class SftpATTR
实际上确实有一个方法
public String[] getExtended()
但在我的情况下 returns 无效。
我在这段代码中看到了
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;
我无法直接更改标志,因为它 setter 没有 public 修饰符。
是否有另一种方法来更改标志或以某种方式读取扩展属性?
您似乎假设 SFTP "extended attributes" 是 "file system extended attributes"。
他们不是。
SFTP "extended attributes" 是一种扩展机制,通过它 SFTP 服务器可以提供或设置文件的附加属性,这些属性不是标准 SFTP 文件的一部分属性。
它们确实可以理论上 映射到文件系统扩展属性。但实际上大多数 SFTP 服务器,尤其是最广泛使用的 OpenSSH,根本不支持任何 SFTP 扩展属性,只支持文件系统扩展属性。
另见 。
我想使用 com.jcraft.JSch 0.1.55 读取文件扩展属性(文件在 SFTP 服务器上)。我知道 class SftpATTR
实际上确实有一个方法
public String[] getExtended()
但在我的情况下 returns 无效。
我在这段代码中看到了
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;
我无法直接更改标志,因为它 setter 没有 public 修饰符。
是否有另一种方法来更改标志或以某种方式读取扩展属性?
您似乎假设 SFTP "extended attributes" 是 "file system extended attributes"。
他们不是。
SFTP "extended attributes" 是一种扩展机制,通过它 SFTP 服务器可以提供或设置文件的附加属性,这些属性不是标准 SFTP 文件的一部分属性。
它们确实可以理论上 映射到文件系统扩展属性。但实际上大多数 SFTP 服务器,尤其是最广泛使用的 OpenSSH,根本不支持任何 SFTP 扩展属性,只支持文件系统扩展属性。
另见