使用SFTP获取用户名和组名

时间:2015-10-01 13:58:54

标签: .net ssh sftp guid uid

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

1 个答案:

答案 0 :(得分:1)

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

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

SFTP版本3的列表中提供了longname字段,其中OpenSSH服务器为文件提供了* nix ls类记录。所以它确实包含用户名和组名。只是记录的格式是特定于平台的。 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
        ...
    }
}

如果您确实需要该值,可以考虑切换到使用longname字段的WinSCP .NET assembly,并在.Owner.Group中公开用户名和组名称RemoteFileInfo class的属性。

使用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的作者)