目录

1. golang使用golang.org/x/crypto/ssh库远程执行命令获取命令退出码

type SSH struct {
	Ip       string
	Port     int
	Username string
	Password string
	Client   *ssh.Client
	Session  *ssh.Session
	channel  ssh.Channel
}


func (this *SSH) Connect() (error) {
	config := &ssh.ClientConfig{}
	config.SetDefaults()
	config.User = this.Username
	config.Auth = []ssh.AuthMethod{ssh.Password(this.Password)}
	config.HostKeyCallback = ssh.InsecureIgnoreHostKey()
	config.Timeout = time.Second * 10
	addr := fmt.Sprintf("%s:%d", this.Ip, this.Port)
	client, err := ssh.Dial("tcp", addr, config)
	if err != nil {
		return err
	} else {
		this.Client = client
		return nil
	}
}



func (this *SSH) Exec(cmd string) (stdout string, exitCode int, err error) {
	//var buf bytes.Buffer
	session, err := this.Client.NewSession()
	if err != nil {
	}

	defer this.Client.Close()
	defer session.Close()
	this.Session = session
	//https://github.com/golang/go/issues/14251
	bs, err := session.CombinedOutput(cmd)
	if err != nil {
		if v, ok := err.(*ssh.ExitError); ok {
			exitCode = v.Waitmsg.ExitStatus()
		}
		global.GLog.Error(err)
	}
	stdout = string(bs)
	return stdout, exitCode, err
}

2. golang使用golang.org/x/crypto/ssh库远程执行bash脚本带参数

在bash脚本中获取参数的方法是使用\$1 $2 ...分别获取第一第二个参数,还有一种方法是通过脚本内部 在脚本前面加上set 1 2 3

比如test.sh如下

set a b c
echo $@

然后运行bash test.sh 输出如下

a b c

然后golang使用golang.org/x/crypto/ssh库远程执行bash脚本带参数只需要把cmd替换

cmd := fmt.Sprintf("set %s;%s", argv, shell)
ssh := &SSH{...初始化...} //为标题1的SSH结构体
out,exitcode,err:=ssh.Exec(cmd)

3. golang使用golang.org/x/crypto/ssh库远程执行python脚本带参数

在python脚本中接收参数是通过sys包的argv变量,如果没有python脚本只是一段代码的话可以通过下面的方法获取

yangyang@yangyang-HP:~$ python -c "import sys;print(sys.argv[1:])" a b c
['a', 'b', 'c']

但是这种办法有一个局限-c内部的代码不能再出现双引号,因此不可用

还有一种管道

yangyang@yangyang-HP:~$ echo "import sys;print(sys.argv[1:])"|python
[]
yangyang@yangyang-HP:~$ echo "import sys;print(sys.argv[1:])"|python a
python: can't open file 'a': [Errno 2] No such file or directory

最终版本,不管python代码段有单引号还是双引号都可以,也可以获取到参数

yangyang@yangyang-HP:~$ python - a b c << 'eof'
> import sys
> print(sys.argv[1:])
> print('hello')
> print("world")
> eof
['a', ''b, 'c']
hello
world

然后golang使用golang.org/x/crypto/ssh库远程执行python脚本只需要处理一下cmd

cmd := fmt.Sprintf(`python - %s << 'eof'
%s
eof`,argv,pythonscript)
ssh := &SSH{...初始化...} //为标题1的SSH结构体
out,exitcode,err:=ssh.Exec(cmd)

4. golang中的io

从io.Writer接口写数据

从io.Reader接口读数据

5. go中的多态,go中没有多态

多态为面向对象编程中很重要的一个概念,java中的多态为父类可以指向任何子类对象

package main

import (
	"fmt"
)

type Base struct {
	name string
}

func (b Base) Hello() {
	fmt.Println("hello base")
	b.Hi() //如果重写了Hi这里总是调下面的Hi 因为b 是Base类型
}
func (b Base) Hi() {

}

type Child struct {
	Base
}

func (c Child) Hi() {
	fmt.Println("hi child ")
}
type Welcome interface {
	Hello()
	Hi()
}

func Hello(welcome Welcome)  {
	welcome.Hello()
}

func main() {
	var x Welcome
	x = Child{}
	x.Hello()
	x = Base{}
	x.Hello()
	//hello base
	//hello base
	//	没有输出我想要的结果
	//我想要输出
	//hello base
	//hi child
	//hello base
	//Hello(x)
}

下载