SSH and SFTP client library for React Native on iOS and Android.
npm install @dylankenneally/react-native-ssh-sftp
Update your Podfile
to use the aanah0's fork of NMSSH. Note that we use the forked version to give us a required later version of libssh. Your Podfile
is located in your React Native project at ./ios/Podfile
.
target '[your project's name]' do
pod 'NMSSH', :git => 'https://github.com/aanah0/NMSSH.git' # <-- add this line
# ... rest of your target details ...
end
And then run pod install
in your ./ios
directory.
cd ios
pod install
cd -
Tip
Adding a postinstall
script to your package.json
file to run pod install
after npm install
is a good idea. The pod-install
package is a good way to do this.
{
"scripts": {
"postinstall": "npx pod-install",
}
}
If you are using Flipper to debug your app, it will already have a copy of OpenSSL included. This can cause issues with the version of OpenSSL that NMSSH uses. You can disable flipper by removing/commenting out the flipper_configuration => flipper_config,
line in your Podfile
.
No additional steps are needed for Android.
This project has been updated to use React Native v73 (the latest at the time of writing, Jan 2024) - which means that manual linking is not required.
All functions that run asynchronously where we have to wait for a result returns Promises that can reject if an error occurred.
Note
On iOS, this package currently doesn't support the simulator, you will need to have your app running on a physical device. If you would like to know more about this, see this issue. I'd welcome a PR to resolve this.
import SSHClient from '@dylankenneally/react-native-ssh-sftp';
SSHClient.connectWithPassword(
"10.0.0.10",
22,
"user",
"password"
).then(client => {/*...*/});
import SSHClient from 'react-native-ssh-sftp';
SSHClient.connectWithKey(
"10.0.0.10",
22,
"user",
privateKey="-----BEGIN RSA...",
passphrase
).then(client => {/*...*/});
{privateKey: '-----BEGIN RSA......'}
{privateKey: '-----BEGIN RSA......', publicKey: 'ssh-rsa AAAAB3NzaC1yc2EA......'}
{privateKey: '-----BEGIN RSA......', publicKey: 'ssh-rsa AAAAB3NzaC1yc2EA......', passphrase: 'Password'}
client.disconnect();
const command = 'ls -l';
client.execute(command)
.then(output => console.warn(output));
- Supported ptyType: vanilla, vt100, vt102, vt220, ansi, xterm
const ptyType = 'vanilla';
client.startShell(ptyType)
.then(() => {/*...*/});
client.on('Shell', (event) => {
if (event)
console.warn(event);
});
const str = 'ls -l\n';
client.writeToShell(str)
.then(() => {/*...*/});
client.closeShell();
client.connectSFTP()
.then(() => {/*...*/});
const path = '.';
client.sftpLs(path)
.then(response => console.warn(response));
client.sftpMkdir('dirName')
.then(() => {/*...*/});
client.sftpRename('oldName', 'newName')
.then(() => {/*...*/});
client.sftpRmdir('dirName')
.then(() => {/*...*/});
client.sftpRm('fileName')
.then(() => {/*...*/});
client.sftpDownload('[path-to-remote-file]', '[path-to-local-directory]')
.then(downloadedFilePath => {
console.warn(downloadedFilePath);
});
// Download progress (setup before call)
client.on('DownloadProgress', (event) => {
console.warn(event);
});
// Cancel download
client.sftpCancelDownload();
client.sftpUpload('[path-to-local-file]', '[path-to-remote-directory]')
.then(() => {/*...*/});
// Upload progress (setup before call)
client.on('UploadProgress', (event) => {
console.warn(event);
});
// Cancel upload
client.sftpCancelUpload();
client.disconnectSFTP();
You can find a very simple example app for the usage of this library here.
This package wraps the following libraries, which provide the actual SSH/SFTP functionality:
- NMSSH for iOS
- JSch for Android (from Matthias Wiedemann fork)
This package is a fork of Emmanuel Natividad's react-native-ssh-sftp package. The fork chain from there is as follows: