执行系统命令
这个方法需要有一个环境的准备:与目标服务器建立免密码登陆,并且执行程序的用户与执行用户一致。
import ("net""log""fmt""bytes""os/exec""strconv"str "strings""/x/crypto/ssh")func runCmd(){var stdOut, stdErr bytes.Buffercmd := mand( "ssh", "username@192.168.1.4", "if [ -d liujx/project ];then echo 0;else echo 1;fi" )cmd.Stdout = &stdOutcmd.Stderr = &stdErrif 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.AuthMethodaddr stringclientConfig *ssh.ClientConfigclient *ssh.Clientsession*ssh.Sessionerrerror)// get auth methodauth = 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 sshaddr = fmt.Sprintf( "%s:%d", host, port )if client, err = ssh.Dial( "tcp", addr, clientConfig ); err != nil {return nil, err}// create sessionif session, err = client.NewSession(); err != nil {return nil, err}return session, nil}func runSsh(){var stdOut, stdErr bytes.Buffersession, err := SSHConnect( "username", "passworld", "192.168.1.4", 22 )if err != nil {log.Fatal(err)}defer session.Close()session.Stdout = &stdOutsession.Stderr = &stdErrsession.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: 由于 被墙,所以直接用go get /x/crypto/ssh
会报超时,所以如果我们可以从 GitHub 上获取资源拷贝到这个目录下, 具体操作如下:
mkdir -p $GOPATH/src//x/cd $GOPATH/src//x/git clone /golang/crypto.git