C# Sftp操作
SFTP释义-----引自百度百科
sftp是Secure File Transfer Protocol的缩写,安全文件传送协议。可以为传输文件提供一种安全的网络的加密方法。sftp 与 ftp 有着几乎一样的语法和功能。SFTP 为 SSH的其中一部分,是一种传输档案至 Blogger 伺服器的安全方式。其实在SSH软件包中,已经包含了一个叫作SFTP(Secure File Transfer Protocol)的安全文件信息传输子系统,SFTP本身没有单独的守护进程,它必须使用sshd守护进程(端口号默认是22)来完成相应的连接和答复操作,所以从某种意义上来说,SFTP并不像一个服务器程序,而更像是一个客户端程序。SFTP同样是使用加密传输认证信息和传输的数据,所以,使用SFTP是非常安全的。但是,由于这种传输方式使用了加密/解密技术,所以传输效率比普通的FTP要低得多,如果您对网络安全性要求更高时,可以使用SFTP代替FTP。
准备
Sftp的上传下载等操作用到了C#的第三方类库SharpSSH,需要添加压缩包中的3个dll文件 (Tamir.SharpSSH.dll、Org.Mentalis.Security.dll、DiffieHellman.dll) 下载地址
在这里给大家介绍微软的一款工具ILMerge,它可以用来将多个dll合并或将dll合并进winform生成的exe程序,笔者这里用来合并上面3个dll,以减少项目的引用方便管理
SftpHelper类-----亲测通过
class sftpHelper
{
private Session m_session;
private Channel m_channel;
private ChannelSftp m_sftp; /// <summary>
/// 构造函数
/// </summary>
/// <param name="ip">sftp地址</param>
/// <param name="user">sftp用户名</param>
/// <param name="pwd">sftp密码</param>
/// <param name="port">端口,默认20</param>
public sftpHelper(string ip, string user, string pwd, string port = "")
{
int serverport = Int32.Parse(port); JSch jsch = new JSch();
m_session = jsch.getSession(user, ip, serverport); MyUserInfo ui = new MyUserInfo();
ui.setPassword(pwd);
m_session.setUserInfo(ui);
} /// <summary>
/// 连接状态
/// </summary>
public bool Connected { get { return m_session.isConnected(); } } /// <summary>
/// 连接SFTP
/// </summary>
public bool Connect()
{
try
{
if (!Connected)
{
m_session.connect();
m_channel = m_session.openChannel("sftp");
m_channel.connect();
m_sftp = (ChannelSftp)m_channel;
}
return true;
}
catch (Exception ex)
{
return false;
}
} /// <summary>
/// 断开SFTP
/// </summary>
public void Disconnect()
{
if (Connected)
{
m_channel.disconnect();
m_session.disconnect();
}
} /// <summary>
/// SFTP存放文件
/// </summary>
/// <param name="localPath">本地文件路径</param>
/// <param name="remotePath">sftp远程地址</param>
public bool Put(string localPath, string remotePath)
{
try
{
if (this.Connected)
{
Tamir.SharpSsh.java.String src = new Tamir.SharpSsh.java.String(localPath);
Tamir.SharpSsh.java.String dst = new Tamir.SharpSsh.java.String(remotePath);
m_sftp.put(src, dst);
return true;
}
}
catch (Exception ex)
{
return false;
}
return false;
} /// <summary>
/// SFTP获取文件
/// </summary>
/// <param name="remotePath">sftp远程文件地址</param>
/// <param name="localPath">本地文件存放路径</param>
public bool Get(string remotePath, string localPath)
{
try
{
if (this.Connected)
{
Tamir.SharpSsh.java.String src = new Tamir.SharpSsh.java.String(remotePath);
Tamir.SharpSsh.java.String dst = new Tamir.SharpSsh.java.String(localPath);
m_sftp.get(src, dst);
return true;
}
}
catch (Exception ex)
{
return false;
}
return false;
} /// <summary>
/// 删除SFTP文件
/// </summary>
/// <param name="remoteFile">sftp远程文件地址</param>
public bool Delete(string remoteFile)
{
try
{
if (this.Connected)
{
m_sftp.rm(remoteFile);
return true;
}
}
catch
{
return false;
}
return false;
} /// <summary>
/// 移动SFTP文件
/// </summary>
/// <param name="currentFilename">sftp远程文件地址</param>
/// <param name="newDirectory">sftp移动至文件地址</param>
public bool Move(string currentFilename, string newDirectory)
{
try
{
if (this.Connected)
{
Tamir.SharpSsh.java.String src = new Tamir.SharpSsh.java.String(currentFilename);
Tamir.SharpSsh.java.String dst = new Tamir.SharpSsh.java.String(newDirectory);
m_sftp.rename(src, dst);
return true;
}
}
catch (Exception ex)
{
return false;
}
return false;
} /// <summary>
/// 获取SFTP文件列表
/// </summary>
/// <param name="remotePath">sftp远程文件目录</param>
/// <param name="fileType">文件类型</param>
public ArrayList GetFileList(string remotePath, string fileType)
{
try
{ if (this.Connected)
{
Tamir.SharpSsh.java.util.Vector vvv = m_sftp.ls(remotePath);
ArrayList objList = new ArrayList();
foreach (Tamir.SharpSsh.jsch.ChannelSftp.LsEntry qqq in vvv)
{
string sss = qqq.getFilename();
if (sss.Length > (fileType.Length + ) && fileType == sss.Substring(sss.Length - fileType.Length))
{ objList.Add(sss); }
else { continue; }
} return objList;
}
}
catch
{
return null;
}
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) { } }
测试----使用winform
/// <summary>
/// 下载文件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button3_Click(object sender, EventArgs e)
{
FolderBrowserDialog dialog = new FolderBrowserDialog();
if (dialog.ShowDialog() == DialogResult.OK)
{
sftpHelper sftp = new sftpHelper("192.168.2.133", "", "admin", "Admin123");
sftp.Connect();
sftp.Get("/home/20171013103113.csv", dialog.SelectedPath);
sftp.Disconnect();
}
} /// <summary>
/// 上传测试
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button2_Click(object sender, EventArgs e)
{
OpenFileDialog dialog = new OpenFileDialog();
dialog.Filter = "|*.csv";
if (dialog.ShowDialog() == DialogResult.OK)
{
sftpHelper sftp = new sftpHelper("192.168.2.133", "", "admin", "Admin123");
sftp.Connect();
sftp.Put(dialog.FileName, "/home/");
sftp.Disconnect();
} } /// <summary>
/// 删除测试
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button4_Click(object sender, EventArgs e)
{
sftpHelper sftp = new sftpHelper("192.168.2.133", "", "admin", "Admin123");
sftp.Connect();
sftp.Delete("/home/20171013103113.csv");
sftp.Disconnect();
} /// <summary>
/// 移动测试
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button5_Click(object sender, EventArgs e)
{
sftpHelper sftp = new sftpHelper("192.168.2.133", "", "admin", "Admin123");
sftp.Connect();
sftp.Move("/home/20171013103113.csv", "/home/temp/20171013103113.csv");
sftp.Disconnect();
}
C# Sftp操作的更多相关文章
- 使用sftp操作文件并添加事务管理
本文主要针对文件操作的事务管理,即写文件和删除文件并且能保证事务的一致性,可与数据库联合使用,比如需要在服务器存文件,相应的记录存放在数据库,那么数据库的记录和服务器的文件数一定是要一一对应的,该部分 ...
- 通过sftp操作Linux服务器上的文件(java)
本文为实现对linux服务器文件的操作.windows服务器不支持. 引入jar包:jsch-0.1.42.jar package com.csvreader.sftp; import java.io ...
- 使用SSH+SFTP操作终端全解析,告别XShell
1.前言 在Windows系统下操作远程服务器的方式很多,比如XShell+XFTP组合,亦或是PuTTY+WinSCP组合,但在Mac系统下登陆远程服务器,并没有这些工具供我们使用.相比较而言,在M ...
- VBScript调用winscp,实现sftp操作
最新有一个需求,需要在ssis中调用sftp下载文件,由于服务器上只有framework2.0,并且需要用sqlserver代理调用作业,限制了很多. 首先用的是脚本任务,进程调用winscp.com ...
- centos7系统配置记录SFTP操作日志
1.修改ssh配置 [root@elk-node2 ~]# vim /etc/ssh/sshd_config 大概132行把下面这个句注释掉 #Subsystem sftp /usr ...
- CentOS下配置SFTP操作日志
1.修改ssh的配置 vi /etc/ssh/sshd_config 在36行左右修改如下配置 Subsystem sftp /usr/libexec/openssh/sftp-server -l I ...
- c# 使用Renci.SshNet.dll操作SFTP总结
1.操作类 /// <summary> /// SFTP操作类 /// </summary> public class SFTPHelper { #region 字段或属性 p ...
- Java使用Sftp实现对跨服务器上传、下载、打包、写入相关操作
1.Maven引入jar <dependency> <groupId>com.jcraft</groupId> <artifactId>jsch< ...
- Linux简单指令操作
Linux CentOS运维中,常用的操作和命令记录下: 1.DNS设置 在Linux服务器上,当我们ping出现这个错误时:ping: unknown host,很大可能是系统的DNS没有设置或者设 ...
随机推荐
- linux运维记
nmap 127.0.0.1 命令查看当前服务器对外有多少端口,用于检查漏洞 vim ctrl+z ,jobs,fg 切换控制应用程序 vim 执行命令 #!sh aa.sh执行命令 运维系统监控开源 ...
- [ python ] 类的组合
首先,使用面向对象是一个人狗大战的实例: class Person: def __init__(self, name, hp, aggr, sex): self.name = name self.hp ...
- [前端随笔][CSS] 制作一个加载动画 即帖即用
说在前面 描述 [加载中loading...] 的动画图片往往使用GIF来实现,但GIF消耗资源较大,所以使用CSS直接制作更优. 效果传送门1 效果传送门2 关键代码 @keyframes 规则 用 ...
- git在window与linux的换行符问题
1:背景.我win7,后端是win10,使用了TortoiseGit工具.我使用ssh,他使用http.仓库是在linux,使用gitLab管理 2:问题.仓库是总监之前建好的.后端把文件add后pu ...
- kubernetes如何要使用用户名和密码登陆harbor以拉取docker镜像,应该如何操作?
还好,网上有相应的CASE处理. http://www.jianshu.com/p/ffbfb44dc496 =========================== 先生成名为为regsecret的S ...
- 使用 gulp 构建一个项目
本章将介绍 gulp-watch-path stream-combiner2 gulp-sourcemaps gulp-autoprefixer 您还可以直接学习以下模块: 安装 Node 和 gul ...
- oracle 11g安装教程
oracle 11g安装教程 第1步 第2步 第3步 第4步 第5步 第6步 第7步 第8步 第9步 第10步 第11步 第12步 第13步 第14步 第15步 第16步 第17步 第18步 第19步 ...
- CentOS 7 Docker
安装docker yum install docker 查看docker docker version 这是因为docker还没有运行,需要启动docker 启动docker systemctl st ...
- Bootstrap 实现CRUD示例及代码
https://github.com/wenzhixin/bootstrap-table-examples/blob/master/crud/index.html <!DOCTYPE html& ...
- 洛谷 P2680 运输计划-二分+树上差分(边权覆盖)
P2680 运输计划 题目背景 公元 20442044 年,人类进入了宇宙纪元. 题目描述 公元20442044 年,人类进入了宇宙纪元. L 国有 nn 个星球,还有 n-1n−1 条双向航道,每条 ...