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服 ...
随机推荐
- 【jeasyui5】样式:调整页面显示的顶部菜单和左侧菜单
1.顶部菜单修改:修改index2.js里面的InitTopMenu方法,将icon +2 2.左侧菜单宽度调整: 修改index.html,加上width:170的定长 <!-- 左侧菜单 - ...
- js常用知识点汇总
1.json字符串与json对象相互转化(转至:http://www.jb51.net/article/43136.htm) SON字符串: var str1 = '{ "name" ...
- Sharepoint2013商务智能学习笔记之Secure Store Service服务配置(二)
Secure Store Service 是运行在应用程序服务器上的授权服务,它提供一个存储用户凭据的数据库,Secure Store Service 在商务智能中的地位很重要,Sharepoint商 ...
- 【Android-stdio-appdemo搭建记录】
1-如何删除存在的工程 2-创建Android项目 next设置app兼容最低版本:api15--android 4.0以上 创建活动页面 设置活动页面的名称 创建成功项目以后会有最基本的layout ...
- JSP自学笔记
基础语法 1.对比 JSP:java平台安全性高,适合开发大型的.企业级的web应用程序: ASP.net:.NET平台简单易学,安全性和跨平台性差: PHP:简单高效,成本低,开发周期短,适合中小型 ...
- MCP|LQD|Data-independent acquisition improves quantitative cross-linking mass spectrometry (DIA方法可提升交联质谱定量分析)
文献名:Data-independent acquisition improves quantitative cross-linking mass spectrometry (DIA方法可提升定量交联 ...
- spring boot 使用WebSocket与前端进行byte字节数组交互
一.装逼前先热热身 无论是比较传统的 web项目 还是近几年流行的前后端分离,后端只独立提供数据交互接口服务的项目,都避免不了数据之间交互格式的选择. 从很早之前的 xml 格式 到现在最火热的jso ...
- 文本处理三剑客之gawk
gawk 作者:Aho, Weinberger, Kernighan 版本: GNU awk:gawk New awk:nawk 简介:格式化文本输出工具,模式扫描及处理语言:报告生成器. 用法:ga ...
- 退役or延期退役
究竟是\(150\)天后退役,还是能继续续命呢? 一切看自己了!加油!\(cyh\)!千万不要败在别人的只言片语之下啊!
- python抓取知乎热榜
知乎热榜讨论话题,https://www.zhihu.com/hot,本文用python抓取下来分析 #!/usr/bin/python # -*- coding: UTF-8 -*- from ur ...