由于我必须使用的架构可能会破坏很多非常好的软件设计规则,我需要将一条消息从在 Web 浏览器中运行的一些 javascript 代码发送到同一台机器上的 Windows 批处理文件。操作系统为 Windows Vista 或更高版本。使用的浏览器主要是 Chrome 和 Firefox。 jQuery 也与 javascript 一起使用。
浏览器已连接到互联网,并且涉及到服务器,因此我可以将消息中继到服务器,然后再到批处理文件。现在我有一个每分钟左右运行一次的批处理文件,理论上可以向服务器查询任何消息。除此之外,我没有什么好主意。
此外,这是一个“封闭”系统。客户端浏览器、客户端系统和服务器都在我的完全控制之下。这不是一般公众在浏览器中运行 Javascript 的情况。可以操纵客户端计算机以接收消息。
发送此消息的好方法是什么?
最佳答案
从 JavaScript 向本地 HTTP 服务器发送包含您的命令的 AJAX 请求。所有现代浏览器都支持跨域 AJAX。服务器可以将命令作为参数传递给批处理文件。 确保无法从网络访问服务器。
这种方法的优点是您可以将命令的响应发送回 JavaScript。
JavaScript:
$.post('http://localhost:8080', {command: '...'});
Bottle.py 服务器:
#!/usr/bin/python
from bottle import run, route, request, response
import subprocess
@route('/', method='POST')
def index():
command = request.POST['command']
result = subprocess.check_output(['batchfile.bat', command], shell=True)
response.set_header('Access-Control-Allow-Origin', '*')
return result
run(host='localhost', port=8080, reloader=True)
或者Apache/nginx下的PHP:
$result = shell_exec("batchfile.bat " . escapeshellarg($_POST['command']));
或者 PHP 中的守护进程:
为了额外的乐趣,它具有完整的 shell 访问权限并且可以异步运行命令,这允许在不阻塞的情况下启动桌面应用程序。它不需要 Apache。
开始:php.exe -f batrunner_daemon.php
使用:$.get('http://localhost:33333/ping -h', function(response) { console.log(response) });
$host = '127.0.0.1';
$port = 33333;
$async = false; // enable to run commands without blocking the server (useful for GUI applications)
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
$open = @socket_bind($socket, $host, $port);
if ($open) {
echo "\nListening on http://{$host}:{$port}";
} else {
echo "\nError. Port {$port} in use";
exit;
}
socket_listen($socket, 1);
while(1) {
$connection = socket_accept($socket);
$http_request = socket_read($connection, 32768);
$command = rawurldecode(substr(strstr($http_request, "\r\n", true), 5, -9));
echo "\nRunning: {$command}...";
if ($async) {
$response = pclose(popen('start "" /B ' . $command, 'r')) ? 'error' : 'success';
} else {
$response = shell_exec($command);
}
echo " Done.";
socket_write($connection, implode("\r\n", array(
'HTTP/1.1 200 OK',
'Content-Type: text/plain; charset=UTF-8',
'Connection: close',
'Content-Length: ' . strlen($response),
'Access-Control-Allow-Origin: *',
"\r\n" . $response
)));
socket_close($connection);
}
为简单起见,它没有正确的错误处理并允许任何站点在您的计算机上执行任何操作,使用风险自负。
Access-Control-Allow-Origin: * 表示任何站点都可以接收来自 shell 的响应。没有这个 header ,他们显然仍然可以运行命令,但无法接收响应。
我试验了@mamdrood 的想法,结果证明它非常简单,比 HTTP 服务器简单多了。
在 HTML 中,您可以像这样调用批处理文件:
<a href="batrunner://somecommand">Wipe all files</a>
下面是 C:\mybatfile.bat 中的批处理文件如何解析命令:
@echo off
SET command=%1
SET command=%command:batrunner://=%
echo %command%
我对批处理文件不是很熟悉,我的命令名称解析代码可能存在漏洞。如果您知道得更多,请更新此答案。
要将您的批处理文件与 batrunner:// 协议(protocol)相关联,请创建 batrunner.reg 并运行一次。用 C:\\mybatfile.bat 代替你的脚本,路径应该被转义。
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\batrunner]
"URL Protocol"=""
[HKEY_CLASSES_ROOT\batrunner\shell]
[HKEY_CLASSES_ROOT\batrunner\shell\open]
[HKEY_CLASSES_ROOT\batrunner\shell\open\command]
@="C:\\mybatfile.bat %1"
关于javascript - 将消息从浏览器中运行的 Javascript 发送到 Windows 批处理文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10125881/
我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0
如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象
我正在尝试在Ruby中制作一个cli应用程序,它接受一个给定的数组,然后将其显示为一个列表,我可以使用箭头键浏览它。我觉得我已经在Ruby中看到一个库已经这样做了,但我记不起它的名字了。我正在尝试对soundcloud2000中的代码进行逆向工程做类似的事情,但他的代码与SoundcloudAPI的使用紧密耦合。我知道cursesgem,我正在考虑更抽象的东西。广告有没有人见过可以做到这一点的库或一些概念证明的Ruby代码可以做到这一点? 最佳答案 我不知道这是否是您正在寻找的,但也许您可以使用我的想法。由于我没有关于您要完成的工作
我是rails的新手,想在form字段上应用验证。myviewsnew.html.erb.....模拟.rbclassSimulation{:in=>1..25,:message=>'Therowmustbebetween1and25'}end模拟Controller.rbclassSimulationsController我想检查模型类中row字段的整数范围,如果不在范围内则返回错误信息。我可以检查上面代码的范围,但无法返回错误消息提前致谢 最佳答案 关键是您使用的是模型表单,一种显示ActiveRecord模型实例属性的表单。c
我的主要目标是能够完全理解我正在使用的库/gem。我尝试在Github上从头到尾阅读源代码,但这真的很难。我认为更有趣、更温和的踏脚石就是在使用时阅读每个库/gem方法的源代码。例如,我想知道RubyonRails中的redirect_to方法是如何工作的:如何查找redirect_to方法的源代码?我知道在pry中我可以执行类似show-methodmethod的操作,但我如何才能对Rails框架中的方法执行此操作?您对我如何更好地理解Gem及其API有什么建议吗?仅仅阅读源代码似乎真的很难,尤其是对于框架。谢谢! 最佳答案 Ru
这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub
我的工作要求我为某些测试自动生成电子邮件。我一直在四处寻找,但未能找到可以快速实现的合理解决方案。它需要在outlook而不是其他邮件服务器中,因为我们有一些奇怪的身份验证规则,我们需要保存草稿而不是仅仅发送邮件的选项。显然win32ole可以做到这一点,但我找不到任何相当简单的例子。 最佳答案 假设存储了Outlook凭据并且您设置为自动登录到Outlook,WIN32OLE可以很好地完成此操作:require'win32ole'outlook=WIN32OLE.new('Outlook.Application')message=
我正在使用Ruby,我正在与一个网络端点通信,该端点在发送消息本身之前需要格式化“header”。header中的第一个字段必须是消息长度,它被定义为网络字节顺序中的2二进制字节消息长度。比如我的消息长度是1024。如何将1024表示为二进制双字节? 最佳答案 Ruby(以及Perl和Python等)中字节整理的标准工具是pack和unpack。ruby的packisinArray.您的长度应该是两个字节长,并且按网络字节顺序排列,这听起来像是n格式说明符的工作:n|Integer|16-bitunsigned,network(bi
之前在培训新生的时候,windows环境下配置opencv环境一直教的都是网上主流的vsstudio配置属性表,但是这个似乎对新生来说难度略高(虽然个人觉得完全是他们自己的问题),加之暑假之后对cmake实在是爱不释手,且这样配置确实十分简单(其实都不需要配置),故斗胆妄言vscode下配置CV之法。其实极为简单,图比较多所以很长。如果你看此文还配不好,你应该思考一下是不是自己的问题。闲话少说,直接开始。0.CMkae简介有的人到大二了都不知道cmake是什么,我不说是谁。CMake是一个开源免费并且跨平台的构建工具,可以用简单的语句来描述所有平台的编译过程。它能够根据当前所在平台输出对应的m
深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal