SFTP实现密钥登陆并上传文件
什么是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实现密钥登陆并上传文件的更多相关文章
- linus jsch上传文件
package com.osplat.util; import java.io.*; import com.jcraft.jsch.*;import com.osplat.bean.Resultmod ...
- 采用Sambaserver由win平台,linux平台上传文件
1.构造yum [root@db /]# cd /etc/yum.repos.d/ [root@db yum.repos.d]# vi yum.repo --改动光盘挂载位置,enabled设置为启动 ...
- Java通过sftp上传文件
Linux操作系统我们经常使用ssh中的ftp,sftp连接服务器,做相应操作. 如何通过java代码的形式采用sftp连接到服务器,进行文件上传下载等操作呢? 第一步,引入依赖包 <!-- s ...
- FileUpload 上传文件,并实现c#使用Renci.SshNet.dll实现SFTP文件传输
fileupload上传文件和jquery的uplodify控件使用方法类似,对服务器控件不是很熟悉,记录一下. 主要是记录新接触的sftp文件上传.服务器环境下使用freesshd搭建好环境后,wi ...
- c#连接SFTP上传文件
名词解释(百度百科) sftp是Secure File Transfer Protocol的缩写,安全文件传送协议.可以为传输文件提供一种安全的加密方法.sftp 与 ftp 有着几乎一样的语法和功能 ...
- Java 上传文件到 SFTP 抛异常 java.lang.NoClassDefFoundError: Could not initialize class sun.security.ec.SunEC 的解决办法
最近从 Op 那里报来一个问题,说是SFTP上传文件不成功.拿到的 Exception 如下: Caused by: java.lang.NoClassDefFoundError: Could not ...
- SFTP 上传文件夹
使用sftp上传文件夹时若使用如下命令并不work: put /media/Research/GWAS_Class/* Desktop/ 此时,需要添加一个参数 -r, 另外在目标文件夹下面建立一个同 ...
- 使用SFTP上传文件到服务器的简单使用
最近用到SFTP上传文件查找了一些资料后自己做了一点总结,方便以后的查询 /** * 将文件上传到服务器 * * @param filePath * 文件路径 * @param channelSftp ...
- 用sftp上传文件至linux服务器
1.项目环境 框架:springmvc 项目管理工具:maven 2.必须使用的jar com.jcraft jsch 0.1.27 test 3.新建一个FileUpDown工具类,在类中添加 ...
- VFS 上传文件到sftp 报错 包含中文路径 或者中文文件名称
之前用Apache commons-vfs工具进行ftp操作(FTP服务器是 FileZilla Server) 上传本地文件 到 ftp服务器上,如果文件名称 包含 中文 报错 org.apache ...
随机推荐
- NSSCTF_HUBUCTF的web部分题解
checkin 题目: 主要是php弱比较和序列化知识点考察 <?php $username = "this_is_secret"; $password = "th ...
- electron中使用adm-zip将多个excel文件压缩进文件夹,使用XLSX以及XLSXStyle生成带样式excel文件
需求:electron环境下想要实现根据多个表生成多个Excel文件,打包存入文件夹内并压缩下载到本地.(实际场景描述:界面中有软件工程一班学生信息.软件工程二班学生信息.软件工程三班学生信息,上方有 ...
- 网络监测工具之Zabbix的搭建与测试方法(三) ---Zabbix Agent
安装客户端 在官方网站下载最新版本zabbix agent v6.2.6,然后默认安装,其中配置服务端的界面如下图: 其他一律默认即可. 启用发现功能 如上图所示,开启发现规则,默认搜索zabbix ...
- [OpenCV实战]24 使用OpenCV进行曝光融合
目录 1 什么是曝光融合 2 曝光融合的原理 3 代码与结果 4 参考 本教程中,我们将了解使用OpenCV的Exposure Fusion(曝光融合). 1 什么是曝光融合 曝光融合是一种将使用不同 ...
- HBase详解(05) - HBase优化 整合Phoenix 集成Hive
HBase详解(05) - HBase优化 整合Phoenix 集成Hive HBase优化 预分区 每一个region维护着startRow与endRowKey,如果加入的数据符合某个region维 ...
- Spring 和 Spring MVC的区别
Spring 和 Spring MVC的区别 学习Spring MVC也有几天时间了,那么Spring和Spring MVC的区别到底在哪里,二者是什么关系呢?认为二者是一个东西那肯定是不对的,而 ...
- 遗传算法 Genetic Algorithms
遗传算法 Genetic Algorithms 遗传算法是一种"adaptive heuristic search algorithm"(自适应启发式搜索算法),虽不明.但觉厉.其 ...
- spark任务报错java.io.IOException: Failed to send RPC xxxxxx to xxxx:xxx, but got no response. Marking as slave lost.
## 日志信息如下 ``` Attempted to get executor loss reason for executor id 17 at RPC address 192.168.48.172 ...
- 在统信UOS上将桌面窗口输出到Windows机器上的Xming
目前所用版本是统信UOS V20,具体版本是家庭版22.0. 先尝试了一下,统信UOS自带的lightdm通过XDMCP无法正常输出到Windows机器上的Xming.VcXsrv.X Manager ...
- VS Code離線安裝插件報錯Unable to install extension 'dart-code.flutter' as it is not compatible with VS Code '1.51.1'.
VS Code離線安裝插件報錯Unable to install extension 'dart-code.flutter' as it is not compatible with VS Code ...