2015-10-01 28 views
0

我正在使用C#和Renci.SshNet打开SFTP连接。我可以很好地获取文件的属性,包括文件的所有者和组。然而,它们是整数,并且弄清楚用户可以做什么需要知道他们的用户ID和组ID。这是从Windows机器上完成的,因此信息不易获得。如何在没有用户在* nix机器上手动运行id -uid -g的情况下获取用户标识和组ID?使用SFTP获取用户名和组名

回答

0

Renci SSH.NET库使用SFTP协议版本3.在此版本的协议中,只有GID和UID号码作为不同的值提供。

用户名和组名在SFTP协议版本4和更新版本中提供。但是,即使SSH.NET确实支持这个版本的协议,它也没有什么帮助,因为大多数SFTP服务器(特别是OpenSSH)只支持版本3。


有一个在SFTP 3版本,其中OpenSSH服务器提供的* nix ls般的记录文件中的上市提供了longname领域。所以它包含用户名和组名。只是记录的格式是平台特定的。 SSH.NET只是忽略了这个字段,并没有试图解析它(实际上它不会被解析)。见注释“这个字段的值无意义的信息”,在SftpNameResponse.LoadData()

protected override void LoadData() 
{ 
    ... 
    for (int i = 0; i < this.Count; i++) 
    { 
     var fileName = this.ReadString(this.Encoding); 
     this.ReadString(); // This field value has meaningless information 
     ... 
    } 
} 

如果你真的需要的价值,你可以考虑切换到WinSCP .NET assembly,它采用了longname领域,并暴露用户名以及RemoteFileInfo class.Owner.Group属性中的组名称。

使用Session.ListDirectory检索列表。

RemoteDirectoryInfo directory = session.ListDirectory("/home/martin/public_html"); 

foreach (RemoteFileInfo fileInfo in directory.Files) 
{ 
    Console.WriteLine("{0} owned by {1}:{2}", 
     fileInfo.Name, fileInfo.Owner, fileInfo.Group); 
} 

如果您的服务器支持它,WinSCP支持SFTP版本4-6。

(我是WinSCP的作者)