go 远程开关机

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/yaoike/article/details/88187259

go 远程开关机的代码,因为刚接触go,时间又赶,没做优化,在此记录一下,免得过后忘了。

 

package main

import (
	"flag"
	"fmt"
	"log"
	"net"
	"os/exec"
	"reflect"
)

var (
	arg string
)

func init() {
	flag.StringVar(&arg, "uFlags", "", "shutdown")
}


func main() {
	Startup()
	ShutDownEXE()

	/*
		flag.Parse()

		switch arg {
		case "shutdown":
			ReShutDownEXE()
		default:
			fmt.Println("您输入的参数有误.")
		}
	*/
}

func ShutDownEXE() {
	fmt.Println("远程关闭目标机")
	arg := []string{"-m", "\\\\10.1.16.56", "-s", "-t", "20"}
	cmd := exec.Command("shutdown", arg...)
	d, err := cmd.CombinedOutput()
	if err != nil {
		fmt.Println("Error:", err)

		return
	}
	fmt.Println(string(d))
	return
}

func Startup() {
	addr := "10.1.16.255:20000" //定义主机名
	//addr := "255.255.255.255:0"        //定义主机名
	conn, err := net.Dial("udp", addr) //拨号操作,需要指定协议。
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println("访问公网IP地址是:", conn.RemoteAddr().String()) /*获取“conn”中的公网地址。注意:最好是加上后面的String方法,因为他们的那些是不一样的哟·当然你打印的时候可以不加输出结果是一样的,但是你的内心是不一样的哟!*/
	fmt.Printf("客户端链接的地址及端口是:%v\n", conn.LocalAddr())     //获取到本地的访问地址和端口。
	fmt.Println("“conn.LocalAddr()”所对应的数据类型是:", reflect.TypeOf(conn.LocalAddr()))
	fmt.Println("“conn.RemoteAddr().String()”所对应的数据类型是:", reflect.TypeOf(conn.RemoteAddr().String()))
	head := []byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff}
	mac := []byte{0xB0, 0x83, 0xFE, 0x8C, 0xAE, 0x03} 
	data := append([]byte{}, head...)
	for i := 0; i < 16; i++ {
		data = append(data, mac...)
	}

	//n, err := conn.Write([]byte("GET / HTTP/1.1\r\n\r\n")) //向服务端发送数据。用n接受返回的数据大小,用err接受错误信息。
	n, err := conn.Write(data) //向服务端发送数据。用n接受返回的数据大小,用err接受错误信息。
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println("向服务端发送的数据大小是:", n)


	conn.Close() //断开UDP链接。
}

 

 

 

 

展开阅读全文

没有更多推荐了,返回首页