【问题标题】:shell_exec in Ajax call causing infinite loopAjax 调用中的 shell_exec 导致无限循环
【发布时间】:2020-03-09 17:33:08
【问题描述】:

我有这个 Ajax 调用:

$('#directory_select_form').submit(function(e) {
        $('#loader').show();
        $('#order_number_submit_btn').prop('disabled', true);
        e.preventDefault();
       $.ajax({
           url: 'includes/confirmation_emails/process_directory_request.php',
           type: 'POST',
           dataType: 'json',
           data: $(this).serialize(),
           success: function(data) {
               console.log(data);
               $('#loader').hide();
               $('#order_number_submit_btn').prop('disabled', false);
           },
           error: function(jqXHR, textStatus, errorThrown) {
               $('#loader').hide();
               $('#order_number_submit_btn').prop('disabled', false);
           }
       })
    });

process_directory_request.php 包含一个shell_exec 命令:

<?php

$selected_directory = $_POST['selected']; //<-- This will be used later. Hard coded for now
$order_number = $_POST['orderId']; //<-- This will be used later. Hard coded for now.


$command = shell_exec('ssh remoteServer grep -o "Order Number 1234567" /mnt/tank/TECH/"MySQL\\ Data\\ Archives"/path/to/the/file');

echo json_encode($command);

它崩溃了,因为由于某种原因它进入了一个无限循环。如果我从命令行运行命令,它会按预期运行。

我不能使用this answer,因为开头是ssh。我正在远程运行命令。

是什么导致了这个无限循环?我不明白。我正在将 ajax 响应数据打印到控制台,并且一遍又一遍地是同一行。

编辑 这是我的开发控制台中的输出,但实际上是很多倍:

/mnt/tank/TECH/MySQL Data Archives/path/to/the/file:Order
/mnt/tank/TECH/MySQL Data Archives/path/to/the/file:Order
/mnt/tank/TECH/MySQL Data Archives/path/to/the/file:Order
/mnt/tank/TECH/MySQL Data Archives/path/to/the/file:Order
/mnt/tank/TECH/MySQL Data Archives/path/to/the/file:Order
/mnt/tank/TECH/MySQL Data Archives/path/to/the/file:Order
/mnt/tank/TECH/MySQL Data Archives/path/to/the/file:Order
/mnt/tank/TECH/MySQL Data Archives/path/to/the/file:Order
/mnt/tank/TECH/MySQL Data Archives/path/to/the/file:Order
/mnt/tank/TECH/MySQL Data Archives/path/to/the/file:Order
/mnt/tank/TECH/MySQL Data Archives/path/to/the/file:Order
/mnt/tank/TECH/MySQL Data Archives/path/to/the/file:Order
/mnt/tank/TECH/MySQL Data Archives/path/to/the/file:Order
/mnt/tank/TECH/MySQL Data Archives/path/to/the/file:Order
/mnt/tank/TECH/MySQL Data Archives/path/to/the/file:Order
/mnt/tank/TECH/MySQL Data Archives/path/to/the/file:Order
/mnt/tank/TECH/MySQL Data Archives/path/to/the/file:Order
/mnt/tank/TECH/MySQL Data Archives/path/to/the/file:Order

【问题讨论】:

  • 我在这里看不到任何循环,无限或其他。你的意思是你的AJAX请求被重复触发了吗?还有什么?
  • 我不知道具体多少次,但它使我的脚本崩溃,因为它的内存不足。输出是预期的结果,但一遍又一遍。
  • 你能澄清一下这里重复了什么吗?在浏览器的调试工具中,AJAX 请求是否重复发出?该请求的每个实例都是您所期望的吗?当您调试时,这个submit 事件处理程序是否被重复触发?请详细说明。
  • 是的,我将编辑我的问题以显示一些输出。给我一分钟。
  • 这不是一个无限循环。这是一个引用问题,它只是匹配单词Order 而不是整个字符串Order Number 1234567。因此,您将获得文件中包含该单词的所有行,而不仅仅是指定的数字。

标签: php ajax ssh shell-exec


【解决方案1】:

Barmar 正确指出问题在于您的未转义值。以下是我解决问题的方法:

<?php

$selected_directory = escapeshellarg("/mnt/tank/TECH/MySQL Data Archives/$_POST[selected]");
$order_number = escapeshellarg("Order Number $_POST[orderId]");

$grep_cmd = escapeshellarg("grep -o $order_number $selected_directory");

$output = shell_exec("ssh remoteServer $grep_cmd);

header("Content-Type: application/json");
echo json_encode($output);

我们对参数进行双重转义,以便它们能够毫发无损地通过 SSH 调用。

【讨论】:

    【解决方案2】:

    这不是一个无限循环,它只是比您预期的要多。

    问题是报价没有被发送到远程服务器。 ssh 只是将所有参数连接成一个命令,所以远程命令是:

    grep -o Order Number 1234567 /mnt/tank/TECH/MySQL\ Data\ Archives/path/to/the/file
    

    它只是搜索单词Order,并将Number1234567 视为要搜索的文件。

    您需要转义双引号,以便按字面意思发送它们。

    $command = shell_exec('ssh remoteServer grep -o \\"Order Number 1234567\\" /mnt/tank/TECH/\\"MySQL Data Archives\\"/path/to/the/file');
    

    此外,您不需要在带有空格的目录名称中同时使用双引号和转义空格。

    【讨论】:

    • 我可以确认这一点。我在该脚本运行时运行了ps -ef | grep "grep",它一遍又一遍地显示“订单号1234567”而没有引号。我很乐意接受你的回答。谢谢你。所以这只是一个语法错误。
    • 我宁愿推荐使用escapeshellarg 来执行此操作,而不是手动尝试逃避。
    • 感谢@miken32 的建议。我会调查的。 :-)
    • 我不确定在这种情况下会有所帮助,因为它需要额外的转义级别。 @miken32
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-12
    • 2011-08-23
    • 2013-04-15
    • 1970-01-01
    • 2015-10-14
    • 1970-01-01
    • 2020-08-27
    相关资源
    最近更新 更多