SSHHelper.cs 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. 
  2. using Microsoft.Extensions.Logging;
  3. using Renci.SshNet;
  4. namespace Admin.NET.Core
  5. {
  6. /// <summary>
  7. /// SSH / Sftp Helper
  8. /// </summary>
  9. public class SSHHelper : IDisposable
  10. {
  11. private SftpClient sftp;
  12. public SSHHelper(string host, int port, string user, string password)
  13. {
  14. sftp = new SftpClient(host, port, user, password);
  15. }
  16. public bool Exists(string ftpFileName)
  17. {
  18. Connect();
  19. return sftp.Exists(ftpFileName);
  20. }
  21. private void Connect()
  22. {
  23. if (!sftp.IsConnected)
  24. {
  25. sftp.Connect();
  26. }
  27. }
  28. /// <summary>
  29. /// 删除
  30. /// </summary>
  31. /// <param name="ftpFileName"></param>
  32. public void DeleteFile(string ftpFileName)
  33. {
  34. Connect();
  35. sftp.DeleteFile(ftpFileName);
  36. }
  37. /// <summary>
  38. /// 下载到指定目录
  39. /// </summary>
  40. /// <param name="ftpFileName"></param>
  41. /// <param name="localFileName"></param>
  42. public void DownloadFile(string ftpFileName, string localFileName)
  43. {
  44. Connect();
  45. using (Stream fileStream = File.OpenWrite(localFileName))
  46. {
  47. sftp.DownloadFile(ftpFileName, fileStream);
  48. }
  49. }
  50. /// <summary>
  51. /// 读取字节
  52. /// </summary>
  53. /// <param name="ftpFileName"></param>
  54. /// <returns></returns>
  55. public byte[] ReadAllBytes(string ftpFileName)
  56. {
  57. Connect();
  58. return sftp.ReadAllBytes(ftpFileName);
  59. }
  60. /// <summary>
  61. /// 读取流
  62. /// </summary>
  63. /// <param name="path"></param>
  64. /// <returns></returns>
  65. public Stream OpenRead(string path)
  66. {
  67. return sftp.Open(path, FileMode.Open, FileAccess.Read);
  68. }
  69. /// <summary>
  70. /// 继续下载
  71. /// </summary>
  72. /// <param name="ftpFileName"></param>
  73. /// <param name="localFileName"></param>
  74. public void DownloadFileWithResume(string ftpFileName, string localFileName)
  75. {
  76. DownloadFile(ftpFileName, localFileName);
  77. }
  78. /// <summary>
  79. /// 重命名
  80. /// </summary>
  81. /// <param name="oldPath"></param>
  82. /// <param name="newPath"></param>
  83. public void RenameFile(string oldPath, string newPath)
  84. {
  85. sftp.RenameFile(oldPath, newPath);
  86. }
  87. /// <summary>
  88. /// 指定目录下文件
  89. /// </summary>
  90. /// <param name="folder"></param>
  91. /// <param name="filters"></param>
  92. /// <returns></returns>
  93. public List<string> GetFileList(string folder, IEnumerable<string> filters)
  94. {
  95. var files = new List<string>();
  96. Connect();
  97. var sftpFiles = sftp.ListDirectory(folder);
  98. foreach (var file in sftpFiles)
  99. {
  100. if (file.IsRegularFile && filters.Any(f => file.Name.EndsWith(f)))
  101. {
  102. files.Add(file.Name);
  103. }
  104. }
  105. return files;
  106. }
  107. /// <summary>
  108. /// 上传指定目录文件
  109. /// </summary>
  110. /// <param name="localFileName"></param>
  111. /// <param name="ftpFileName"></param>
  112. public void UploadFile(string localFileName, string ftpFileName)
  113. {
  114. Connect();
  115. var dir = Path.GetDirectoryName(ftpFileName);
  116. CreateDir(sftp, dir);
  117. using (var fileStream = new FileStream(localFileName, FileMode.Open))
  118. {
  119. sftp.UploadFile(fileStream, ftpFileName);
  120. }
  121. }
  122. /// <summary>
  123. /// 上传字节
  124. /// </summary>
  125. /// <param name="bs"></param>
  126. /// <param name="ftpFileName"></param>
  127. public void UploadFile(byte[] bs, string ftpFileName)
  128. {
  129. Connect();
  130. var dir = Path.GetDirectoryName(ftpFileName);
  131. CreateDir(sftp, dir);
  132. sftp.WriteAllBytes(ftpFileName, bs);
  133. }
  134. /// <summary>
  135. /// 上传流
  136. /// </summary>
  137. /// <param name="fileStream"></param>
  138. /// <param name="ftpFileName"></param>
  139. public void UploadFile(Stream fileStream, string ftpFileName)
  140. {
  141. Connect();
  142. var dir = Path.GetDirectoryName(ftpFileName);
  143. CreateDir(sftp, dir);
  144. sftp.UploadFile(fileStream, ftpFileName);
  145. fileStream.Dispose();
  146. }
  147. /// <summary>
  148. /// 创建目录
  149. /// </summary>
  150. /// <param name="sftp"></param>
  151. /// <param name="dir"></param>
  152. /// <exception cref="ArgumentNullException"></exception>
  153. private void CreateDir(SftpClient sftp, string dir)
  154. {
  155. if (dir is null)
  156. {
  157. throw new ArgumentNullException(nameof(dir));
  158. }
  159. if (!sftp.Exists(dir))
  160. {
  161. var index = dir.LastIndexOfAny(new char[] { '/', '\\' });
  162. if (index > 0)
  163. {
  164. var p = dir.Substring(0, index);
  165. if (!sftp.Exists(p))
  166. {
  167. CreateDir(sftp, p);
  168. }
  169. sftp.CreateDirectory(dir);
  170. }
  171. }
  172. }
  173. public void Dispose()
  174. {
  175. if (sftp != null)
  176. {
  177. if (sftp.IsConnected)
  178. sftp.Disconnect();
  179. sftp.Dispose();
  180. }
  181. }
  182. }
  183. }