什么是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. 【Redis场景2】缓存更新策略(双写一致)

    在业务初始阶段,流量很少的情况下,通过直接操作数据是可行的操作,但是随着业务量的增长,用户的访问量也随之增加,在该阶段自然需要使用一些手段(缓存)来减轻数据库的压力:所谓遇事不决,那就加一层. 在当前 ...

  2. History模式的配置细节

    旧文从语雀迁移过来,原日期:2021-09-13 前言 我们知道,vue 单页面应用打包出来是静态资源,一般需要 nginx 或者其他服务器访问:当如果 Vue Router 是采用 History ...

  3. linux开机自启动设置

    方法一:修改 /etc/rc.d/rc.local 文件/etc/rc.d/rc.local 文件会在 Linux 系统各项服务都启动完毕之后再被运行.所以想要脚本在开机后被运行的话,可以将自己脚本路 ...

  4. win10 WSL2问题解决“WslRegisterDistribution failed with error: 0x800701bc”

    win10安装wsl过程报错信息如下: 造成该问题的原因是WSL版本由原来的WSL1升级到WSL2后,内核没有升级,前往微软WSL官网下载安装适用于 x64 计算机的最新 WSL2 Linux 内核更 ...

  5. SPOJ GCDMAT - GCD OF MATRIX

    简要题意 给出三个整数 \(T,n,m\),\(T\) 组询问,每组询问给出四个整数 \(i_1,j_1,i_2,j_2\)(数据保证 \(i_1,j_1\leq n\ \ i_2,j_2\leq m ...

  6. 无旋树堆(FHQ-Treap)学习笔记

    简介 无旋树堆(一般统称 \(\text{FHQ-Treap}\)),是一种平衡树.可以用很少的代码达到很优秀的复杂度. 前置知识: 二叉搜索树 \(\text{BST}\) \(\text{Trea ...

  7. C#开发PACS医学影像三维重建(十四):基于能量模型算法将曲面牙床展开至二维平面

    在医学影像领域中,将三维重建中的人体组织展开平铺至二维,用来研判病灶和制定治疗方案的重要手段之一, 它能够将立体曲面所包含的信息更为直观的展示到二维平面上,常用的情景包括: 牙床全景图.平铺血管.骨骼 ...

  8. 【学习笔记】QT从入门到实战完整版(Lambda)(2)

    Lambda Lambda 表达式很有意思,相信很多人初次见到 Lambda 表达式都会不能理解有什么用,我也一样,看了视频教程之后,突然意识到,Lambda 真的是太好用了,它可以在某些情况下可以很 ...

  9. 编程哲学之 C# 篇:005——"Hello,World!"

    如第一章说明,程序员的创造能力最接近于神,那么从现在开始,让我们来开始愉快地创造世界吧! 用解决方案来管理我们的创作 运行我们安装好的Visual Studio(以后一般情况下都会简称为VS),如下图 ...

  10. 日志添加request-id

    package com.xf.config; import java.util.Date; import javax.servlet.http.HttpServletRequest; import j ...