Chr*_*row 1 javascript windows batch-file
由于我必须使用的架构可能会破坏许多非常好的软件设计规则,我需要从在Web浏览器中运行的一些javascript代码发送消息到同一台机器上的Windows批处理文件.操作系统是Windows Vista或更高版本.使用的浏览器主要是Chrome和Firefox.jQuery也与javascript一起使用.
浏览器连接到互联网,它们是一个涉及的服务器,所以我可以将消息中继到服务器,然后转发到批处理文件.现在我有一个批处理文件,每分钟运行一次,理论上可以在服务器上查询任何消息.除此之外,我没有任何好主意.
此外,这是一个"封闭"系统.客户端浏览器,客户端系统和服务器完全由我完全控制.这不是一般公众在其浏览器中运行Javascript的情况.可以操纵客户端计算机以能够接收消息.
发送此消息的好方法是什么?
从JavaScript,将包含您的命令的AJAX请求发送到本地HTTP服务器.所有现代浏览器都支持跨域AJAX.服务器可以将命令作为参数传递给批处理文件.确保无法从网络访问服务器.
这种方法的优点是您可以将命令的响应发送回JavaScript.
JavaScript的:
$.post('http://localhost:8080', {command: '...'});
Run Code Online (Sandbox Code Playgroud)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)
Run Code Online (Sandbox Code Playgroud)或Apache/nginx下的PHP:
$result = shell_exec("batchfile.bat " . escapeshellarg($_POST['command']));
Run Code Online (Sandbox Code Playgroud)或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);
}
Run Code Online (Sandbox Code Playgroud)
为了简单起见,它没有正确的错误处理,并允许任何站点在您的计算机上执行任何操作,使用风险自负.
Access-Control-Allow-Origin: *意味着任何站点都可以从shell接收响应.如果没有这个标题,他们显然仍然可以运行命令,但无法接收响应.
我尝试了@ mamdrood的想法,结果证明它非常简单,比HTTP服务器容易得多.
从HTML中,您将能够像这样调用批处理文件:
<a href="batrunner://somecommand">Wipe all files</a>
Run Code Online (Sandbox Code Playgroud)以下是批处理文件C:\mybatfile.bat可以解析命令的方式:
@echo off
SET command=%1
SET command=%command:batrunner://=%
echo %command%
Run Code Online (Sandbox Code Playgroud)
我对批处理文件不太熟悉,而且我的命令名称解析代码可能很容易受到攻击.如果你知道更好,请更新这个答案.
要将批处理文件与batrunner://协议关联创建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"
Run Code Online (Sandbox Code Playgroud)| 归档时间: |
|
| 查看次数: |
2694 次 |
| 最近记录: |