C# sftp通过秘钥上传下载
一、适用场景
我们平时习惯了使用ftp来上传下载文件,尤其是很多Linux环境下,我们一般都会通过第三方的SSH工具连接到Linux,但是当我们需要传输文件到Linux服务器当中,很多人习惯用ftp来传输,其实Linux默认是不提供ftp的,需要你额外安装FTP服务器。而且ftp服务器端会占用一定的VPS服务器资源。其实笔者更建议使用sftp代替ftp。
主要因为:
一、可以不用额外安装任何服务器端程序。
二、会更省系统资源。
三、SFTP使用加密传输认证信息和传输数据,相对来说会更安全。
四、也不需要单独配置,对新手来说比较简单(开启SSH默认就开启了SFTP)。
二、主要区别

string result;
SFTPClass sftp = ToolsService.ConnSFTP("/download/", out result);//最小路径,也属于服务器已经存在的主目录
//链接上传
sftp.Connect();
//判断服务器文件夹是否存在
if (sftp.DirExist("/telSale/") == false)
{
//创建文件夹
sftp.CreateDirectory("/telSale/");
}
if (sftp.DirExist("/telSale/" + DateTime.Now.ToString("yyyyMMdd") + "/") == false)
{ //一级一级的创建
sftp.CreateDirectory("/telSale/" + DateTime.Now.ToString("yyyyMMdd") + "/");
}
if (sftp.DirExist("/telSale/" + DateTime.Now.ToString("yyyyMMdd") + "/insPolicy/") == false)
{
sftp.CreateDirectory("/telSale/" + DateTime.Now.ToString("yyyyMMdd") + "/insPolicy/");
}
//上传
sftp.Put("D:\\sftp_put\\insPolicy.txt");//全文件名 文件支持各种格式
sftp.Disconnect();
//-----------------------下载-----------------------------------------
//链接
SFTPClass sftpx = ToolsService.ConnSFTP("/upload/telSale /" + DateTime.Now.ToString("yyyyMMdd") + "/insPolicy/", out result);//最小路径,也属于服务器已经存在的主目录
sftpx.Connect(); sftpx.Get("insPolicy.txt", "D:\\sftp_put\\upload");//第一个服务器文件名,第二个下载到哪里 sftpx.Disconnect();
/// <summary>
/// 连接SFTP,自动获取app.xml中的指定配置,创建好一个sftp
/// sftp在使用操作前需要调用Connect方法,在不需要的时候要使用DisConnect,中间过程不需要断开连接
/// </summary>
/// <param name="ftpname">app.xml中配置的ftp名称</param>
/// <param name="remotePath">FTP上的路径,不包含文件名,初始化的时候设置,一次连接长期使用.</param>
/// <returns>创建成功,则返回SFTP实例</returns>
public static SFTPClass ConnSFTP(string remotePath, out string errorMsg)
{
errorMsg = "";
try
{
//采用ip跟用户名,公钥私钥的方式访问sftp,密码传递空,如果使用密码方式,要传递密码,私钥公钥方式可去除
string url = "211.101.11.33";
string username = "trade_name";
string password = null;
SFTPClass sftp = new SFTPClass(url, username, password, remotePath); return sftp;
}
catch (Exception e)
{
errorMsg = e.Message; return null;
}
}
using System;
using System.Text;
using Tamir.SharpSsh.jsch; namespace Tms.Utils
{
public class SFTPClass
{
private Session m_session;
private Channel m_channel;
private ChannelSftp m_sftp;
private string remotePath = "/";//FTP上的路径,不包含文件名,路径应为"/" //private Tamir.SharpSsh.jsch.examples.Sftp.MyProgressMonitor m_monitor;
private static readonly string defRemotePath = "/download/";//默认操作是都是从根目录开始。 /// <summary>
/// 实例化SFTP, 用于创建连接对象
/// </summary>
/// <param name="host">sftp IP地址</param>
/// <param name="user">用户名</param>
/// <param name="pwd">密码</param>
/// <param name="ftpPath">FTP上的路径</param>
public SFTPClass(string host, string user, string pwd, string ftpPath)
{
string[] arr = host.Split(':');
string ip = arr[];
int port = ;//端口号替换
if (arr.Length > ) port = Int32.Parse(arr[]); JSch jsch = new JSch();
jsch.addIdentity("D:\\MTS-SFTP\\Privite-Key\\Identity");//将私钥配置在客户端,这个配置的是私钥,公钥配置在了服务端 m_session = jsch.getSession(user, ip, port);
MyUserInfo ui = new MyUserInfo();
ui.setPassword(pwd);
m_session.setUserInfo(ui);
if (!string.IsNullOrEmpty(ftpPath))
this.remotePath = ftpPath;
} /// <summary>
/// SFTP连接状态
/// </summary>
public bool Connected { get { return m_session.isConnected(); } } /// <summary>
/// 连接SFTP
/// </summary>
/// <returns></returns>
public bool Connect()
{
if (!Connected)
{
m_session.connect();
m_channel = m_session.openChannel("sftp");
m_channel.connect();
m_sftp = (ChannelSftp)m_channel;
}
return true;
} /// <summary>
/// 断开SFTP
/// </summary>
public void Disconnect()
{
if (Connected)
{
m_channel.disconnect();
m_session.disconnect();
}
} /// <summary>
/// 向SFTP存放文件
/// </summary>
/// <param name="localPath">要上传FTP的文件全路径,包含文件名</param>
/// <returns></returns>
public bool Put(string localPath)
{
string path = "/download/telSale/" + DateTime.Now.ToString("yyyyMMdd") + "/insPolicy/";
Tamir.SharpSsh.java.String src = new Tamir.SharpSsh.java.String(localPath);
Tamir.SharpSsh.java.String dst = new Tamir.SharpSsh.java.String(path);
m_sftp.put(src, dst); return true;
} /// <summary>
/// SFTP获取文件
/// </summary>
/// <param name="filename">FTP上的文件名,不需要包含路径</param>
/// <param name="localPath">保存放文件的本地路径</param>
/// <returns></returns>
public bool Get(string filename, string localPath)
{
Tamir.SharpSsh.java.String src = new Tamir.SharpSsh.java.String(this.remotePath + filename);
Tamir.SharpSsh.java.String dst = new Tamir.SharpSsh.java.String(localPath);
//m_sftp.get(src, dst, m_monitor, ChannelSftp.OVERWRITE);
m_sftp.get(src, dst); return true;
} /// <summary>
/// 删除SFTP上的文件
/// </summary>
/// <param name="fileName"></param>
/// <returns></returns>
public bool Delete(string fileName)
{
m_sftp.rm(this.remotePath + fileName); return true;
} /// <summary>
/// 目录是否存在
/// </summary>
/// <param name="dirName">目录名称必须从根开始</param>
/// <returns></returns>
public bool Exist(string dirName)
{
m_sftp.ls(dirName); return true;
}
/// <summary>
/// 判断目录是否存在 建议使用这个
/// </summary>
/// <param name="dirName"></param>
/// <returns></returns>
public bool DirExist(string dirName)
{
try
{
m_sftp.ls(defRemotePath + dirName.Trim());
return true;
}
catch (Tamir.SharpSsh.jsch.SftpException)
{
return false;//执行ls命令时出错,则目录不存在。
}
} /// <summary>
/// 创建目录
/// </summary>
/// <param name="dirName">目录名称必须从根开始</param>
/// <returns></returns>
public void CreateDirectory(string dirName)
{
bool isExist = false;
Tamir.SharpSsh.java.util.Vector vvv = m_sftp.ls(defRemotePath);
foreach (Tamir.SharpSsh.jsch.ChannelSftp.LsEntry fileName in vvv)
{
string name = fileName.getFilename();
if (name == dirName.Trim('/'))
{
isExist = true;
}
}
if (!isExist)
{
m_sftp.mkdir(defRemotePath + dirName.Trim());
}
} /// <summary>
/// 获取SFTP文件名称列表
/// </summary>
/// <param name="remotePath">SFTP路径</param>
/// <returns></returns>
public string[] GetFileList()
{
try
{
Tamir.SharpSsh.java.util.Vector vector = m_sftp.ls(this.remotePath);
StringBuilder fileNames = new StringBuilder();
foreach (Tamir.SharpSsh.jsch.ChannelSftp.LsEntry q in vector)
{
string fileName = q.getFilename();
fileNames.Append(fileName);
fileNames.Append("\n");
}
fileNames.Remove(fileNames.ToString().LastIndexOf('\n'), ); return fileNames.ToString().Split('\n'); ;
}
catch
{
this.Disconnect();
return null;
}
} //登录验证信息
public class MyUserInfo : UserInfo
{
String passwd;
public String getPassword() { return passwd; }
public void setPassword(String passwd) { this.passwd = passwd; } public String getPassphrase() { return null; }
public bool promptPassphrase(String message) { return true; } public bool promptPassword(String message) { return true; }
public bool promptYesNo(String message) { return true; }
public void showMessage(String message) { }
}
}
}
C# sftp通过秘钥上传下载的更多相关文章
- SFTP远程连接服务器上传下载文件-qt4.8.0-vs2010编译器-项目实例
本项目仅测试远程连接服务器,支持上传,下载文件,更多功能开发请看API自行开发. 环境:win7系统,Qt4.8.0版本,vs2010编译器 qt4.8.0-vs2010编译器项目实例下载地址:CSD ...
- SFTP远程连接服务器上传下载文件-vs2010项目实例
本项目仅测试远程连接服务器,支持上传,下载文件,更多功能开发请看API自行开发. 环境:win7系统,vs2010 vs2010项目实例下载地址:CSDN下载 如果没有CSDN积分,百度网盘下载(密码 ...
- SFTP远程连接服务器上传下载文件-vs2013项目实例
本项目仅测试远程连接服务器,支持上传,下载文件,更多功能开发请看API自行开发. 环境:win7系统,vs2013 vs2013项目实例下载地址:CSDN下载 如果没有CSDN积分,百度网盘下载(密码 ...
- 用C#连接SFTP服务器并进行上传下载文件
1.使用软件连接可采用WinSCP进行: 文件协议选择SFTP,端口号默认22 2.使用C#代码操作 参考:http://www.cnblogs.com/binw/p/4065642.html 主要引 ...
- java实操之使用jcraft进行sftp上传下载文件
sftp作为临时的文件存储位置,在某些场合还是有其应景的,比如对账文件存放.需要提供一个上传的工具类.实现方法参考下: pom.xml中引入类库: <dependency> <gro ...
- Java使用SFTP和FTP两种连接方式实现对服务器的上传下载 【我改】
[]如何区分是需要使用SFTP还是FTP? []我觉得: 1.看是否已知私钥. SFTP 和 FTP 最主要的区别就是 SFTP 有私钥,也就是在创建连接对象时,SFTP 除了用户名和密码外还需要知道 ...
- Huawei-R&S-网络工程师实验笔记20190530-FTP上传下载、STelnet登录、SFTP登录
>Huawei-R&S-网络工程师实验笔记20190530-FTP上传下载.STelnet登录.SFTP登录 >>实验开始,参考<Huawei-R&S-网络工程 ...
- 【转】Android 服务器之SFTP服务器上传下载功能
原文网址:http://blog.csdn.net/tanghua0809/article/details/47056327 本文主要是讲解Android服务器之SFTP服务器的上传下载功能,也是对之 ...
- THINKPHP 3.2 PHP SFTP上传下载 代码实现方法
一.SFTP介绍:使用SSH协议进行FTP传输的协议叫SFTP(安全文件传输)Sftp和Ftp都是文件传输协议.区别:sftp是ssh内含的协议(ssh是加密的telnet协议), 只要sshd服 ...
随机推荐
- 5.6 安装SqlDeveloper
首先,将安装包准备好: 打开终端: 这样,sqldeveloper就安装完毕了. 在Ubuntu中搜索,sql,会出现: 点击,可以进入:
- [转]简短介绍 C# 6 的新特性
原文地址:http://www.oschina.net/translate/briefly-exploring-csharp-new-features 几周前我在不同的地方读到了有关C#6的一些新特性 ...
- Yum本地源制作
参考文档 环境准备 # cat /etc/os-release NAME="CentOS Linux" VERSION="7 (Core)" ID=" ...
- XML之DTD
前言 上篇我们知道了,XML的应用范围还是很广的,那么无规矩不成方圆,如果我们每个人写XML的风格不一致,那么读起来是不是很费劲呢?所以格式良好的XML就渐渐的被我们所需要. 内容 格式良好指:拥有正 ...
- SQL Server远程调试失败
前言 刚刚打开SQL Server 2008,想要新建一个数据库.发现出现了一个问题,这个问题由于之前没有遇到过,所以这次拿出来记录一些解决方式. 内容 出现上面这个错误的原因可能是由于咱们在装VS2 ...
- [Xcode 实际操作]三、视图控制器-(11)在Storyboard中使用表格控件
目录:[Swift]Xcode实际操作 本文将演示表格控件在故事板中的使用. 点击[显示或隐藏检查器按钮],再界面右侧打开检查器面板. 在控制器根视图上点击鼠标,以选择该根视图. 现在往根视图中添加一 ...
- 如何在app里利用js调取手机第三方地图--以高德地图和百度地图为例(2)
接着上篇文章说一下js调取第三方地图的问题,上次的方式是通过一个链接直接接到了第三方的web页面,又从第三方的web页面调用的第三方app;结果,这个方法被否定了,因为需求不是这样,需求直接就想调用第 ...
- 今天实现一个T-sql的小编程,分享给大家,看看就好~(列值赋值)
介绍:将一个表的某列值插入到另一个表的列里,暂定为表aa和表nn DECLARE @a int set @a=1 while @a<nn.列1.length --(注:语法不对你可以用查询 ...
- 安居客scrapy房产信息爬取到数据可视化(下)-可视化代码
接上篇:安居客scrapy房产信息爬取到数据可视化(下)-可视化代码,可视化的实现~ 先看看保存的数据吧~ 本人之前都是习惯把爬到的数据保存到本地json文件, 这次保存到数据库后发现使用mongod ...
- java insert mysql 中文乱码
jdbc:mysql://192.168.1.77:3306/db360?useUnicode=true&characterEncoding=UTF-8 drop database if ex ...