SSH and SFTP client for Flutter. Wraps iOS library NMSSH and Android library JSch.
Add ssh
as a dependency in your pubspec.yaml file.
Platform exception in release mode for Android:
PlatformException(connection_failure, java.lang.ClassNotFoundException: com.jcraft.jsch.jce.Random, null)
There are 2 workarounds:
flutter build apk --no-shrink
import 'package:ssh/ssh.dart';
var client = new SSHClient(
host: "my.sshtest",
port: 22,
username: "sha",
passwordOrKey: "Password01.",
);
import 'package:ssh/ssh.dart';
var client = new SSHClient(
host: "my.sshtest",
port: 22,
username: "sha",
passwordOrKey: {
"privateKey": """-----BEGIN RSA PRIVATE KEY-----
......
-----END RSA PRIVATE KEY-----""",
"passphrase": "passphrase-for-key",
},
);
Recent versions of OpenSSH introduce a proprietary key format that is not supported by most other software, including this one, you must convert it to a PEM-format RSA key using the puttygen
tool. On Windows this is a graphical tool. On the Mac, install it per these instructions. On Linux install your distribution's putty
or puttygen
packages.
ssh-keygen -p -f id_rsa
puttygen id_rsa -O private-openssh -o id_rsa_unencrypted
ssh-keygen -p -f id_rsa
puttygen id_rsa_unencrypted -P -O private-openssh -o id_rsa_flutter
rm id_rsa_unencrypted
await client.connect();
await client.disconnect();
var result = await client.execute("ps");
var result = await client.startShell(
ptyType: "xterm", // defaults to vanilla
callback: (dynamic res) {
print(res); // read from shell
}
);
await client.writeToShell("ls\n");
await client.closeShell();
await client.connectSFTP();
var array = await client.sftpLs("/home"); // defaults to .
await client.sftpMkdir("testdir");
await client.sftpRename(
oldPath: "testfile",
newPath: "newtestfile",
);
await client.sftpRmdir("testdir");
await client.sftpRm("testfile");
var filePath = await client.sftpDownload(
path: "testfile",
toPath: tempPath,
callback: (progress) {
print(progress); // read download progress
},
);
// Cancel download:
await client.sftpCancelDownload();
await client.sftpUpload(
path: filePath,
toPath: ".",
callback: (progress) {
print(progress); // read upload progress
},
);
// Cancel upload:
await client.sftpCancelUpload();
await client.disconnectSFTP();
Refer to the example.