diff --git a/README.MD b/README.MD index 5cfb03f..0d96985 100644 --- a/README.MD +++ b/README.MD @@ -29,42 +29,40 @@ https://github.com/shanghai-edu/multissh/releases/ # ./multissh -h Usage of ./multissh: -c string - cfg File Path + cfg File Path -ciphers string - ciphers + ciphers -cmdfile string - cmdfile path + cmdfile path -cmds string - cmds + cmds -f string - write file locate + write file locate -hostfile string - hostfile path + hostfile path -hosts string - host address list + host address list -ipfile string - ipfile path + ipfile path -ips string - ip address list - -j print output in json format + ip address list + -j print output in json format -k string - ssh private key - -keyexchanges string - keyexchanges - -l In linux mode,multi command combine with && ,such as date&&cd /opt&&ls + ssh private key + -l In linux mode,multi command combine with && ,such as date&&cd /opt&&ls -n int - max execute number (default 20) + max execute number (default 20) -outTxt - write result into txt + write result into txt -p string - password + password -port int - ssh port (default 22) + ssh port (default 22) -t int - max timeout (default 30) + max timeout (default 30) -u string - username - -v show version + username + -v show version ``` **cmdfile 示例** ``` @@ -84,28 +82,24 @@ show clock **ssh.json 示例** ``` { - "SshHosts": [{ - "Host": "192.168.31.51", - "Port": 22, - "Username": "admin", - "Password": "admin", - "cmds": "show clock;show clock" - }, - { - "Host": "192.168.80.131", - "Port": 22, - "Username": "root", - "Password": "", - "key": "./server.key", - "linuxMode": true, - "CmdFile": "cmd2.txt.example" - } - ], - "Global": { - "Ciphers": "aes128-ctr,aes192-ctr,aes256-ctr,aes128-cbc,3des-cbc", - "KeyExchanges": "diffie-hellman-group1-sha1,curve25519-sha256@libssh.org,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256,diffie-hellman-group14-sha1" - } - + "SshHosts": [ + { + "Host": "192.168.31.51", + "Port": 22, + "Username": "admin", + "Password": "admin", + "cmds":"show clock;show clock" + }, + { + "Host": "192.168.80.131", + "Port": 22, + "Username": "root", + "Password": "", + "key": "./server.key", + "linuxMode": true, + "CmdFile": "cmd2.txt.example" + } + ] } ``` diff --git a/funcs/ssh_test.go b/funcs/ssh_test.go index 5dc124a..0ff1d7e 100644 --- a/funcs/ssh_test.go +++ b/funcs/ssh_test.go @@ -16,13 +16,9 @@ const ( key = "../server.key" ) -// Tests the SSH functionality of the package. -// -// It requires manual input of the local SSH private key path into the key -// variable, and the remote address into the ip variable. func Test_SSH(t *testing.T) { var cipherList []string - session, err := connect(username, password, ip, key, port, cipherList, nil) + session, err := connect(username, password, ip, key, port, cipherList) if err != nil { t.Error(err) return diff --git a/funcs/sshconnect.go b/funcs/sshconnect.go index fd8f359..403c802 100644 --- a/funcs/sshconnect.go +++ b/funcs/sshconnect.go @@ -14,7 +14,7 @@ import ( "golang.org/x/crypto/ssh" ) -func connect(user, password, host, key string, port int, cipherList, keyExchangeList []string) (*ssh.Session, error) { +func connect(user, password, host, key string, port int, cipherList []string) (*ssh.Session, error) { var ( auth []ssh.AuthMethod addr string @@ -45,16 +45,16 @@ func connect(user, password, host, key string, port int, cipherList, keyExchange } auth = append(auth, ssh.PublicKeys(signer)) } - if len(cipherList) == 0 { - config.Ciphers = []string{"aes128-ctr", "aes192-ctr", "aes256-ctr", "aes128-gcm@openssh.com", "arcfour256", "arcfour128", "aes128-cbc", "3des-cbc", "aes192-cbc", "aes256-cbc"} - } else { - config.Ciphers = cipherList - } - if len(keyExchangeList) == 0 { - config.KeyExchanges = []string{"diffie-hellman-group-exchange-sha1", "diffie-hellman-group1-sha1", "diffie-hellman-group-exchange-sha256"} + if len(cipherList) == 0 { + config = ssh.Config{ + 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 { - config.KeyExchanges = keyExchangeList + config = ssh.Config{ + Ciphers: cipherList, + } } clientConfig = &ssh.ClientConfig{ @@ -92,12 +92,12 @@ func connect(user, password, host, key string, port int, cipherList, keyExchange return session, nil } -func Dossh(username, password, host, key string, cmdlist []string, port, timeout int, cipherList, keyExchangeList []string, linuxMode bool, ch chan g.SSHResult) { +func Dossh(username, password, host, key string, cmdlist []string, port, timeout int, cipherList []string, linuxMode bool, ch chan g.SSHResult) { chSSH := make(chan g.SSHResult) if linuxMode { - go dossh_run(username, password, host, key, cmdlist, port, cipherList, keyExchangeList, chSSH) + go dossh_run(username, password, host, key, cmdlist, port, cipherList, chSSH) } else { - go dossh_session(username, password, host, key, cmdlist, port, cipherList, keyExchangeList, chSSH) + go dossh_session(username, password, host, key, cmdlist, port, cipherList, chSSH) } var res g.SSHResult @@ -113,8 +113,8 @@ func Dossh(username, password, host, key string, cmdlist []string, port, timeout return } -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, keyExchangeList) +func dossh_session(username, password, host, key string, cmdlist []string, port int, cipherList []string, ch chan g.SSHResult) { + session, err := connect(username, password, host, key, port, cipherList) var sshResult g.SSHResult sshResult.Host = host @@ -159,8 +159,8 @@ func dossh_session(username, password, host, key string, cmdlist []string, port return } -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, keyExchangeList) +func dossh_run(username, password, host, key string, cmdlist []string, port int, cipherList []string, ch chan g.SSHResult) { + session, err := connect(username, password, host, key, port, cipherList) var sshResult g.SSHResult sshResult.Host = host diff --git a/g/cfg.go b/g/cfg.go index cfe81be..b3a3a32 100644 --- a/g/cfg.go +++ b/g/cfg.go @@ -27,12 +27,6 @@ type SSHHost struct { type HostJson struct { SshHosts []SSHHost - Global GlobalConfig -} - -type GlobalConfig struct { - Ciphers string - KeyExchanges string } type SSHResult struct { @@ -42,9 +36,6 @@ type SSHResult struct { } func SplitString(str string) (strList []string) { - if str == "" { - return - } if strings.Contains(str, ",") { strList = strings.Split(str, ",") } else { @@ -81,18 +72,20 @@ func Getfile(filePath string) ([]string, error) { } //gu -func GetJsonFile(filePath string) (HostJson, error) { - var result HostJson +func GetJsonFile(filePath string) ([]SSHHost, error) { + result := []SSHHost{} b, err := ioutil.ReadFile(filePath) if err != nil { log.Println("read file ", filePath, err) return result, err } - err = json.Unmarshal(b, &result) + var m HostJson + err = json.Unmarshal(b, &m) if err != nil { log.Println("read file ", filePath, err) return result, err } + result = m.SshHosts return result, nil } func WriteIntoTxt(sshResult SSHResult, locate string) error { diff --git a/g/const.go b/g/const.go index 9e9db32..43aee6a 100644 --- a/g/const.go +++ b/g/const.go @@ -9,5 +9,5 @@ package g // json Unmarshal with error // 0.2.3 const ( - VERSION = "0.4.0" + VERSION = "0.3.0" ) diff --git a/main.go b/main.go index 7b7693f..439e461 100644 --- a/main.go +++ b/main.go @@ -23,7 +23,6 @@ func main() { key := flag.String("k", "", "ssh private key") port := flag.Int("port", 22, "ssh port") ciphers := flag.String("ciphers", "", "ciphers") - keyExchanges := flag.String("keyexchanges", "", "keyexchanges") cmdFile := flag.String("cmdfile", "", "cmdfile path") hostFile := flag.String("hostfile", "", "hostfile path") ipFile := flag.String("ipfile", "", "ipfile path") @@ -37,7 +36,7 @@ func main() { flag.Parse() - var cmdList, hostList, cipherList, keyExchangeList []string + var cmdList, hostList, cipherList []string var err error sshHosts := []g.SSHHost{} @@ -89,9 +88,6 @@ func main() { if *ciphers != "" { cipherList = g.SplitString(*ciphers) } - if *keyExchanges != "" { - keyExchangeList = g.SplitString(*keyExchanges) - } if *cfgFile == "" { for _, host := range hostList { host_Struct.Host = host @@ -104,14 +100,11 @@ func main() { sshHosts = append(sshHosts, host_Struct) } } else { - sshHostConfig, err := g.GetJsonFile(*cfgFile) + sshHosts, err = g.GetJsonFile(*cfgFile) if err != nil { log.Println("load cfgFile error: ", err) return } - cipherList = g.SplitString(sshHostConfig.Global.Ciphers) - keyExchangeList = g.SplitString(sshHostConfig.Global.KeyExchanges) - sshHosts = sshHostConfig.SshHosts for i := 0; i < len(sshHosts); i++ { if sshHosts[i].Cmds != "" { sshHosts[i].CmdList = g.SplitString(sshHosts[i].Cmds) @@ -131,7 +124,7 @@ func main() { startTime := time.Now() log.Println("Multissh start") 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, keyExchangeList, host.LinuxMode, ch) + funcs.Dossh(host.Username, host.Password, host.Host, host.Key, host.CmdList, host.Port, *timeLimit, cipherList, host.LinuxMode, ch) <-chLimit } for i, host := range sshHosts { diff --git a/ssh.json.example b/ssh.json.example index 01fa5ee..bede1a5 100644 --- a/ssh.json.example +++ b/ssh.json.example @@ -1,24 +1,20 @@ { - "SshHosts": [{ - "Host": "192.168.31.51", - "Port": 22, - "Username": "admin", - "Password": "admin", - "cmds": "show clock;show clock" - }, - { - "Host": "192.168.80.131", - "Port": 22, - "Username": "root", - "Password": "", - "key": "./server.key", - "linuxMode": true, - "CmdFile": "cmd2.txt.example" - } - ], - "Global": { - "Ciphers": "aes128-ctr,aes192-ctr,aes256-ctr,aes128-cbc,3des-cbc", - "KeyExchanges": "diffie-hellman-group1-sha1,curve25519-sha256@libssh.org,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256,diffie-hellman-group14-sha1" - } - + "SshHosts": [ + { + "Host": "192.168.31.51", + "Port": 22, + "Username": "admin", + "Password": "admin", + "cmds":"show clock;show clock" + }, + { + "Host": "192.168.80.131", + "Port": 22, + "Username": "root", + "Password": "", + "key": "./server.key", + "linuxMode": true, + "CmdFile": "cmd2.txt.example" + } + ] } \ No newline at end of file