mirror of
https://github.com/shanghai-edu/multissh.git
synced 2025-12-16 05:17:52 +00:00
VERSION 0.4.0
支持在 sshHost 中配置 ciphers 和 keyExchanges 参数,以更好的适配不同的服务器环境
This commit is contained in:
parent
f369e796bf
commit
770df7122e
4 changed files with 39 additions and 25 deletions
|
|
@ -14,7 +14,7 @@ import (
|
||||||
"golang.org/x/crypto/ssh"
|
"golang.org/x/crypto/ssh"
|
||||||
)
|
)
|
||||||
|
|
||||||
func connect(user, password, host, key string, port int, cipherList []string) (*ssh.Session, error) {
|
func connect(user, password, host, key string, port int, cipherList, keyExchangeList []string) (*ssh.Session, error) {
|
||||||
var (
|
var (
|
||||||
auth []ssh.AuthMethod
|
auth []ssh.AuthMethod
|
||||||
addr string
|
addr string
|
||||||
|
|
@ -45,16 +45,16 @@ func connect(user, password, host, key string, port int, cipherList []string) (*
|
||||||
}
|
}
|
||||||
auth = append(auth, ssh.PublicKeys(signer))
|
auth = append(auth, ssh.PublicKeys(signer))
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(cipherList) == 0 {
|
if len(cipherList) == 0 {
|
||||||
config = ssh.Config{
|
config.Ciphers = []string{"aes128-ctr", "aes192-ctr", "aes256-ctr", "aes128-gcm@openssh.com", "arcfour256", "arcfour128", "aes128-cbc", "3des-cbc", "aes192-cbc", "aes256-cbc"}
|
||||||
Ciphers: []string{"aes128-ctr", "aes192-ctr", "aes256-ctr", "aes128-gcm@openssh.com", "arcfour256", "arcfour128", "aes128-cbc", "3des-cbc", "aes192-cbc", "aes256-cbc"},
|
|
||||||
KeyExchanges: []string{"diffie-hellman-group-exchange-sha1", "diffie-hellman-group1-sha1", "diffie-hellman-group-exchange-sha256"},
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
config = ssh.Config{
|
config.Ciphers = cipherList
|
||||||
Ciphers: cipherList,
|
}
|
||||||
}
|
|
||||||
|
if len(keyExchangeList) == 0 {
|
||||||
|
config.KeyExchanges = []string{"diffie-hellman-group-exchange-sha1", "diffie-hellman-group1-sha1", "diffie-hellman-group-exchange-sha256"}
|
||||||
|
} else {
|
||||||
|
config.KeyExchanges = keyExchangeList
|
||||||
}
|
}
|
||||||
|
|
||||||
clientConfig = &ssh.ClientConfig{
|
clientConfig = &ssh.ClientConfig{
|
||||||
|
|
@ -92,12 +92,12 @@ func connect(user, password, host, key string, port int, cipherList []string) (*
|
||||||
return session, nil
|
return session, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func Dossh(username, password, host, key string, cmdlist []string, port, timeout int, cipherList []string, linuxMode bool, ch chan g.SSHResult) {
|
func Dossh(username, password, host, key string, cmdlist []string, port, timeout int, cipherList, keyExchangeList []string, linuxMode bool, ch chan g.SSHResult) {
|
||||||
chSSH := make(chan g.SSHResult)
|
chSSH := make(chan g.SSHResult)
|
||||||
if linuxMode {
|
if linuxMode {
|
||||||
go dossh_run(username, password, host, key, cmdlist, port, cipherList, chSSH)
|
go dossh_run(username, password, host, key, cmdlist, port, cipherList, keyExchangeList, chSSH)
|
||||||
} else {
|
} else {
|
||||||
go dossh_session(username, password, host, key, cmdlist, port, cipherList, chSSH)
|
go dossh_session(username, password, host, key, cmdlist, port, cipherList, keyExchangeList, chSSH)
|
||||||
}
|
}
|
||||||
var res g.SSHResult
|
var res g.SSHResult
|
||||||
|
|
||||||
|
|
@ -113,8 +113,8 @@ func Dossh(username, password, host, key string, cmdlist []string, port, timeout
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func dossh_session(username, password, host, key string, cmdlist []string, port int, cipherList []string, ch chan g.SSHResult) {
|
func dossh_session(username, password, host, key string, cmdlist []string, port int, cipherList, keyExchangeList []string, ch chan g.SSHResult) {
|
||||||
session, err := connect(username, password, host, key, port, cipherList)
|
session, err := connect(username, password, host, key, port, cipherList, keyExchangeList)
|
||||||
var sshResult g.SSHResult
|
var sshResult g.SSHResult
|
||||||
sshResult.Host = host
|
sshResult.Host = host
|
||||||
|
|
||||||
|
|
@ -159,8 +159,8 @@ func dossh_session(username, password, host, key string, cmdlist []string, port
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func dossh_run(username, password, host, key string, cmdlist []string, port int, cipherList []string, ch chan g.SSHResult) {
|
func dossh_run(username, password, host, key string, cmdlist []string, port int, cipherList, keyExchangeList []string, ch chan g.SSHResult) {
|
||||||
session, err := connect(username, password, host, key, port, cipherList)
|
session, err := connect(username, password, host, key, port, cipherList, keyExchangeList)
|
||||||
var sshResult g.SSHResult
|
var sshResult g.SSHResult
|
||||||
sshResult.Host = host
|
sshResult.Host = host
|
||||||
|
|
||||||
|
|
|
||||||
17
g/cfg.go
17
g/cfg.go
|
|
@ -27,6 +27,12 @@ type SSHHost struct {
|
||||||
|
|
||||||
type HostJson struct {
|
type HostJson struct {
|
||||||
SshHosts []SSHHost
|
SshHosts []SSHHost
|
||||||
|
Global GlobalConfig
|
||||||
|
}
|
||||||
|
|
||||||
|
type GlobalConfig struct {
|
||||||
|
Ciphers string
|
||||||
|
KeyExchanges string
|
||||||
}
|
}
|
||||||
|
|
||||||
type SSHResult struct {
|
type SSHResult struct {
|
||||||
|
|
@ -36,6 +42,9 @@ type SSHResult struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func SplitString(str string) (strList []string) {
|
func SplitString(str string) (strList []string) {
|
||||||
|
if str == "" {
|
||||||
|
return
|
||||||
|
}
|
||||||
if strings.Contains(str, ",") {
|
if strings.Contains(str, ",") {
|
||||||
strList = strings.Split(str, ",")
|
strList = strings.Split(str, ",")
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -72,20 +81,18 @@ func Getfile(filePath string) ([]string, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
//gu
|
//gu
|
||||||
func GetJsonFile(filePath string) ([]SSHHost, error) {
|
func GetJsonFile(filePath string) (HostJson, error) {
|
||||||
result := []SSHHost{}
|
var result HostJson
|
||||||
b, err := ioutil.ReadFile(filePath)
|
b, err := ioutil.ReadFile(filePath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println("read file ", filePath, err)
|
log.Println("read file ", filePath, err)
|
||||||
return result, err
|
return result, err
|
||||||
}
|
}
|
||||||
var m HostJson
|
err = json.Unmarshal(b, &result)
|
||||||
err = json.Unmarshal(b, &m)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println("read file ", filePath, err)
|
log.Println("read file ", filePath, err)
|
||||||
return result, err
|
return result, err
|
||||||
}
|
}
|
||||||
result = m.SshHosts
|
|
||||||
return result, nil
|
return result, nil
|
||||||
}
|
}
|
||||||
func WriteIntoTxt(sshResult SSHResult, locate string) error {
|
func WriteIntoTxt(sshResult SSHResult, locate string) error {
|
||||||
|
|
|
||||||
|
|
@ -9,5 +9,5 @@ package g
|
||||||
// json Unmarshal with error
|
// json Unmarshal with error
|
||||||
// 0.2.3
|
// 0.2.3
|
||||||
const (
|
const (
|
||||||
VERSION = "0.3.0"
|
VERSION = "0.4.0"
|
||||||
)
|
)
|
||||||
|
|
|
||||||
13
main.go
13
main.go
|
|
@ -23,6 +23,7 @@ func main() {
|
||||||
key := flag.String("k", "", "ssh private key")
|
key := flag.String("k", "", "ssh private key")
|
||||||
port := flag.Int("port", 22, "ssh port")
|
port := flag.Int("port", 22, "ssh port")
|
||||||
ciphers := flag.String("ciphers", "", "ciphers")
|
ciphers := flag.String("ciphers", "", "ciphers")
|
||||||
|
keyExchanges := flag.String("keyexchanges", "", "keyexchanges")
|
||||||
cmdFile := flag.String("cmdfile", "", "cmdfile path")
|
cmdFile := flag.String("cmdfile", "", "cmdfile path")
|
||||||
hostFile := flag.String("hostfile", "", "hostfile path")
|
hostFile := flag.String("hostfile", "", "hostfile path")
|
||||||
ipFile := flag.String("ipfile", "", "ipfile path")
|
ipFile := flag.String("ipfile", "", "ipfile path")
|
||||||
|
|
@ -36,7 +37,7 @@ func main() {
|
||||||
|
|
||||||
flag.Parse()
|
flag.Parse()
|
||||||
|
|
||||||
var cmdList, hostList, cipherList []string
|
var cmdList, hostList, cipherList, keyExchangeList []string
|
||||||
var err error
|
var err error
|
||||||
|
|
||||||
sshHosts := []g.SSHHost{}
|
sshHosts := []g.SSHHost{}
|
||||||
|
|
@ -88,6 +89,9 @@ func main() {
|
||||||
if *ciphers != "" {
|
if *ciphers != "" {
|
||||||
cipherList = g.SplitString(*ciphers)
|
cipherList = g.SplitString(*ciphers)
|
||||||
}
|
}
|
||||||
|
if *keyExchanges != "" {
|
||||||
|
keyExchangeList = g.SplitString(*keyExchanges)
|
||||||
|
}
|
||||||
if *cfgFile == "" {
|
if *cfgFile == "" {
|
||||||
for _, host := range hostList {
|
for _, host := range hostList {
|
||||||
host_Struct.Host = host
|
host_Struct.Host = host
|
||||||
|
|
@ -100,11 +104,14 @@ func main() {
|
||||||
sshHosts = append(sshHosts, host_Struct)
|
sshHosts = append(sshHosts, host_Struct)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
sshHosts, err = g.GetJsonFile(*cfgFile)
|
sshHostConfig, err := g.GetJsonFile(*cfgFile)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println("load cfgFile error: ", err)
|
log.Println("load cfgFile error: ", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
cipherList = g.SplitString(sshHostConfig.Global.Ciphers)
|
||||||
|
keyExchangeList = g.SplitString(sshHostConfig.Global.KeyExchanges)
|
||||||
|
sshHosts = sshHostConfig.SshHosts
|
||||||
for i := 0; i < len(sshHosts); i++ {
|
for i := 0; i < len(sshHosts); i++ {
|
||||||
if sshHosts[i].Cmds != "" {
|
if sshHosts[i].Cmds != "" {
|
||||||
sshHosts[i].CmdList = g.SplitString(sshHosts[i].Cmds)
|
sshHosts[i].CmdList = g.SplitString(sshHosts[i].Cmds)
|
||||||
|
|
@ -124,7 +131,7 @@ func main() {
|
||||||
startTime := time.Now()
|
startTime := time.Now()
|
||||||
log.Println("Multissh start")
|
log.Println("Multissh start")
|
||||||
limitFunc := func(chLimit chan bool, ch chan g.SSHResult, host g.SSHHost) {
|
limitFunc := func(chLimit chan bool, ch chan g.SSHResult, host g.SSHHost) {
|
||||||
funcs.Dossh(host.Username, host.Password, host.Host, host.Key, host.CmdList, host.Port, *timeLimit, cipherList, host.LinuxMode, ch)
|
funcs.Dossh(host.Username, host.Password, host.Host, host.Key, host.CmdList, host.Port, *timeLimit, cipherList, keyExchangeList, host.LinuxMode, ch)
|
||||||
<-chLimit
|
<-chLimit
|
||||||
}
|
}
|
||||||
for i, host := range sshHosts {
|
for i, host := range sshHosts {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue