用 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.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 会话
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