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.5")
]

Swift 5.2 注意事项

由于 Swift 5.2 中的一个 bug,为了构建依赖于 Shout 的项目,您必须明确告诉 SPM 在哪里找到 libssh2 的 pkgconfig。 如果您使用 Homebrew 安装了 libssh2,则指令类似于

export PKG_CONFIG_PATH="/usr/local/opt/openssl@1.1/lib/pkgconfig"
swift build

生成 Xcode 项目的方法相同

export PKG_CONFIG_PATH="/usr/local/opt/openssl@1.1/lib/pkgconfig"
swift package generate-xcodeproj

有关更多详细信息,请参见 issue #34

用法

创建会话

您可以通过传递主机名和可选的端口号(默认为 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