added known_hosts

This commit is contained in:
ston1th 2022-04-02 20:33:21 +02:00
commit 9995ffbd7a
3 changed files with 570 additions and 17 deletions

View file

@ -6,6 +6,7 @@ import (
"cachefs/pkg/provider"
"context"
"errors"
"fmt"
"io/fs"
"net"
"net/url"
@ -17,6 +18,7 @@ import (
"github.com/go-logr/logr"
"github.com/pkg/sftp"
"golang.org/x/crypto/ssh"
"golang.org/x/crypto/ssh/knownhosts"
)
var (
@ -97,12 +99,14 @@ func (fs *FS) connect(ctx context.Context) {
select {
case <-ctx.Done():
return
case err = <-fs.wait(ctx):
log.V(2).Info("connection lost", "err", err)
case e := <-fs.wait(ctx):
log.V(2).Info("connection lost", "err", e)
fs.conn.Close()
fs.client = connError{}
fs.c = nil
}
} else {
log.Error(err, "error connecting")
}
select {
case <-ctx.Done():
@ -211,31 +215,39 @@ func sshConfig(u *url.URL) (c *ssh.ClientConfig, err error) {
if u.User == nil {
return nil, errors.New("missing username")
}
//var hostKey ssh.PublicKey
q, err := url.ParseQuery(u.RawQuery)
if err != nil {
return nil, err
}
c = &ssh.ClientConfig{
Config: ssh.Config{
KeyExchanges: []string{"curve25519-sha256"},
Ciphers: []string{"aes128-ctr"},
MACs: []string{"hmac-sha2-256"},
//KeyExchanges: []string{"curve25519-sha256"},
Ciphers: []string{"aes128-ctr"},
MACs: []string{"hmac-sha2-256"},
},
User: u.User.Username(),
Timeout: time.Second * 30,
HostKeyCallback: ssh.InsecureIgnoreHostKey(),
//HostKeyCallback: ssh.FixedHostKey(hostKey),
User: u.User.Username(),
Timeout: time.Second * 30,
}
known := q.Get("known_hosts")
if known == "" {
home, err := os.UserHomeDir()
if err != nil {
return nil, fmt.Errorf("error reading user home: %w", err)
}
known = filepath.Join(home, ".ssh", "known_hosts")
}
c.HostKeyCallback, err = knownhosts.New(known)
if err != nil {
return nil, err
}
if pw, ok := u.User.Password(); ok {
c.Auth = []ssh.AuthMethod{ssh.Password(pw)}
} else {
q, err := url.ParseQuery(u.RawQuery)
buf, err := os.ReadFile(q.Get("key"))
if err != nil {
return nil, err
}
key, err := os.ReadFile(q.Get("keyfile"))
if err != nil {
return nil, err
}
signer, err := ssh.ParsePrivateKey(key)
signer, err := ssh.ParsePrivateKey(buf)
c.Auth = []ssh.AuthMethod{ssh.PublicKeys(signer)}
}
return