Golang 实现 SSH 执行远端命令

本篇文章会介绍使用 Golang 执行远端命令,并获取香瓜你执行结果的两种方法,SSH 客户端连接,和执行系统命令,最大的区别是,前者会建立 SSH 连接,之后执行相应的命令;后者是执行系统 ssh 命令, 把想要执行的操作当做 ssh 的参数。

在执行远端命令相关的文章我在我的另一篇文章已经介绍了 Python, Shell, Perl 这三种方法,详见:http://blog.csdn.net/u010649766/article/details/78465503

执行系统命令

这个方法需要有一个环境的准备:与目标服务器建立免密码登陆,并且执行程序的用户与执行用户一致。


import (
    "net"
    "log"
    "fmt"
    "bytes"
    "os/exec"
    "strconv"
    str "strings"
    "golang.org/x/crypto/ssh"
)

func runCmd(){

    var stdOut, stdErr bytes.Buffer

    cmd := exec.Command( "ssh", "username@192.168.1.4", "if [ -d liujx/project ];then echo 0;else echo 1;fi" )
    cmd.Stdout = &stdOut
    cmd.Stderr = &stdErr
    if err := cmd.Run(); err != nil {
        fmt.Printf( "cmd exec failed: %s : %s", fmt.Sprint( err ), stdErr.String() )
    }

    fmt.Print( stdOut.String() )
    ret, err := strconv.Atoi( str.Replace( stdOut.String(), "\n", "", -1 )  )
    if err != nil {
        panic(err)
    }

    fmt.Printf("%d, %s\n", ret, stdErr.String() )
}

SSH 客户端连接

这种方法可以不用搭建免密码登陆环境,连接时可指定用户和密码的。

func SSHConnect( user, password, host string, port int ) ( *ssh.Session, error ) {
    var (
        auth         []ssh.AuthMethod
        addr         string
        clientConfig *ssh.ClientConfig
        client       *ssh.Client
        session      *ssh.Session
        err          error
    )
    // get auth method
    auth = make([]ssh.AuthMethod, 0)
    auth = append(auth, ssh.Password(password))

    hostKeyCallbk := func(hostname string, remote net.Addr, key ssh.PublicKey) error {
            return nil
    }

    clientConfig = &ssh.ClientConfig{
        User:               user,
        Auth:               auth,
        // Timeout:             30 * time.Second,
        HostKeyCallback:    hostKeyCallbk, 
    }

    // connet to ssh
    addr = fmt.Sprintf( "%s:%d", host, port )

    if client, err = ssh.Dial( "tcp", addr, clientConfig ); err != nil {
        return nil, err
    }

    // create session
    if session, err = client.NewSession(); err != nil {
        return nil, err
    }

    return session, nil
}

func runSsh(){

    var stdOut, stdErr bytes.Buffer

    session, err := SSHConnect( "username", "passworld", "192.168.1.4", 22 )
    if err != nil {
        log.Fatal(err)
    }
    defer session.Close()

    session.Stdout = &stdOut
    session.Stderr = &stdErr

    session.Run("if [ -d liujx/project ]; then echo 0; else echo 1; fi")
    ret, err := strconv.Atoi( str.Replace( stdOut.String(), "\n", "", -1 )  )
    if err != nil {
        panic(err)
    }

    fmt.Printf("%d, %s\n", ret, stdErr.String() )

}

ps: 由于 golang.org 被墙,所以直接用 go get golang.org/x/crypto/ssh 会报超时,所以如果我们可以从 GitHub 上获取资源拷贝到这个目录下, 具体操作如下:

mkdir -p $GOPATH/src/golang.org/x/
cd $GOPATH/src/golang.org/x/
git clone https://github.com/golang/crypto.git
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值