.net - 使用SFTP获取用户名和组名

标签 .net ssh sftp guid uid

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

最佳答案

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

用户名和组名仅在 SFTP 协议(protocol)版本 4 及更高版本中提供。但即使 SSH.NET 确实支持该版本的协议(protocol),也不会真正有帮助,因为大多数 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
        ...
    }
}

如果你确实需要这个值,你可以考虑切换到 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 的作者)

关于.net - 使用SFTP获取用户名和组名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32889525/

相关文章:

powershell - WinSCP 在 PowerShell 中禁用 ResumeSupport

linux - 以 root 身份登录 EC2 实例

c# - Server.MapPath VS。 @Href ("~/SomeFile.cshtml")

c# - 如何自动创建属性?

c# - 如何编写一个公开公共(public)命名空间的命名空间,以避免在 C#.NET 中使用多个 using 语句

linux - 通过 ssh 连接找不到 Bash、别名/自定义函数

linux - ~/.ssh/config 文件中的 SSH 端口转发?

python - 使用 Python 通过 SFTP 上传文件

.net - 如何向 .NET 应用程序添加安全的 FTP 功能

c# - ADO.NET 数据服务的数据压缩