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服 ...
随机推荐
- JavaScript学习系列4 ----- JavaScript中的扩展运算符 三个点(...)
在JavaScript中, ES6开始有rest参数 和 三个点扩展运算符 (spread运算符) 我们来看看他们各自的用处 1. rest参数 rest参数的形式为 ...变量名 ...
- matlab矩阵与数组
数组运算:数与数组加减:k+/-A %k加或减A的每个元素数组乘数组: A.*B %对应元素相乘数组乘方: A.^k %A的每个元素k次方:k.^A,分别以k为底A的各元素为指数求幂值数除以数组: k ...
- docker 推送镜像到私有地址
下面针对的都是docker官网的地址 先登录 docker login 输入docker ID ID不是你的注册邮箱,指的是你登录后显示的ID,然后输入密码 ....此时认为你已经登陆成功了 接着看下 ...
- css 实现三级联动菜单
昨天因为项目中想要把二级联动菜单改成三级联动菜单,所以我就单独写了一个tab导航栏,用纯css的方式实现的三级联动.一开始我想着可以用js实现,但是js的hover事件和mouseenter,mous ...
- ora2pg oracle迁移postgresql工具
windows下安装 1. 安装strawberry-perl-5.24.3.1-64bit.msi 2. ora2pg-18.2.zip 解压缩cd 进入目录perl Makefile.PLdmak ...
- angularJs中对时间戳的处理
一. ng表达式 <!-- 表达式中使用 --> {{ dt1 | date:'yyyy-MM-dd HH:mm:ss' }} 二. 控制器中使用 //controller必须注入 $fi ...
- P2742 【模板】二维凸包 / [USACO5.1]圈奶牛Fencing the Cows
题意:n个点,求凸包周长.(纯板子QAQ) 定义 凸包:用最小的凸多边形将n个点围在里面的图形为凸包 前置 向量:点积:(a,b) (c,d)=(a*c,b*d) =|(a,b)|*|(c,d)|*c ...
- Java 实现大转盘抽奖
需要用到 JAVA中的Random()函数 注意:大转盘抽奖各奖项中奖概率之和为 1.奖品列表中的概率为累加概率,需要按照添加进列表的顺序进行累加,添加顺序不做要求. 实际中使用需要考虑奖品数量限制等 ...
- springBoot2.0 配置@ControllerAdvice 捕获异常统一处理
一.前言 基于上一篇 springBoot2.0 配置shiro实现权限管理 这一篇配置 异常统一处理 二.新建文件夹:common,param 三.返回结果集对象 1.ResultData.java ...
- EOS 用户权限相关命令
首先,环境相关的配置请参考https://www.cnblogs.com/hbright/p/9266420.html 在这里,我们一起看年EOS权限相关的东东.我们先查看hml这个用户的相关信息 h ...