我正在使用 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/