Skip to content

Instantly share code, notes, and snippets.

@eikenb
Created December 4, 2018 21:11
Show Gist options
  • Save eikenb/d3a92a399cd20beb54f1173246f32e2f to your computer and use it in GitHub Desktop.
Save eikenb/d3a92a399cd20beb54f1173246f32e2f to your computer and use it in GitHub Desktop.
ssh.Wait only unblocks once
package main
import (
"flag"
"log"
"net"
"os"
"sync"
"golang.org/x/crypto/ssh"
"golang.org/x/crypto/ssh/agent"
)
var (
USER = flag.String("user", os.Getenv("USER"), "ssh username")
HOST = flag.String("host", "localhost", "ssh server hostname")
PORT = flag.String("port", "22", "ssh server port")
)
func main() {
sshagent, err := net.Dial("unix", os.Getenv("SSH_AUTH_SOCK"))
if err != nil {
log.Fatal(err)
}
signer := ssh.PublicKeysCallback(agent.NewClient(sshagent).Signers)
config := &ssh.ClientConfig{
User: os.ExpandEnv("$USER"),
Auth: []ssh.AuthMethod{signer},
HostKeyCallback: ssh.InsecureIgnoreHostKey(),
}
config.SetDefaults()
client, err := ssh.Dial("tcp", *HOST+":"+*PORT, config)
if err != nil {
log.Fatal(err)
}
defer client.Close()
log.Printf("connected")
session, err := client.NewSession()
if err != nil {
log.Fatal(err)
}
defer session.Close()
if err := session.Start("/bin/sleep 1"); err != nil {
log.Fatal(err)
}
log.Printf("ran")
wg := sync.WaitGroup{}
wg.Add(1)
go func() {
log.Printf("waiting on goroutine session")
if err := session.Wait(); err != nil {
log.Printf("go: %s", err)
}
log.Printf("wait over in goroutine")
wg.Done()
}()
log.Printf("waiting on session")
if err := session.Wait(); err != nil {
log.Printf("main: %s", err)
}
log.Printf("waiting on group")
wg.Wait()
log.Printf("disconnected")
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment