This code works at best effort; therefore, the SSH client tries to connect to servers even with not recommended Kex and Ciphers:
DIAL:
conn, err = ssh.Dial("tcp", addr, sshConfig)
if err != nil {
m := regexp.MustCompile(`server offered: \[(.*)\]`)
errString := err.Error()
if strings.Contains(errString, "key exchange") {
sshConfig.Config.KeyExchanges = strings.Split(m.FindStringSubmatch(errString)[1], " ")
goto DIAL
}
if strings.Contains(errString, "server cipher") {
sshConfig.Config.Ciphers = strings.Split(m.FindStringSubmatch(errString)[1], " ")
goto DIAL
}
return nil, err
}
goto
had proved very useful in this case because it reduced the amount of code to handle all these exceptions.
./getrun -t {target} -P {port} -u {username} -p {password}