Вам нужно использовать ssh.PublicKeys
, чтобы превратить список ssh.Signers
в ssh.AuthMethod
. Вы можете использовать ssh.ParsePrivateKey
, чтобы получить Signer
из байтов pem, или если вам нужно использовать закрытый ключ rsa, dsa или ecdsa, вы можете дать их ssh.NewSignerFromKey
.
Вот Например, с помощью поддержки агента также немного скрестили (поскольку использование агента обычно является следующим шагом после простого использования файла ключа).
sock, err := net.Dial("unix", os.Getenv("SSH_AUTH_SOCK"))
if err != nil {
log.Fatal(err)
}
agent := agent.NewClient(sock)
signers, err := agent.Signers()
if err != nil {
log.Fatal(err)
}
// or get the signer from your private key file directly
// signer, err := ssh.ParsePrivateKey(pemBytes)
// if err != nil {
// log.Fatal(err)
// }
auths := []ssh.AuthMethod{ssh.PublicKeys(signers...)}
cfg := &ssh.ClientConfig{
User: "username",
Auth: auths,
}
cfg.SetDefaults()
client, err := ssh.Dial("tcp", "aws-hostname:22", cfg)
if err != nil {
log.Fatal(err)
}
session, err = client.NewSession()
if err != nil {
log.Fatal(err)
}
log.Println("we have a session!")
...
Я верю, что «Элемент» где-то переопределяется SDK. Переименование элемента в T должно исправить проблему.
import Foundation
final class WeakBox<T:AnyObject> {
weak var unbox: T?
init(_ value: T?) {
unbox = value
}
}
struct WeakArray<T: AnyObject> {
private var items: [WeakBox<T>] = []
init(_ elements: [T]) {
items = elements.map { WeakBox([110]) }
}
init(_ elements: [T?]) {
items = elements.map { WeakBox([110]) }
}
mutating func append(_ obj:T?) {
items.append(WeakBox(obj))
}
mutating func remove(at:Int) {
items.remove(at: at)
}
}
extension WeakArray: Collection {
var startIndex: Int { return items.startIndex }
var endIndex: Int { return items.endIndex }
subscript(_ index: Int) -> T? {
return items[index].unbox
}
func index(after idx: Int) -> Int {
return items.index(after: idx)
}
}