added known_hosts
This commit is contained in:
parent
ce73f0472c
commit
9995ffbd7a
3 changed files with 570 additions and 17 deletions
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue