【RPC】前传

前传

本地程序用的go语言,想把main.go程序当中一些计算工作放到服务器上进行,而只需要把结果给我即可。由于平台上暂时不能运行Go代码,所以写的是python文件。

1、主要是使用ssh依赖进行连接,但是大概率是需要手动添加的,自动添加一直在报错。里面的go.mod也是要重新生成的,主要还是不太熟。

连接就需要账号密码和地址,配置好之后进行连接。test.py里面只有一个变量a,并且数值是固定的,只是需要输出而已,里面的username和pwd还有Ip是自己的信息。

go 复制代码
package main

import (
	"fmt"
	"log"
	"net"
	"time"
	"golang.org/x/crypto/ssh"
)

// 连接的配置
type ClientConfig struct {
	Host       string      //ip
	Port       int64       // 端口
	Username   string      //用户名
	Password   string      //密码
	Client     *ssh.Client //ssh client
	LastResult string      //最近一次运行的结果
}

func (cliConf *ClientConfig) createClient(host string, port int64, username, password string) {
	var (
		client *ssh.Client
		err    error
	)
	cliConf.Host = host
	cliConf.Port = port
	cliConf.Username = username
	cliConf.Password = password
	cliConf.Port = port
	//一般传入四个参数:user,[]ssh.AuthMethod{ssh.Password(password)}, HostKeyCallback,超时时间,
	config := ssh.ClientConfig{
		User: cliConf.Username,
		Auth: []ssh.AuthMethod{ssh.Password(password)},
		HostKeyCallback: func(hostname string, remote net.Addr, key ssh.PublicKey) error {
			return nil
		},
		Timeout: 10 * time.Second,
	}
	addr := fmt.Sprintf("%s:%d", cliConf.Host, cliConf.Port)
	//获取client
	if client, err = ssh.Dial("tcp", addr, &config); err != nil {
		log.Fatalln("error occurred:", err)
	}
	cliConf.Client = client
}
func (cliConf *ClientConfig) RunShell(shell string) string {
	var (
		session *ssh.Session
		err     error
	)
	//获取session,这个session是用来远程执行操作的
	if session, err = cliConf.Client.NewSession(); err != nil {
		log.Fatalln("error occurred:", err)
	}
	//执行shell
	if output, err := session.CombinedOutput(shell); err != nil {
		log.Fatalln("error occurred:", err)
	} else {
		cliConf.LastResult = string(output)
	}
	return cliConf.LastResult
}
func main() {
	cliConf := new(ClientConfig)
	cliConf.createClient("ip", 22, "username", "pwd")
	fmt.Println(cliConf.RunShell("cd gotest;python test.py"))
}

服务器里面的代码是放在gotest文件夹里面的,而每一次运行都需要cd gotest,没有办法记录,每次执行一条命令都会创建一条session,而一条session默认只能执行一条命令,并且两条命令不可以分开写。也就是:

go 复制代码
fmt.Println(cliConf.RunShell("cd gotest;python test.py"))

这一行代码,不可以写成

go 复制代码
cliConf.RunShell("cd gotest")
fmt.Println(cliConf.RunShell("python test.py"))

下图是一个运行结果:

但是我将来肯定需要往里面放数据,所以写test2.py文件:

相应的修改main.go文件里面的runshell语句为:

go 复制代码
fmt.Println(cliConf.RunShell("cd gotest;python test.py"))

但是没有办法进行输入,且一直会报错

后面朋友说可以通过命令行写参数,所以把test2.py和main.go里面都进行了修改

go 复制代码
fmt.Println(cliConf.RunShell("cd gotest;python test.py 2 3"))

结果也是可以正确输出的

但是可以看到仅仅是一个加法,花费的时间是很长的,数据来回的传输是很耗时的。

看到go有内置的RPC,是一个进行远程控制的。

相关推荐
cozil1 小时前
记录磊科B39路由器跨域组网遇到的问题
网络·智能路由器·跨域组网
路由侠内网穿透1 小时前
本地部署开源数据分析平台 Elastic Stack 并实现外部访问( Windows 版本)
运维·服务器·网络·windows·开源·jenkins
FreeBuf_2 小时前
AWS服务大规模中断,基础设施故障影响全球企业
网络·数据库·aws
王道长服务器 | 亚马逊云2 小时前
AWS CloudFormation —— 自动化部署的“云中脚本大师”
运维·服务器·网络·自动化·云计算·aws
ZepngLin2 小时前
时间敏感网络(TSN)
网络
Bruce_Liuxiaowei2 小时前
解决Kali虚拟机中VMnet1(仅主机模式)网卡无法获取IP地址的问题
运维·网络·网络协议·tcp/ip
-SGlow-3 小时前
Linux相关概念和易错知识点(48)(epoll的底层原理、epoll的工作模式、反应堆模式)
linux·服务器·c语言·网络·c++
雪碧聊技术3 小时前
HTTP 核心知识点速查表
网络·网络协议·http
foundbug9994 小时前
基于CSMA-CA协议的V2X通信MATLAB仿真
开发语言·网络·matlab
卓码软件测评5 小时前
使用Wireshark测试手机APP网络通信完整指南
网络·功能测试·测试工具·智能手机·wireshark·测试用例·压力测试