Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
192 changes: 81 additions & 111 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,57 +6,13 @@ SSH and SFTP client library for React Native.

```
npm install react-native-ssh-sftp --save
react-native link react-native-ssh-sftp
```

### iOS (only)

NMSSH is required for iOS.

1. Initialize Pod:
```
cd ios
pod init
```
2. Open Podfile and add:
```
target '[your project's name]' do
pod 'NMSSH', '2.2.8'
end
```
3. Install Pod:
```
pod install
```

### Manual Link

#### iOS

1. In XCode, in the project navigator, right click `Libraries` ➜ `Add Files to [your project's name]`
2. Go to `node_modules` ➜ `react-native-ssh-sftp` and add `RNSSHClient.xcodeproj`
3. In XCode, in the project navigator, select your project. Add `libRNSSHClient.a` to your project's `Build Phases` ➜ `Link Binary With Libraries`

#### Android

1. Open up `android/app/src/main/java/[...]/MainActivity.java`
- Add `import com.reactlibrary.RNSshClientPackage;` to the imports at the top of the file
- Add `new RNSshClientPackage()` to the list returned by the `getPackages()` method
2. Append the following lines to `android/settings.gradle`:
```
include ':react-native-ssh-sftp'
project(':react-native-ssh-sftp').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-ssh-sftp/android')
```
3. Insert the following lines inside the dependencies block in `android/app/build.gradle`:
```
compile project(':react-native-ssh-sftp')
```

## Demo

![example](https://raw.githubusercontent.com/shaqian/react-native-ssh-sftp/master/example.gif)

- This library is also used in iOS app PiHelper.
- This library is also used in iOS app PiHelper.

<a href="https://itunes.apple.com/app/pihelper/id1369930932"><img src="https://is4-ssl.mzstatic.com/image/thumb/Purple128/v4/ba/5b/59/ba5b592a-5446-1c21-6703-3eb3fb25007e/AppIcon-1x_U007emarketing-85-220-9.png/246x0w.jpg" align="left" height="75" width="75" ></a>
<br />
Expand All @@ -66,6 +22,7 @@ NMSSH is required for iOS.
## Run demo

### iOS

```
cd example
cd ios
Expand All @@ -76,6 +33,7 @@ react-native run-ios
```

### Android

```
cd example
npm install
Expand All @@ -85,175 +43,187 @@ react-native run-android
## Usage

### Create a client using password authentication

```javascript
import SSHClient from 'react-native-ssh-sftp';
import SSHClient from "react-native-ssh-sftp";

let client = new SSHClient('10.0.0.10', 22, 'user', 'password', (error) => {
if (error)
console.warn(error);
let client = new SSHClient("10.0.0.10", 22, "user", "password", (error) => {
if (error) console.warn(error);
});
```

### Create a client using public key authentication

```javascript
import SSHClient from 'react-native-ssh-sftp';
import SSHClient from "react-native-ssh-sftp";

let client = new SSHClient('10.0.0.10', 22, 'user', {privateKey: '-----BEGIN RSA......'}, (error) => {
if (error)
console.warn(error);
});
let client = new SSHClient(
"10.0.0.10",
22,
"user",
{ privateKey: "-----BEGIN RSA......" },
(error) => {
if (error) console.warn(error);
}
);
```

- Public key authentication also supports:

```
{privateKey: '-----BEGIN RSA......'}
{privateKey: '-----BEGIN RSA......', publicKey: 'ssh-rsa AAAAB3NzaC1yc2EA......'}
{privateKey: '-----BEGIN RSA......', publicKey: 'ssh-rsa AAAAB3NzaC1yc2EA......', passphrase: 'Password'}
```

### Close client

```javascript
client.disconnect();
```

### Execute SSH command

```javascript
var command = 'ls -l';
var command = "ls -l";
client.execute(command, (error, output) => {
if (error)
console.warn(error);
if (output)
console.warn(output);
if (error) console.warn(error);
if (output) console.warn(output);
});
```

### Shell

#### Start shell:
#### Start shell:

- Supported ptyType: vanilla, vt100, vt102, vt220, ansi, xterm

```javascript
var ptyType = 'vanilla';
var ptyType = "vanilla";
client.startShell(ptyType, (error) => {
if (error)
console.warn(error);
if (error) console.warn(error);
});
```

#### Read from shell:

```javascript
client.on('Shell', (event) => {
if (event)
console.warn(event);
client.on("Shell", (event) => {
if (event) console.warn(event);
});
```

#### Write to shell:
#### Write to shell:

```javascript
var str = 'ls -l\n';
var str = "ls -l\n";
client.writeToShell(str, (error) => {
if (error)
console.warn(error);
if (error) console.warn(error);
});
```

#### Close shell:
#### Close shell:

```javascript
client.closeShell();
```

### SFTP

#### Connect SFTP

```javascript
client.connectSFTP((error) => {
if (error)
console.warn(error);
if (error) console.warn(error);
});
```

#### List directory:
#### List directory:

```javascript
var path = '.';
var path = ".";
client.sftpLs(path, (error, response) => {
if (error)
console.warn(error);
if (response)
console.warn(response);
if (error) console.warn(error);
if (response) console.warn(response);
});
```

#### Create directory:
#### Create directory:

```javascript
client.sftpMkdir('dirName', (error) => {
if (error)
console.warn(error);
client.sftpMkdir("dirName", (error) => {
if (error) console.warn(error);
});
```

#### Rename file or directory:
#### Rename file or directory:

```javascript
client.sftpRename('oldName', 'newName', (error) => {
if (error)
console.warn(error);
client.sftpRename("oldName", "newName", (error) => {
if (error) console.warn(error);
});
```

#### Remove directory:
#### Remove directory:

```javascript
client.sftpRmdir('dirName', (error) => {
if (error)
console.warn(error);
client.sftpRmdir("dirName", (error) => {
if (error) console.warn(error);
});
```

#### Remove file:
#### Remove file:

```javascript
client.sftpRm('fileName', (error) => {
if (error)
console.warn(error);
client.sftpRm("fileName", (error) => {
if (error) console.warn(error);
});
```

#### Download file:
#### Download file:

```javascript
client.sftpDownload('[path-to-remote-file]', '[path-to-local-direcotry]', (error, downloadedFilePath) => {
if (error)
console.warn(error);
if (downloadedFilePath)
console.warn(downloadedFilePath);
});
client.sftpDownload(
"[path-to-remote-file]",
"[path-to-local-direcotry]",
(error, downloadedFilePath) => {
if (error) console.warn(error);
if (downloadedFilePath) console.warn(downloadedFilePath);
}
);

// Downlowd progress
client.on('DownloadProgress', (event) => {
client.on("DownloadProgress", (event) => {
console.warn(event);
});

// Cancel download:
client.sftpCancelDownload();
```

#### Upload file:
#### Upload file:

```javascript
client.sftpUpload('[path-to-local-file]', '[path-to-remote-directory]', (error) => {
if (error)
console.warn(error);
client.sftpUpload("[path-to-local-file]", "[path-to-remote-directory]", (error) => {
if (error) console.warn(error);
});

// Upload progress
client.on('UploadProgress', (event) => {
client.on("UploadProgress", (event) => {
console.warn(event);
});

// Cancel upload:
client.sftpCancelUpload();
```

#### Close SFTP:
#### Close SFTP (Android only):

```javascript
client.disconnectSFTP();
```

## Credits

* iOS SSH library: [NMSSH](https://github.com/NMSSH/NMSSH)
* Android SSH library: [JSch](http://www.jcraft.com/jsch/)
- iOS SSH library: [NMSSH](https://github.com/NMSSH/NMSSH)
- Android SSH library: [JSch](http://www.jcraft.com/jsch/)
4 changes: 2 additions & 2 deletions RNSSHClient.podspec
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@ Pod::Spec.new do |s|
s.source = { :git => 'https://github.com/shaqian/react-native-ssh-sftp.git', :tag => s.version }
s.source_files = 'ios/**/*.{h,m}'
s.requires_arc = true
s.platforms = { :ios => "8.0", :tvos => "9.2" }
s.platforms = { :ios => "11.0", :tvos => "9.2" }

s.dependency 'React'
s.dependency 'NMSSH'
s.dependency 'NMSSH', '2.3.1'
end
22 changes: 14 additions & 8 deletions android/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -2,22 +2,27 @@
buildscript {
repositories {
jcenter()
google()
}

dependencies {
classpath 'com.android.tools.build:gradle:1.3.1'
classpath 'com.android.tools.build:gradle:3.2.1'
}
}

apply plugin: 'com.android.library'

def DEFAULT_COMPILE_SDK_VERSION = 23
def DEFAULT_BUILD_TOOLS_VERSION = "23.0.1"
def DEFAULT_TARGET_SDK_VERSION = 22

android {
compileSdkVersion 23
buildToolsVersion "23.0.1"
compileSdkVersion rootProject.hasProperty('compileSdkVersion') ? rootProject.compileSdkVersion : DEFAULT_COMPILE_SDK_VERSION
buildToolsVersion rootProject.hasProperty('buildToolsVersion') ? rootProject.buildToolsVersion : DEFAULT_BUILD_TOOLS_VERSION

defaultConfig {
minSdkVersion 16
targetSdkVersion 22
targetSdkVersion rootProject.hasProperty('targetSdkVersion') ? rootProject.targetSdkVersion : DEFAULT_TARGET_SDK_VERSION
versionCode 1
versionName "1.0"
}
Expand All @@ -28,12 +33,13 @@ android {

repositories {
mavenCentral()
jcenter()
}

dependencies {
compile 'com.facebook.react:react-native:+'
compile 'com.jcraft:jsch:0.1.54'
compile 'com.fasterxml.jackson.core:jackson-core:2.9.0'
compile 'com.fasterxml.jackson.core:jackson-databind:2.9.0'
api 'com.facebook.react:react-native:+'
api 'com.jcraft:jsch:0.1.54'
api 'com.fasterxml.jackson.core:jackson-core:2.9.0'
api 'com.fasterxml.jackson.core:jackson-databind:2.9.0'
}

Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import android.os.Environment;
import android.util.Log;
import android.support.annotation.Nullable;
import androidx.annotation.Nullable;

import com.facebook.react.bridge.Arguments;
import com.facebook.react.bridge.Callback;
Expand Down
Loading