Skip to content

Commit d803ce9

Browse files
Merge pull request #17 from cooperspencer/ssh-keyadd
add ssh key if not in known_hosts
2 parents de73a85 + eba517d commit d803ce9

4 files changed

Lines changed: 93 additions & 3 deletions

File tree

go.mod

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,15 +19,14 @@ require (
1919
github.com/kevinburke/ssh_config v1.1.0 // indirect
2020
github.com/ktrysmt/go-bitbucket v0.9.27
2121
github.com/mattn/go-colorable v0.1.11 // indirect
22+
github.com/melbahja/goph v1.3.0 // indirect
2223
github.com/mitchellh/mapstructure v1.4.2 // indirect
2324
github.com/rs/zerolog v1.25.0
2425
github.com/sergi/go-diff v1.2.0 // indirect
2526
github.com/xanzy/go-gitlab v0.51.1
2627
github.com/xanzy/ssh-agent v0.3.1 // indirect
27-
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 // indirect
28-
golang.org/x/net v0.0.0-20211008194852-3b03d305991f // indirect
28+
golang.org/x/crypto v0.0.0-20211117183948-ae814b36b871 // indirect
2929
golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1
30-
golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac // indirect
3130
golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac // indirect
3231
google.golang.org/appengine v1.6.7 // indirect
3332
google.golang.org/protobuf v1.27.1 // indirect

go.sum

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,8 @@ github.com/kevinburke/ssh_config v1.1.0 h1:pH/t1WS9NzT8go394IqZeJTMHVm6Cr6ZJ6AQ+
176176
github.com/kevinburke/ssh_config v1.1.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM=
177177
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
178178
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
179+
github.com/kr/fs v0.1.0 h1:Jskdu9ieNAYnjxsi0LbQp1ulIKZV1LAFgK1tWhpZgl8=
180+
github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=
179181
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
180182
github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI=
181183
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
@@ -193,6 +195,8 @@ github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb
193195
github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
194196
github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y=
195197
github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
198+
github.com/melbahja/goph v1.3.0 h1:RAIS7eL2tew/UrNmBpY2NZMxw6fWtOxki9nkrzw8mZY=
199+
github.com/melbahja/goph v1.3.0/go.mod h1:04M6J+mKmwzAOWhO0ABTweHGU3cizOp90WdCoxrn9gQ=
196200
github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
197201
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
198202
github.com/mitchellh/mapstructure v0.0.0-20180220230111-00c29f56e238/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
@@ -202,6 +206,8 @@ github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLA
202206
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
203207
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
204208
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
209+
github.com/pkg/sftp v1.13.4 h1:Lb0RYJCmgUcBgZosfoi9Y9sbl6+LJgOIgk/2Y4YjMFg=
210+
github.com/pkg/sftp v1.13.4/go.mod h1:LzqnAvaD5TWeNBsZpfKxSYn1MbjWwOsCIAFFJbpIsK8=
205211
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
206212
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
207213
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
@@ -248,6 +254,8 @@ golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm
248254
golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
249255
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 h1:7I4JAnoQBe7ZtJcBaYHi5UtiO8tQHbUSXxL+pnGRANg=
250256
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
257+
golang.org/x/crypto v0.0.0-20211117183948-ae814b36b871 h1:/pEO3GD/ABYAjuakUS6xSEmmlyVS4kxBNkeA9tLJiTI=
258+
golang.org/x/crypto v0.0.0-20211117183948-ae814b36b871/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
251259
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
252260
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
253261
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@@ -312,6 +320,8 @@ golang.org/x/net v0.0.0-20210326060303-6b1517762897/go.mod h1:uSPa2vr4CLtc/ILN5o
312320
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
313321
golang.org/x/net v0.0.0-20211008194852-3b03d305991f h1:1scJEYZBaF48BaG6tYbtxmLcXqwYGSfGcMoStTqkkIw=
314322
golang.org/x/net v0.0.0-20211008194852-3b03d305991f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
323+
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2 h1:CIJ76btIcR3eFI5EgSo6k1qKw9KJexJuRLI9G7Hp5wE=
324+
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
315325
golang.org/x/oauth2 v0.0.0-20180227000427-d7d64896b5ff/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
316326
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
317327
golang.org/x/oauth2 v0.0.0-20181106182150-f42d05182288/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
@@ -367,15 +377,20 @@ golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7w
367377
golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
368378
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
369379
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
380+
golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
370381
golang.org/x/sys v0.0.0-20210502180810-71e4cd670f79/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
371382
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
372383
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
373384
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
374385
golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
375386
golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac h1:oN6lz7iLW/YC7un8pq+9bOLyXrprv2+DKfkJY+2LJJw=
376387
golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
388+
golang.org/x/sys v0.0.0-20211031064116-611d5d643895 h1:iaNpwpnrgL5jzWS0vCNnfa8HqzxveCFpFx3uC/X4Tps=
389+
golang.org/x/sys v0.0.0-20211031064116-611d5d643895/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
377390
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 h1:v+OssWQX+hTHEmOBgwxdZxK4zHq3yOs8F9J7mk0PY8E=
378391
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
392+
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY=
393+
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
379394
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
380395
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
381396
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=

main.go

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,11 @@ import (
44
"context"
55
"fmt"
66
"io/ioutil"
7+
"net"
78
"net/url"
89
"os"
910
"path"
11+
"strconv"
1012
"strings"
1113
"time"
1214

@@ -20,9 +22,11 @@ import (
2022
"github.com/google/go-github/github"
2123
"github.com/gookit/color"
2224
"github.com/ktrysmt/go-bitbucket"
25+
"github.com/melbahja/goph"
2326
"github.com/rs/zerolog"
2427
"github.com/rs/zerolog/log"
2528
"github.com/xanzy/go-gitlab"
29+
gossh "golang.org/x/crypto/ssh"
2630
"golang.org/x/oauth2"
2731
"gopkg.in/yaml.v2"
2832
)
@@ -37,6 +41,55 @@ var (
3741
blue = color.FgBlue.Render
3842
)
3943

44+
func (s *Site) GetValues(url string) {
45+
if strings.HasPrefix(url, "ssh://") {
46+
url = strings.Split(url, "ssh://")[1]
47+
userurl := strings.Split(url, "@")
48+
s.User = userurl[0]
49+
urlport := strings.Split(userurl[1], ":")
50+
s.Url = urlport[0]
51+
portstring := strings.Split(urlport[1], "/")[0]
52+
port, err := strconv.Atoi(portstring)
53+
if err != nil {
54+
log.Panic().Str("stage", "GetValus").Msg(err.Error())
55+
}
56+
s.Port = port
57+
} else {
58+
userurl := strings.Split(url, "@")
59+
s.User = userurl[0]
60+
urlport := strings.Split(userurl[1], ":")
61+
s.Url = urlport[0]
62+
s.Port = 22
63+
}
64+
}
65+
66+
func VerifyHost(host string, remote net.Addr, key gossh.PublicKey) error {
67+
// Got from the example from https://github.com/melbahja/goph/blob/master/examples/goph/main.go
68+
//
69+
// If you want to connect to new hosts.
70+
// here your should check new connections public keys
71+
// if the key not trusted you shuld return an error
72+
//
73+
74+
// hostFound: is host in known hosts file.
75+
// err: error if key not in known hosts file OR host in known hosts file but key changed!
76+
hostFound, err := goph.CheckKnownHost(host, remote, key, "")
77+
// Host in known hosts but key mismatch!
78+
// Maybe because of MAN IN THE MIDDLE ATTACK!
79+
/*
80+
if hostFound && err != nil {
81+
return err
82+
}
83+
*/
84+
// handshake because public key already exists.
85+
if hostFound && err == nil {
86+
return nil
87+
}
88+
89+
// Add the new host to known hosts file.
90+
return goph.AddKnownHost(host, remote, key, "")
91+
}
92+
4093
func ReadConfigfile(configfile string) *Conf {
4194
cfgdata, err := ioutil.ReadFile(configfile)
4295

@@ -101,6 +154,22 @@ func Locally(repo Repo, l Local) {
101154
url := repo.Url
102155
if repo.Origin.SSH {
103156
url = repo.SshUrl
157+
site := Site{}
158+
site.GetValues(url)
159+
auth, err := goph.Key(repo.Origin.SSHKey, "")
160+
if err != nil {
161+
log.Panic().Str("stage", "locally").Msg(err.Error())
162+
}
163+
_, err = goph.NewConn(&goph.Config{
164+
User: site.User,
165+
Addr: site.Url,
166+
Port: uint(site.Port),
167+
Auth: auth,
168+
Callback: VerifyHost,
169+
})
170+
if err != nil {
171+
log.Panic().Str("stage", "locally").Msg(err.Error())
172+
}
104173
}
105174

106175
_, err = git.PlainClone(repo.Name, false, &git.CloneOptions{

types.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,3 +50,10 @@ type Repo struct {
5050
Defaultbranch string
5151
Origin GenRepo
5252
}
53+
54+
// Site
55+
type Site struct {
56+
Url string
57+
User string
58+
Port int
59+
}

0 commit comments

Comments
 (0)