iOS-NMSSH 关于SFTP的简单学习

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

扫描二维码关注公众号,回复: 16121283 查看本文章
[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

猜你喜欢

转载自blog.csdn.net/qq_38718912/article/details/101697042