什么是SFTP,公开键认证,
SFTP可不是FTP协议的扩展,他是基于SSH的文件传输协议。 而当SFTP服务器登录有客户端的公开键时,客户端就可以用自己的私有键去跟服务器握手(handshake)已实现登录而不需要输入密码。而这种方式被称为公开键认证。

1 建SFTP服务器

首先当然是先建一个local SFTP server ,我使用的是SilverSHielD. 它是非商用的话,免费,当然只能同时又三个连接,下载,安装。

2 配置服务器

打开"SilverSHielD Management Console",然后connect

Log Path设一下,然后切换到user,追加

username等等,填好.

关键的在manage User’s Public Keys, 打开, Add

正规的流程应该是客户用winscp等工具生成自己的Key-pair,然后把public 可以贴到 actual Public Key, 俺们自己测试用,所以直接Generate,

然后会提示你保存私有键,这是一定要选 OpenSSH Private Key Files ,这个生成的文件就是客户端认证用私有键。

依次confirm下去,配置完成。

3 下载访问SFTP的library

我用的是 SSH.NET Library

4,访问代码

A,说不定另一个客户用的是FTP,做一个通用的接口先:

public interface IFtpClient
{
/// <summary>
/// 连接服务器
/// </summary>
/// <returns>true:成功;false:失败</returns>
bool Connect();
/// <summary>
/// 断开连接
/// </summary>
void DisConnect(); /// <summary>
/// 取得文件列表
/// </summary>
/// <param name="path">路径</param>
/// <returns></returns>
List<string> ListFiles(string path); /// <summary>
/// 下载文件
/// </summary>
/// <param name="remoteFileName">包含全路径的服务器端文件名</param>
/// <param name="localFileName">本地保存的文件名</param>
/// <returns></returns>
bool Download(string remoteFileName, string localFileName); /// <summary>
/// 上传文件
/// </summary>
/// <param name="localFileName">待上传的文件</param>
/// <param name="remoteFileName">服务器端文件名</param>
/// <returns></returns>
bool Upload(string localFileName, string remoteFileName); /// <summary>
/// 文件改名
/// </summary>
/// <param name="localFileName">包含全路径的源文件名</param>
/// <param name="remoteFileName">包含全路径的新文件名</param>
/// <returns></returns>
bool Rename(string orgFileName, string newFileName); /// <summary>
/// 删除文件
/// </summary>
/// <param name="orgFileName"></param>
/// <param name="newFileName"></param>
/// <returns></returns>
bool Delete(string fileName);
}

B 定义实现:

public class SFtpClient : IFtpClient
{
SftpClient sftp = null; /// <summary>
/// 构造函数
/// </summary>
/// <param name="host">sftp服务器名或IP</param>
/// <param name="port">端口,默认22</param>
/// <param name="user"></param>
/// <param name="privateKey"></param>
/// <param name="passPhrase"></param>
public SFtpClient(string host, int? port, string user, string privateKey, string passPhrase)
{
PrivateKeyFile keyFile = null; if (string.IsNullOrEmpty(passPhrase))
{
keyFile = new PrivateKeyFile(privateKey);
}
else
{
keyFile = new PrivateKeyFile(privateKey, passPhrase);
} if (port.HasValue)
{
sftp = new SftpClient(host, port.Value, user, keyFile);
}
else
{
sftp = new SftpClient(host, user, keyFile);
} if (sftp != null)
{
sftp.ConnectionInfo.RetryAttempts = 5;
sftp.ConnectionInfo.Timeout = new TimeSpan(0, 3, 0);
}
} public bool Connect()
{
if (sftp == null)
{
return false;
} if (sftp.IsConnected)
{
return true;
} try
{
sftp.Connect();
return true;
}
catch (Exception ex)
{
string server = string.Format("{0}:{1}", sftp.ConnectionInfo.Username, sftp.ConnectionInfo.Host);
// 我用的是nLog来记录错误日志。
// logger.Error("[{0}] SFTP连接发生错误。", server, ex);
return false;
}
} public void DisConnect()
{
if (sftp == null)
{
return;
}
if (!sftp.IsConnected)
{
return;
} try
{
sftp.Disconnect();
sftp.Dispose();
sftp = null;
}
catch (Exception ex)
{
//logger.Error("SFTP断开连接发生错误。", ex);
}
} /// <summary>
/// 取得文件列表
/// </summary>
/// <param name="path">路径</param>
/// <returns></returns>
public List<string> ListFiles(string path)
{ if (!Connect())
{
return null;
} List<string> files = new List<string>();
try
{
sftp.ChangeDirectory("/");
sftp.ListDirectory(path).ToList().ForEach(f =>
{ files.Add(f.FullName);
}); return files;
}
catch (Exception ex)
{
// logger.Error("[{0}] 取得文件列表发生错误。", Path, ex);
return null;
}
} /// <summary>
/// 下载文件
/// </summary>
/// <param name="remoteFileName">包含全路径的服务器端文件名</param>
/// <param name="localFileName">本地保存的文件名</param>
/// <returns></returns>
public bool Download(string remoteFileName, string localFileName)
{
if (!Connect())
{
return false;
} try
{
sftp.ChangeDirectory("/");
FileStream fs = File.OpenWrite(localFileName);
sftp.DownloadFile(remoteFileName, fs);
fs.Close();
return true;
}
catch (Exception ex)
{
//logger.Error("[{0}] 文件下载发生错误。", remoteFileName, ex);
return false;
}
} /// <summary>
/// 上传文件
/// </summary>
/// <param name="localFileName">待上传的文件</param>
/// <param name="remoteFileName">服务器端文件名</param>
/// <returns></returns>
public bool Upload(string localFileName, string remoteFileName)
{
if (!Connect())
{
return false;
} try
{
sftp.ChangeDirectory("/"); FileStream fs = File.OpenRead(localFileName);
sftp.UploadFile(fs, remoteFileName, true);
fs.Close();
Thread.Sleep(1000);
return true;
}
catch (Exception ex)
{
//logger.Error("[{0}] 文件上传发生错误。", localFileName, ex);
return false;
}
} /// <summary>
/// 文件改名
/// </summary>
/// <param name="localFileName">包含全路径的源文件名</param>
/// <param name="remoteFileName">包含全路径的新文件名</param>
/// <returns></returns>
public bool Rename(string orgFileName, string newFileName)
{
if (!Connect())
{
return false;
} try
{
sftp.ChangeDirectory("/"); sftp.RenameFile(orgFileName, newFileName);
return true;
}
catch (Exception ex)
{
//logger.Error("[{0}] 文件改名发生错误。", localFileName, ex);
return false;
}
} /// <summary>
/// 删除文件
/// </summary>
/// <param name="orgFileName"></param>
/// <param name="newFileName"></param>
/// <returns></returns>
public bool Delete(string fileName)
{
if (!Connect())
{
return false;
} try
{
sftp.ChangeDirectory("/"); sftp.DeleteFile(fileName);
return true;
}
catch (Exception ex)
{
//logger.Error("[{0}] 文件删除发生错误。", localFileName, ex);
return false;
}
}
}

SFTP实现密钥登陆并上传文件的更多相关文章

  1. linus jsch上传文件

    package com.osplat.util; import java.io.*; import com.jcraft.jsch.*;import com.osplat.bean.Resultmod ...

  2. 采用Sambaserver由win平台,linux平台上传文件

    1.构造yum [root@db /]# cd /etc/yum.repos.d/ [root@db yum.repos.d]# vi yum.repo --改动光盘挂载位置,enabled设置为启动 ...

  3. Java通过sftp上传文件

    Linux操作系统我们经常使用ssh中的ftp,sftp连接服务器,做相应操作. 如何通过java代码的形式采用sftp连接到服务器,进行文件上传下载等操作呢? 第一步,引入依赖包 <!-- s ...

  4. FileUpload 上传文件,并实现c#使用Renci.SshNet.dll实现SFTP文件传输

    fileupload上传文件和jquery的uplodify控件使用方法类似,对服务器控件不是很熟悉,记录一下. 主要是记录新接触的sftp文件上传.服务器环境下使用freesshd搭建好环境后,wi ...

  5. c#连接SFTP上传文件

    名词解释(百度百科) sftp是Secure File Transfer Protocol的缩写,安全文件传送协议.可以为传输文件提供一种安全的加密方法.sftp 与 ftp 有着几乎一样的语法和功能 ...

  6. Java 上传文件到 SFTP 抛异常 java.lang.NoClassDefFoundError: Could not initialize class sun.security.ec.SunEC 的解决办法

    最近从 Op 那里报来一个问题,说是SFTP上传文件不成功.拿到的 Exception 如下: Caused by: java.lang.NoClassDefFoundError: Could not ...

  7. SFTP 上传文件夹

    使用sftp上传文件夹时若使用如下命令并不work: put /media/Research/GWAS_Class/* Desktop/ 此时,需要添加一个参数 -r, 另外在目标文件夹下面建立一个同 ...

  8. 使用SFTP上传文件到服务器的简单使用

    最近用到SFTP上传文件查找了一些资料后自己做了一点总结,方便以后的查询 /** * 将文件上传到服务器 * * @param filePath * 文件路径 * @param channelSftp ...

  9. 用sftp上传文件至linux服务器

    1.项目环境 框架:springmvc    项目管理工具:maven 2.必须使用的jar com.jcraft jsch 0.1.27 test 3.新建一个FileUpDown工具类,在类中添加 ...

  10. VFS 上传文件到sftp 报错 包含中文路径 或者中文文件名称

    之前用Apache commons-vfs工具进行ftp操作(FTP服务器是 FileZilla Server) 上传本地文件 到 ftp服务器上,如果文件名称 包含 中文 报错 org.apache ...

随机推荐

  1. vue3 递归组件 树形组件

    递归组件 第一种方式,直接自己调用自己 Tree.vue <template> <div class="tree"> <div v-for=" ...

  2. CH432,CH438,CH9434串口扩展芯片常见问题

    目前WCH有三款串口扩展芯片CH432,CH438以及CH9434. 型号 CH432 CH438 CH9434 扩展串口数量 2 8 4 通讯接口 并口/SPI(具体需要看芯片封装) 并口 SPI ...

  3. 一个实现单线程/多线程下代码调用链中传递数据的处理类: CallContext(LogicalSetData,LogicalGetData),含.net core的实现

    详情请参考原文:一个实现单线程/多线程下代码调用链中传递数据的处理类: CallContext

  4. 用Java写一个分布式缓存——缓存管理

    前言 之前也用过一些缓存中间件,框架,也想着自己是不是也能用Java写一个出来,于是就有了这个想法,打算在写的过程中同步进行总结 源码:weloe/Java-Distributed-Cache (gi ...

  5. 引子 - 实现轻量的 ioc 容器

    IoC 反转控制原则也被叫做依赖注入 DI, 容器按照配置注入实例化的对象. 假设 A 的相互依赖关系如下图, 如何将 A 对象实例化并注入属性. 本文将实现一个轻量化的 IoC 容器, 完成对象的实 ...

  6. vulnhub靶场之HACKSUDO: PROXIMACENTAURI

    准备: 攻击机:虚拟机kali.本机win10. 靶机:hacksudo: ProximaCentauri,下载地址:https://download.vulnhub.com/hacksudo/hac ...

  7. Salesforce LWC学习(四十一) If:true 即将弃用?

    本篇参考: https://developer.salesforce.com/docs/component-library/documentation/en/lwc/lwc.reference_dir ...

  8. springboot使用EasyExcel,导出数据到Excel表格,并且将Excel表中数据导入

    一.导出至Excel 1.导入依赖 导出方法需要使用到fastJson的依赖,这里也直接导入 点击查看代码 <!--阿里的easyexcel--> <dependency> & ...

  9. ES字段类型

    1 String ELasticsearch 5.X之后的字段类型不再支持string,由text和keyword取代,不做说明. 2 text和keyword 2.1 简介 ElasticSearc ...

  10. .net 多地点计算中心点

    1.需求产生 快到周末了,几个远在各个区的朋友想要聚餐,为了照顾到彼此的距离,决定计算一下所有人的中心点,至此需求产生,下面开始编写代码. 2.编写代码 1)新建一个控制台程序 在NuGet程序包管理 ...