rCMD/win.go
2023-11-27 19:18:41 +08:00

122 lines
2.1 KiB
Go

package main
import (
"encoding/json"
"fmt"
"golang.org/x/sys/windows"
"os"
"os/exec"
"github.com/r3labs/sse/v2"
)
func main() {
println("Hello, World!")
deviceId := os.Getenv("DEVICE_ID")
if deviceId == "" {
println("DEVICE_ID env is not set")
os.Exit(1)
}
for {
fmt.Println("开始连接。")
client := sse.NewClient("https://ivampiresp.com/wp-content/rCMD/sse.php?device=" + deviceId)
err := client.Subscribe("message", func(msg *sse.Event) {
//fmt.Println(msg.Data)
// byte to json
var data map[string]interface{}
err := json.Unmarshal(msg.Data, &data)
//fmt.Println(data)
if err != nil {
fmt.Println(err)
return
}
cmd := data["cmd"]
param := data["param"]
if cmd == nil {
fmt.Println("cmd or params is nil")
return
}
// interface to string
cmdStr := fmt.Sprintf("%v", cmd)
paramStr := fmt.Sprintf("%v", param)
fmt.Println(cmdStr)
fmt.Println(paramStr)
fmt.Println("参数是: " + paramStr)
// 获取当前用户目录
home, err := os.UserHomeDir()
if err != nil {
fmt.Println(err)
return
}
// 切换到用户目录
err = os.Chdir(home)
if err != nil {
fmt.Println(err)
return
}
// 快捷命令,比如 lock
canExec := quickCommand(cmdStr)
if canExec {
return
}
fmt.Println("命令: " + cmdStr + " " + paramStr)
cmdExec := exec.Command(cmdStr, paramStr)
err = cmdExec.Run()
if err != nil {
fmt.Println(err)
return
}
fmt.Println(cmdExec.Output())
//fmt.Println(cmdExec.Stdout)
//fmt.Println(cmdExec.Stderr)
//fmt.Println(cmdExec.ProcessState)
fmt.Println("执行完成。")
})
if err != nil {
fmt.Println(err)
// 下个循环重新连接
continue
}
}
}
func lockWorkStation() error {
user32 := windows.NewLazySystemDLL("user32.dll")
lockWorkStation := user32.NewProc("LockWorkStation")
ret, _, err := lockWorkStation.Call()
if ret == 0 {
return err
}
return nil
}
func quickCommand(command string) bool {
if command == "lock" {
err := lockWorkStation()
if err != nil {
fmt.Println(err)
return false
}
return true
}
return false
}