1

由于我必须使用的架构可能会破坏许多非常好的软件设计规则,我需要将消息从在 ​​Web 浏览器中运行的一些 javascript 代码发送到同一台机器上的 Windows 批处理文件。操作系统是 Windows Vista 或更高版本。使用的浏览器主要是 Chrome 和 Firefox。jQuery 也与 javascript 一起使用。

浏览器连接到互联网并且它们是涉及的服务器,所以我可以将消息中继到服务器,然后到批处理文件。现在我有一个批处理文件,每分钟左右运行一次,理论上可以向服务器查询任何消息。除此之外,我没有任何好的想法。

此外,这是一个“封闭”系统。客户端浏览器、客户端系统和服务器都在我的完全控制之下。这不是公众在他们的浏览器中运行 Javascript 的情况。可以操纵客户端计算机以能够接收消息。

发送此消息的好方法是什么?

4

4 回答 4

5

1.本地HTTP服务器

从 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 的响应。如果没有这个标头,它们显然仍然可以运行命令,但无法接收响应。


2.URI方案

我尝试了@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://协议创建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"
    
于 2012-04-12T15:01:22.187 回答
2

您还可以创建一个小的 Windows 应用程序,并使用URI 方案连接信息,就像 BitTorrent 磁铁或 Skype callto 一样。

于 2012-04-12T15:02:58.193 回答
1

据我所知,在浏览器中运行的 JavaScript 无法与本地文件系统进行通信。如果网络上的页面可以在您的系统上读取和写入文件,那对每个人来说都是非常非常糟糕的。:)

如果你需要生成一个批处理文件,你可以从服务器输出文件,让用户在本地下载并运行它,但是 JavaScript 在这里没有任何帮助。

于 2012-04-12T14:46:47.147 回答
1

我认为您不会找到一种“开箱即用”的方式来使用 javascript 触发本地批处理文件。我敢肯定,当我完成发布这篇文章时,就会提倡使用插件方法,但是这会带来很多开发开销。Chrome 也有一些带有 --enable-local-file-access 开关的花哨的东西,但也有很多警告。(只是把它们扔在那里作为探索的选择)。

您可能会考虑只提供一个链接,将 .bat 文件下载到盒子并从那里执行。

编辑 我可能说得太早了。如果您使用的是 IE,看起来 js/ActiveX 解决方案可以满足您的需求。取自这里

于 2012-04-12T14:59:28.237 回答