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服 ...
随机推荐
- storm源码分析之topology提交过程
storm集群上运行的是一个个topology,一个topology是spouts和bolts组成的图.当我们开发完topology程序后将其打成jar包,然后在shell中执行storm jar x ...
- Entity Framework Code-First(9.5):DataAnnotations - MaxLength Attribute
DataAnnotations - MaxLength Attribute: MaxLength attribute can be applied to a string or array type ...
- IDEA如何启动debug?
选择remote,然后,修改host和port: host是我们访问backstop的ip,端口是监听端口8787,点击ok即可. 打断点,调试,即可.
- datagrid 绑定选中数据,列头全选
成品图: xaml代码 <Grid> <DataGrid x:Name="datagrid" Height="Auto" Width=&quo ...
- DESede/CBC/PKCS5Padding
Java.security.NoSuchAlgorithmException: Cannot find any provider supporting DESede/CBC/PKCS5Padding ...
- Google Coral Edge TPU USB加速棒上手体验
Edge AI是什么?它为何如此重要? 传统意义上,AI解决方案需要强大的并行计算处理能力,长期以来,AI服务都是通过联网在线的云端基于服务器的计算来提供服务.但是具有实时性要求的AI解决方案需要在设 ...
- Hadoop 对MapReduce的理解
对MapReduce的理解 客户端启动一个作业 向JobTraker请求一个JobId 将资源文件复制到HDFS上,包括Jar文件,配置文件,输入划分信息等 接收作业后,进入作业队列,根据输入划分信息 ...
- 小R的棋子
小R的棋子(dp) 数轴上有 n 个位置可以摆放棋子,标号为1,2,3...n.小 R 现在要在一些位置摆放棋子,每个位置最多摆放一个棋子,摆放棋子的总数没有限制.小 R 不希望他摆放的棋子过于拥挤, ...
- Centos下搭建nginx反向代理
上一节已经用编译的方式搭建好了一个nginx,链接在下面 https://www.toutiao.com/i6693130510777975300/ 然后这次我们把上次搭建好的nginx作为反向代理的 ...
- 关于STL库中的max min swap
嗯... 不得不说c++中的STL库是一个神奇的东西 可以使你的代码显得更加简洁.... 今天就只讲STL中的三个鬼畜: max min swap 具体操作 ...