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