12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 |
- package main
- import (
- "fmt"
- "io/ioutil"
- "log"
- "time"
- "github.com/mitchellh/go-homedir"
- "golang.org/x/crypto/ssh"
- )
- func main() {
- sshHost := "119.28.163.42"
- sshUser := "root"
- sshPassword := ""
- sshType := "key" //password 或者 key
- sshKeyPath := "/root/.ssh/id_rsa" //ssh id_rsa.id 路径"
- sshPort := 7721
- //创建sshp登陆配置
- config := &ssh.ClientConfig{
- Timeout: time.Second, //ssh 连接time out 时间一秒钟, 如果ssh验证错误 会在一秒内返回
- User: sshUser,
- HostKeyCallback: ssh.InsecureIgnoreHostKey(), //这个可以, 但是不够安全
- //HostKeyCallback: hostKeyCallBackFunc(h.Host),
- }
- if sshType == "password" {
- config.Auth = []ssh.AuthMethod{ssh.Password(sshPassword)}
- } else {
- config.Auth = []ssh.AuthMethod{publicKeyAuthFunc(sshKeyPath)}
- }
- //dial 获取ssh client
- addr := fmt.Sprintf("%s:%d", sshHost, sshPort)
- sshClient, err := ssh.Dial("tcp", addr, config)
- if err != nil {
- log.Fatal("创建ssh client 失败", err)
- }
- defer sshClient.Close()
- //创建ssh-session
- session, err := sshClient.NewSession()
- if err != nil {
- log.Fatal("创建ssh session 失败", err)
- }
- defer session.Close()
- //执行远程命令
- combo, err := session.CombinedOutput("ifconfig")
- if err != nil {
- log.Fatal("远程执行cmd 失败", err)
- }
- log.Println("命令输出:", string(combo))
- }
- func publicKeyAuthFunc(kPath string) ssh.AuthMethod {
- //交叉编译打开文件
- keyPath, err := homedir.Expand(kPath)
- if err != nil {
- log.Fatal("find key's home dir failed", err)
- }
- //读文件
- key, err := ioutil.ReadFile(keyPath)
- if err != nil {
- log.Fatal("ssh key file read failed", err)
- }
- //解析为一个对象
- // Create the Signer for this private key.
- signer, err := ssh.ParsePrivateKey(key)
- if err != nil {
- log.Fatal("ssh key signer failed", err)
- }
- //放入key对象 生成一个指针
- return ssh.PublicKeys(signer)
- }
|