Shout

Build Status

用 Swift 轻松实现 SSH

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 包管理器

> ice add jakeheis/Shout

Swift 包管理器

将 Shout 作为依赖项添加到你的 Package.swift 文件

dependencies: [
    .package(url: "https://github.com/jakeheis/Shout", from: "0.5.0")
]

用法

创建会话

你可以通过传递主机名和可选的端口号(默认为 22)来创建会话

let ssh = try SSH(host: "example.com")
// or
let ssh = try SSH(host: "example.com", port: 22)

身份验证

你可以使用私钥、密码或代理进行身份验证。

私钥

要使用私钥进行身份验证,你必须传递用户名和私钥的路径。你还可以传递公钥的路径(默认为私钥路径 + ".pub")以及加密密钥的密码短语(默认为 nil,表示没有密码短语)。

session.authenticate(username: "user", privateKey: "~/.ssh/id_rsa")
// or
session.authenticate(username: "user", privateKey: "~/.ssh/id_rsa", publicKey: "~/.ssh/id_rsa.pub", passphrase: "passphrase")

密码

只需传递用户名和密码即可

session.authenticate(username: "user", password: "password")

代理

如果你已经将必要的私钥添加到 ssh-agent,则可以使用代理进行身份验证

session.authenticateByAgent(username: "user")

执行命令

你可以通过两种方式远程执行命令。session.execute 会将命令的输出打印到 stdout 并返回命令的状态,而 session.capture 不会将任何内容打印到 stdout,并将返回命令的状态和输出(作为字符串)。

let status = try session.execute("ls -a")
let (status, output) = try session.capture("pwd")

发送文件

你可以使用 sendFile 将本地文件发送到远程路径,类似于 scp 命令行程序。

let status = try session.sendFile(localURL: myLocalFile, remotePath: "~/cats.png")

SFTP

你可以打开与远程服务器的 SFTP 会话

let sftp = try session.openSftp()
try sftp.download(remotePath: "/a/remote/file", localURL: myLocalFile)
try sftp.upload(localURL: myLocalFile, remotePath: "~/cats.png")

配置

你可以指示会话在执行命令之前请求 pty(伪终端)。

session.ptyType = .vanilla