经常会有个需求,就是在远程电脑上执行命令。如果远程电脑是windows系统的话,系统自带的工具mstsc和telnet应该可以实现这个要求,不过用起来都不是很方便。
最好的效果是,能像运行本地命令一样运行远程命令,这样就可以很方便的将其脚本化了。
我的主力系统是windows,主力脚本软件是Autohotkey。首先,需要一个在两台电脑间传递消息的渠道,我选择的是http。http通讯需要客户端和服务端,客户端用curl,服务端用Autohotkey脚本。
curl直接去网上下windows版本就行了,服务端的实现网上也有现成的,下载地址:https://github.com/zhamlin/AHKhttp
下载的AHKhttp源码压缩包中有一个名为example.ahk的文件,双击运行它,如果报错 "Error: The leftmost character above is illegal in an expression",那可能是你的Autohotkey版本过低,去官网下个最新版的(点击下载后选择 Download Current Version); 如果报错 AHKsock 找不到,那么首先在这个网址 https://github.com/jleb/AHKsock 下载 AHKsock,解压缩后确定AHKsock.ahk这个文件的路径,然后在example.ahk中找到 #include <AHKsock> 这一行,将 <AHKsock> 替换为 AHKsock.ahk 的实际路径。
此时example.ahk应该可以正常运行了,这个就是实际的http服务器端了,端口号默认8000,在文件中对应代码行 server.Serve(8000),你可以修改成你喜欢的端口号,修改后再次运行脚本即可。
此时打开浏览器,输入 http://127.0.0.1:8000,如果网页显示 Hello World 就说明http服务器ok。
接下来来看看如何利用这个http服务器来执行命令,这也很简单,首先要了解这个http服务器的工作原理,拿前面显示 HelloWorld 来举例,相关的代码如下:
paths["/"] := Func("HelloWorld")
HelloWorld(ByRef req, ByRef res) {
res.SetBodyText("Hello World")
res.status := 200
}
paths["/"] 中的 / 代表网站的根目录,意思是访问网站的根目录时会执行函数HelloWorld,即显示字符串"Hello World",然后返回http状态码200。那么如果你想执行其它的命令的话,就在函数HelloWorld里添加其它代码就行了,就是这么简单。
假设你要执行一个远程关机命令,可以在脚本中添加下面的代码:
paths["/close_pc"] := Func("close_pc")
close_pc(ByRef req, ByRef res) {
res.SetBodyText("close_pc")
res.status := 200
Run, %comspec% /c shutdown -s -t 60, , hide ;一分钟后关机
}
这样你用curl访问网址 http://服务器的ip地址:8000/close_pc,就可以实现远程关机的效果了。另外,如果你不想弄curl的话,也可以直接用任意浏览器访问这个网址,也一样能关机。
另外,如果想通过手机远程执行命令的话,也很简单,打开手机的浏览器访问上面那个网址或者使用Automate这个app里面的HTTP request命令。
想请教一下作者,我输入http://127.0.0.1:8000可以成功显示hello world.但是server.Serve(8000)更改成server.Serve(1000)发现不能访问了。还有一个就是我在另外一台电脑或是手机上用任意浏览器访问网址http://服务器的ip地址:8000/发现无法打开。服务器的ip地址是指哪个呢?我试了IPv4和DHCP都失败了
你的问题我没碰到过,我只能给出可能的原因。
首先不建议你使用1000端口, 因为它属于well-known ports的范围, 建议用高位端口进行尝试, 例如50000端口。 然后, 修改了server.Serve(8000)中的端口号后,需重新运行脚本才能生效。如果还是不行,那么就检查一下你修改的端口号是否已被其它程序占用。
你在其它电脑或手机上访问网址http://服务器的ip地址:8000/发现无法打开,这里的“服务器ip地址”指的是运行example.ahk这个脚本的电脑的ip地址,一般是类似192.168.1.x的形式。另外要注意服务器的防火墙有可能会阻止外界设备对服务器端口的访问。
好的。首先感谢你的解答。修改端口这一个问题我解决了,就像你说的一样,1000这个端口号被占用了。我改成大一点的数字可以成功。
第二个问题,我在运行example.ahk这个脚本的电脑上,可成功运行http://服务器的ip地址:8000/。但是将这个地址发送到手机或者其他其他电脑,还是不能被打开。考虑到可能是防火墙的问题,我将我win10系统上的三个防火墙都关闭了,结果还是没成功。下面是浏览器显示的错误信息:
位于 http://192.168.137.x:43000/ 的网页无法加载,因为:
net::ERR_CONNECTION_TIMED_OUT
你这个情况不太好判断,你可以试试在其它电脑ping服务器ip能不能ping通。还不行的话我可以用teamviewer远程帮你看看。