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 add jakeheis/Shout
将 Shout 添加为您的 Package.swift
的依赖项
dependencies: [
.package(url: "https://github.com/jakeheis/Shout", from: "0.5.5")
]
由于 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 会话
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