SSH made easy in Swift
import Shout let ssh = try SSH(host: "example.com") try ssh.authenticate(username: "user", privateKey: "~/.ssh/id_rsa") try ssh.execute("ls -a") try ssh.execute("pwd") ...
> ice add jakeheis/Shout
Swift Package Manager
Add Shout as a dependency to your
dependencies: [ .package(url: "https://github.com/jakeheis/Shout", from: "0.5.0") ]
Creating a session
You create a session by passing a host and optionally a port (default 22):
let ssh = try SSH(host: "example.com") // or let ssh = try SSH(host: "example.com", port: 22)
You can authenticate with a private key, a password, or an agent.
To authenticate with a private key, you must pass the username and the path to the private key. You can also pass the path to the public key (defaults to the private key path + ".pub") and the passphrase encrypting the key (defaults to nil for no passphrase)
session.authenticate(username: "user", privateKey: "~/.ssh/id_rsa") // or session.authenticate(username: "user", privateKey: "~/.ssh/id_rsa", publicKey: "~/.ssh/id_rsa.pub", passphrase: "passphrase")
Simply pass the username and password:
session.authenticate(username: "user", password: "password")
If you've already added the necessary private key to ssh-agent, you can authenticate using the agent:
You can remotely execute a command one of two ways.
session.execute will print the output of the command to stdout and return the status of the command, while
session.capture will not print anything to stdout and will return both the status and the output of the command as a string.
let status = try session.execute("ls -a") let (status, output) = try session.capture("pwd")
You can send a local file to a remote path, similar to the
scp command line program, with
let status = try session.sendFile(localURL: myLocalFile, remotePath: "~/cats.png")
You can open an SFTP session with the remote server:
let sftp = try session.openSftp() try sftp.download(remotePath: "/a/remote/file", localURL: myLocalFile) try sftp.upload(localURL: myLocalFile, remotePath: "~/cats.png")
You can instruct the session to request a pty (pseudo terminal) before executing commands:
session.ptyType = .vanilla