2015-10-01 227 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的作者)