1、SSH.NET安装引用
使用Nuget管理工具搜索"SSH.NET"=>找到选择安装
相关文档:VS(Visual Studio)中Nuget的使用
2、SSH.NET操作代码
using Renci.SshNet; using Renci.SshNet.Sftp; using System; using System.Collections; using System.Collections.Generic; using System.IO; namespace ConsoleApplication1 { public class SFtp { private SftpClient sftp; /// <summary> /// 连接状态 /// </summary> public bool Connected { get { return this.sftp.IsConnected; } } /// <summary> /// /// </summary> /// <param name="host">sftp的IP</param> /// <param name="port">sftp的端口</param> /// <param name="username">sftp的帐户</param> /// <param name="password">sftp的密码</param> public SFtp(string host, int port, string username, string password) { this.sftp = new SftpClient(host, port, username, password); } /// <summary> /// 连接sftp服务器 /// </summary> /// <returns>连接状态</returns> public bool Connect() { bool result; try { bool flag = !this.Connected; if (flag) { this.sftp.Connect(); } result = true; } catch (Exception ex) { throw new Exception(string.Format("连接SFTP失败,原因:{0}", ex.Message)); } return result; } /// <summary> /// 断开连接 /// </summary> public void Disconnect() { try { bool flag = this.sftp != null && this.Connected; if (flag) { this.sftp.Disconnect(); } } catch (Exception ex) { throw new Exception(string.Format("断开SFTP失败,原因:{0}", ex.Message)); } } /// <summary> /// 上传文件 /// </summary> /// <param name="localPath">本地文件路径</param> /// <param name="remotePath">服务器端文件路径</param> public void Put(string localPath, string remotePath) { try { using (FileStream fileStream = File.OpenRead(localPath)) { this.Connect(); this.sftp.UploadFile(fileStream, remotePath, null); this.Disconnect(); } } catch (Exception ex) { throw new Exception(string.Format("SFTP文件上传失败,原因:{0}", ex.Message)); } } /// <summary> /// 上传文字字节数据 /// </summary> /// <param name="fileByteArr">文件内容字节</param> /// <param name="remotePath">上传到服务器的路径</param> public void Put(byte[] fileByteArr, string remotePath) { try { Stream input = new MemoryStream(fileByteArr); this.Connect(); this.sftp.UploadFile(input, remotePath, null); this.Disconnect(); } catch (Exception ex) { throw new Exception(string.Format("SFTP文件上传失败,原因:{0}", ex.Message)); } } /// <summary> /// 将sftp服务器的文件下载本地 /// </summary> /// <param name="remotePath">服务器上的路径</param> /// <param name="localPath">本地的路径</param> public void Get(string remotePath, string localPath) { try { this.Connect(); byte[] bytes = this.sftp.ReadAllBytes(remotePath); this.Disconnect(); File.WriteAllBytes(localPath, bytes); } catch (Exception ex) { throw new Exception(string.Format("SFTP文件获取失败,原因:{0}", ex.Message)); } } /// <summary> /// 删除ftp服务器上的文件 /// </summary> /// <param name="remoteFile">服务器上的路径</param> public void Delete(string remoteFile) { try { this.Connect(); this.sftp.Delete(remoteFile); this.Disconnect(); } catch (Exception ex) { throw new Exception(string.Format("SFTP文件删除失败,原因:{0}", ex.Message)); } } /// <summary> /// 获取ftp服务器上指定路径上的指定前缀的文件名列表 /// </summary> /// <param name="remotePath">服务器上的路径</param> /// <param name="fileSuffix">文件名前缀</param> /// <returns></returns> public List<string> GetFileList(string remotePath, string fileSuffix) { List<string> result; try { this.Connect(); IEnumerable<SftpFile> enumerable = this.sftp.ListDirectory(remotePath, null); this.Disconnect(); result = new List<string>(); foreach (SftpFile current in enumerable) { string name = current.Name; bool flag = name.Length > fileSuffix.Length + 1 && fileSuffix == name.Substring(name.Length - fileSuffix.Length); if (flag) { result.Add(name); } } } catch (Exception ex) { throw new Exception(string.Format("SFTP文件列表获取失败,原因:{0}", ex.Message)); } return result; } /// <summary> /// ftp服务器端文件移动 /// </summary> /// <param name="oldRemotePath">原来服务器上路径</param> /// <param name="newRemotePath">移动后服务器上新路径</param> public void Move(string oldRemotePath, string newRemotePath) { try { this.Connect(); this.sftp.RenameFile(oldRemotePath, newRemotePath); this.Disconnect(); } catch (Exception ex) { throw new Exception(string.Format("SFTP文件移动失败,原因:{0}", ex.Message)); } } } }
相关文档:.NET Core通过SSH.NET实现sftp通过ssh上传下载文件代码