想通过网络来控制主机,通常我的办法应该是使用Golang。不过即使学了AutoHotkey,就应该多实践一下。
服务端还是需要通过外网挂接一个服务程序的。比如我使用了ZeroTier,把服务挂到内网的Pi3上也没问题。
服务端很简单,既然自己用,随便搞个变量存储指令就行了。
package main
import (
"net/http"
"github.com/gin-gonic/gin"
)
var cmd string
func main() {
cmd = ""
r := gin.Default()
r.GET("/lk", func(c *gin.Context) { // 获取指令
c.String(http.StatusOK, cmd)
})
r.GET("/slk/:cmd", func(c *gin.Context) { // 设置指令
cmd = c.Param("cmd")
c.String(http.StatusOK, cmd)
})
r.GET("/clk", func(c *gin.Context) { // 清空指令
cmd = ""
c.String(http.StatusOK, "clear")
})
r.Run(":80")
}
AutoHotkey就主代码片段了
SetTimer RemoteControl, 5000 ;远程控制
; 远程控制
RemoteControl:
cmd := Trim(UrlDownloadToVar("http://192.168.8.2/lk"))
if StrLen(cmd)!=0
{
MsgBox, , "远程命令" , %cmd%, 5
if cmd=="poff" ; 关机
{
Shutdown, 1
}
UrlDownloadToVar("http://192.168.8.2/clk")
}
Return; 远程控制
RemoteControl:
cmd := Trim(UrlDownloadToVar("http://192.168.8.2/lk"))
if StrLen(cmd)!=0
{
MsgBox, , "远程命令" , %cmd%, 5
if cmd=="poff" ; 关机
{
Shutdown, 1
}
UrlDownloadToVar("http://192.168.8.2/clk")
}
Return
/*
*****************参数*****************
URL 网址,必须包含类似“http://www.”的开头。
Charset 网页字符集,不能是“936”之类的数字,必须是“gb2312”这样的字符。
URLCodePage URL的编码,是“936”之类的数字,默认是“65001”。有些网站需要UTF-8,有些网站又需要gb2312
Proxy 代理服务器,是形如“http://www.tuzi.com:80”的字符。
ProxyBypassList 代理服务器绕行名单,是形如“*.microsoft.com”的域名。符合域名的网址,将不通过代理服务器访问。
Cookie ,常用于登录验证。
Referer 引用网址,常用于防盗链。
UserAgent 用户信息,常用于防盗链。
EnableRedirects 重定向,默认获取跳转后的页面信息,0为不跳转。
Timeout 超时,单位为秒,默认不使用超时(Timeout=-1)。
*/
UrlDownloadToVar(URL,Charset="",URLCodePage="",Proxy="",ProxyBypassList="",Cookie="",Referer="",UserAgent="",EnableRedirects="",Timeout=-1)
{
ComObjError(0) ;禁用 COM 错误通告。禁用后,检查 A_LastError 的值,脚本可以实现自己的错误处理
WebRequest := ComObjCreate("WinHttp.WinHttpRequest.5.1")
if (URLCodePage<>"") ;设置URL的编码
WebRequest.Option(2):=URLCodePage
if (EnableRedirects<>"")
WebRequest.Option(6):=EnableRedirects
if (Proxy<>"") ;设置代理服务器。微软的代码 SetProxy() 是放在 Open() 之前的,所以我也放前面设置,以免无效
WebRequest.SetProxy(2,Proxy,ProxyBypassList)
WebRequest.Open("GET", URL, true) ;true为异步获取,默认是false。龟速的根源!!!卡顿的根源!!!
if (Cookie<>"") ;设置Cookie。SetRequestHeader() 必须 Open() 之后才有效
{
WebRequest.SetRequestHeader("Cookie","tuzi") ;先设置一个cookie,防止出错,见官方文档
WebRequest.SetRequestHeader("Cookie",Cookie)
}
if (Referer<>"") ;设置Referer
WebRequest.SetRequestHeader("Referer",Referer)
if (UserAgent<>"") ;设置User-Agent
WebRequest.SetRequestHeader("User-Agent",UserAgent)
WebRequest.Send()
WebRequest.WaitForResponse(Timeout) ;WaitForResponse方法确保获取的是完整的响应
if (Charset="") ;设置字符集
return,WebRequest.ResponseText()
else
{
ADO:=ComObjCreate("adodb.stream") ;使用 adodb.stream 编码返回值。参考 http://bbs.howtoadmin.com/ThRead-814-1-1.html
ADO.Type:=1 ;以二进制方式操作
ADO.Mode:=3 ;可同时进行读写
ADO.Open() ;开启物件
ADO.Write(WebRequest.ResponseBody()) ;写入物件。注意 WebRequest.ResponseBody() 获取到的是无符号的bytes,通过 adodb.stream 转换成字符串string
ADO.Position:=0 ;从头开始
ADO.Type:=2 ;以文字模式操作
ADO.Charset:=Charset ;设定编码方式
return,ADO.ReadText() ;将物件内的文字读出
}
}
题外,结合内网的语音服务器,也可以实现主机唤醒(WOL)。