forked from pkallberg/cx
-
Notifications
You must be signed in to change notification settings - Fork 0
/
ssh.go
103 lines (82 loc) · 2.43 KB
/
ssh.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
package main
import (
"fmt"
"os"
"runtime"
"github.com/cloud66/cloud66"
"github.com/cloud66/cli"
)
var cmdSsh = &Command{
Name: "ssh",
Run: runSsh,
Build: buildBasicCommand,
NeedsStack: true,
Short: "starts a ssh shell into the server",
Long: `This will open the firewall for SSH from your IP address temporaritly (20 minutes), downloads the keys if you don't have them
and starts a SSH session.
You need to have the right access permissions to use this command.
You can use either the server name (ie lion) or the server IP (ie. 123.123.123.123) or the server role (ie. web)
with thie command.
If a role is specified the command will connect to the first server with that role.
Names are case insensitive and will work with the starting characters as well.
This command is only supported on Linux and OS X.
Examples:
$ cx ssh -s mystack lion
$ cx ssh -s mystack 52.65.34.98
$ cx ssh -s mystack web
`,
}
func runSsh(c *cli.Context) {
if runtime.GOOS == "windows" {
printFatal("Not supported on Windows")
os.Exit(2)
}
stack := mustStack(c)
if len(c.Args()) != 1 {
cli.ShowCommandHelp(c, "ssh")
os.Exit(2)
}
// get the server
serverName := c.Args()[0]
servers, err := client.Servers(stack.Uid)
if err != nil {
printFatal(err.Error())
}
server, err := findServer(servers, serverName)
if err != nil {
printFatal(err.Error())
}
if server == nil {
printFatal("Server '" + serverName + "' not found")
}
fmt.Printf("Server: %s\n", server.Name)
err = sshToServer(*server)
if err != nil {
printError("If you're having issues connecting to your server, you may find some help at http://help.cloud66.com/managing-your-stack/ssh-to-your-server")
printFatal(err.Error())
}
}
func sshToServer(server cloud66.Server) error {
sshFile, err := prepareLocalSshKey(server)
must(err)
// open the firewall
timeToOpen := 20
fmt.Printf("Opening access to %s...\n", server.Address)
genericRes, err := client.LeaseSync(server.StackUid, nil, &timeToOpen, nil, &server.Uid)
must(err)
if genericRes.Status != true {
printFatal("Unable to open server lease")
}
fmt.Printf("Connecting to %s (%s)...\n", server.Name, server.Address)
return startProgram("ssh", []string{
server.UserName + "@" + server.Address,
"-i", sshFile,
"-o", "UserKnownHostsFile=/dev/null",
"-o", "CheckHostIP=no",
"-o", "StrictHostKeyChecking=no",
"-o", "LogLevel=QUIET",
"-o", "IdentitiesOnly=yes",
"-A",
"-p", "22",
})
}