Golang実装SSH実行リモートコマンド
5700 ワード
この記事では、Golangを使用してリモートコマンドを実行し、メロンの実行結果を取得する2つの方法を紹介します.SSHクライアント接続とシステムコマンドの実行です.最大の違いは、前者がSSH接続を確立し、その後、対応するコマンドを実行することです.後者はシステムsshコマンドを実行し,実行したい操作をsshのパラメータとする.
リモートコマンドの実行に関する記事では、Python、Shell、Perlの3つの方法について説明しました.http://blog.csdn.net/u010649766/article/details/78465503
システムコマンドの実行
この方法は,ターゲットサーバとパスワードレスログインを確立し,プログラムを実行するユーザが実行ユーザと一致する環境の準備が必要である.
SSHクライアント接続
この方法では,パスワードなしログイン環境を構築することなく,接続時にユーザとパスワードを指定することができる.
ps:golang.orgは壁に囲まれているため、
リモートコマンドの実行に関する記事では、Python、Shell、Perlの3つの方法について説明しました.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", "[email protected]", "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(), "
", "", -1 ) )
if err != nil {
panic(err)
}
fmt.Printf("%d, %s
", 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(), "
", "", -1 ) )
if err != nil {
panic(err)
}
fmt.Printf("%d, %s
", 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