iOS-NMSSH 关于SFTP的简单学习
最近在实习项目中需要做一个SFTP功能,为降低开发成本和上线风险,采用技术成熟的三方库NMSSH实现,这是我第一次接触NMSSH,所以写一写简单的学习笔记。
关于SSH
SSH的简介和更详细的知识我参考的是
Jack LDZ - 《SSH简介及两种远程登录的方法》
https://blog.csdn.net/li528405176/article/details/82810342
SSH百度百科
https://baike.baidu.com/item/ssh/10407?fr=aladdin
OPENSSH
http://www.openssh.com/
CocoaDocs/NMSSH
http://cocoadocs.org/docsets/NMSSH/2.2.7/
关于NMSSH
NMSSH is a clean, easy-to-use, unit tested framework for iOS and OSX that wraps libssh2. [引自GitHub/NMSSH]
NMSSH是一个封装了libssh2,简洁易用,经过单元测试的iOS和OSX的框架。
参考的是NMSSH的GitHub介绍:https://github.com/NMSSH/NMSSH
SSH开启
在系统偏好设置->用户与群组中添加一个用于连接的用户
再到系统偏好设置->共享中做设置后即可
代码使用
CocoaPod集成:
pod 'NMSSH'
头文件引入
#import <NMSSH/NMSSH.h>
1、连接
根据SSH的建立连接原则,需要参数:
1、服务器地址
2、SFTP服务端口(默认为22)
3、账户和密码
注:SSH的连接方式有账号密码连接和秘钥连接,本文采用账号密码连接,秘钥连接以后再加,参数的配置见上文
使用NMSSHSession创建连接实例,再使用NMSFTP进行连接和操作
// 创建session实例,并配置参数
NMSSHSession *session = [NMSSHSession connectToHost:@"127.0.0.1:22" withUsername:@"user"];
/*
服务器地址:127.0.0.1
端口:22
账号:user
密码:pass
*/
if (session.isConnected) {
NSLog(@"Successfully created a new session");
}
[session authenticateByPassword:@"pass"];
if (session.isAuthorized) {
NSLog(@"Successfully authorized");
}
// 创建NMSFTP实例,连接SFTP服务器
NMSFTP *sftp = [[NMSFTP alloc]initWithSession:session];
if ([sftp connect]) {
NSLog(@"SFTP connect success");
}else {
NSLog(@"SFTP connect failure");
}
2、获取文件(夹)列表
使用NMSFTP的方法
/**
Read the contents of a file
@param path An existing file path
@returns File contents
*/
- (nullable NSData *)contentsAtPath:(nonnull NSString *)path;
NSArray *fileList = [sftp contentsOfDirectoryAtPath:@"/"];
// 获取根目录下的文件列表(通常为SD磁盘的列表,文件操作不在此处发生),需要到用户的文件夹下操作,以Public文件夹作为例子
NSArray *fileList = [sftp contentsOfDirectoryAtPath:@"/Users/user/Public"];
3、下载文件
使用NMSSH的方法
/**
Read the contents of a file
@param path An existing file path
@returns File contents
*/
- (nullable NSData *)contentsAtPath:(nonnull NSString *)path;
例如:下载文件 /Users/Test/Downloads/Test.txt
[sftp contentsAtPath:@"/Users/Test/Downloads/Test.txt"];
// 获得一个NSData,将NSData以原来的文件名和类型,用文件操作方法存入即可
4、上传文件
使用NMSSH的方法
/**
Overwrite the contents of a file
If no file exists, one is created.
@param contents Bytes to write
@param path File path to write bytes at
@returns Write success
*/
- (BOOL)writeContents:(nonnull NSData *)contents toFileAtPath:(nonnull NSString *)path;
例如:将NSBundle里的Test.txt文件上传到/Users/Test/Public文件夹下
// 拿到文件路径,转化为NSData后上传到目标路径
NSString *pathBundle = [[NSBundle mainBundle]pathForResource:@"Test" ofType:@"txt"];
NSData *data = [[NSData alloc]initWithContentsOfFile:pathBundle];
if ([sftp writeContents:data toFileAtPath:@"/Users/Test/Public/Test.txt"]) {
NSLog(@"SFTP updata success");
}else {
NSLog(@"SFTP updata failure");
}
注:上传和下载文件都有获取进度的方法
5、断开连接
// 断开SFTP连接
[sftp disconnect];
后记
本人是iOS开发新手,如果有错误的地方欢迎dalao们指出。
随着学习的深入本文还会继续更新。
简单的Demo