从javascript或JQuery执行服务器端cgi代码时遇到问题

Trouble executing server-side cgi code from javascript or JQuery

本文关键字:代码 遇到 问题 cgi 服务器端 javascript JQuery 执行      更新时间:2023-09-26

我正在尝试通过JavaScript或JQuery从Webclient向Debian Jessie上的Apache2网络服务器发送消息,以执行发送POSIX message_queue的编译C程序,但我无法使其工作。

我的 cgi 目录中有以下文件:root@asus:/var/www/cgi-bin# ls -l-rwxr-xr-x 1 www-data www-data 59008 Mar 20 17:47 mq_client.cgi-rwxr-xr-x 1 www-data www-data 115 三月 17 18:14 test.pl

mq_client.cgi 是生成 POSIX 消息的 C 编译可执行文件。如果我执行lachlan@asus:~$/var/www/cgi-bin/mq_client.cgi服务器发送和接收正确的消息。

Test.pl 是一个生成 html 代码的 perl scrpt 如果我执行lachlan@asus:~$/var/www/cgi-bin/test.pl这也工作正常并给出输出:内容类型:文本/html只是测试。

如果我按如下方式使用铬网络服务器:http://localhost/cgi-bin/test.pl我得到正确的结果:"只是测试"

但是,我无法从网络服务器获取要执行的mq_client.cgi代码。我已经搜索了许多网站并尝试了许多选项,如下所示。

这是我的"index.html"代码(请注意,错误仅在我按下按钮时发生)

<!DOCTYPE html>
<html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <script type="text/javascript" src="js/jq_182.js"></script>
    <script type="text/javascript">
    function mapToggle(){
        // different options as indicated below
        }
    </script>
    </head>
    <body>
        <div id = "label"> </div>
        <form action = "" class = "mapButton">
            <p> <button type= "button" onclick = "mapToggle()" class = "button2property"> Map Toggle </button> </p>         
            </form>
    </body>
</html>

我在上面指示的位置尝试过的不同选项(一个接一个)是:

选项 1.

var site = 22;          
$.ajax({type: "PUT", url: "/cgi-bin/mq_client.cgi", async: false,  data: site});

这在 Chromium 中给出了以下 2 个错误: 主线程上的同步 XMLHttpRequest 已被弃用,因为它会对最终用户的体验产生不利影响。如需更多帮助,请查看 https://xhr.spec.whatwg.org/。jq_182.js:2 PUT http://localhost/cgi-bin/mq_client.cgi 500(内部服务器错误)

选项 2.

var site = 22;          
$.ajax({type: "GET", url: "/cgi-bin/mq_client.cgi", async: false,  data: site});

这会产生以下 2 个错误:主线程上的同步 XMLHttpRequest 已被弃用,因为它会对最终用户的体验产生不利影响。如需更多帮助,请查看 https://xhr.spec.whatwg.org/。jq_182.js:2GET http://localhost/cgi-bin/mq_client.cgi 500(内部服务器错误)

选项 3.

var myRequest = new XMLHttpRequest();
myRequest.open("GET", "/cgi-bin/mq_client.cgi");
myRequest.send();

这给出了以下错误代码:index2.html:21 GET http://localhost/cgi-bin/mq_client.cgi 500(内部服务器错误)

选项 4.

src = "/cgi-bin/mq_client.cgi";

Chromium中没有指示任何错误,但也没有发送任何消息

选项 5.

var img = new Image();
img.src = "/cgi-bin/mq_client.cgi";

产生的错误:GET http://localhost/cgi-bin/mq_client.cgi 500(内部服务器错误)

选项 6.还将文件名更改为 index.shtml

<!--#exec cmd="/cgi-bin/mq_client.cgi" -->

Chromium 中没有指示任何错误,但没有发送任何消息

选项 7.

var client = new XMLHttpRequest();
client.open("post", "/cgi-bin/mq_client.cgi", true);    

Chromium 中没有指示任何错误,但没有发送任何消息。

选项 8.

var client = new XMLHttpRequest();
var formx  = new FormData();
formx.append("dummy","data");
client.open("post", "/cgi-bin/mq_client.cgi", true);    
client.setRequestHeader("Content-Type", "multipart/form-data");
client.send(formx);     

错误:index2.html:45 POST http://localhost/cgi-bin/mq_client.cgi 500(内部服务器错误)

我已经查看了许多参考资料并尝试了他们的建议,但尚未解决问题。

关于在哪里寻找问题的任何想法将不胜感激。拉克兰

服务器端代码生成 POSIX 消息队列:服务器代码向服务器发送 POSIX 消息。代码如下:

int main(void) {
    char msg[5];
    // Open queue already created
    mqd_t mQueue = mq_open("q1", O_WRONLY, NULL);
    if (mQueue == (mqd_t) -1){
        puts("Queue Open Failed'n");
        return EXIT_FAILURE;
        }
    puts("Queue Opened'n");
    // Send Message
    msg[0] = 22;
    if ( mq_send(mQueue, msg, 5, 1) == -1){
            puts("Queue Send Failure'n");
            return EXIT_FAILURE;
            }
    puts("Message Sent'n");
    mq_close(mQueue);
    return EXIT_SUCCESS;
}

下面是接收消息队列的服务器代码:

int main(void) {
    char msg[MAX_MSG_SIZE];
    unsigned int prio;
    ssize_t msgLength = 0;
    // Create queue
    struct mq_attr attr;
    attr.mq_maxmsg = 4;
    attr.mq_msgsize = 5;            
    mQueue = mq_open(“q1”, O_CREAT | O_RDWR, S_IRWXU | S_IRWXG | S_IRWXO, &attr);
    if (mQueue == (mqd_t) -1){
        puts("Queue Create Failed'n");
        return EXIT_FAILURE;
        }
    puts("Queue Created'n");
    // get message - This blocks
    msgLength = mq_receive(mQueue, msg, MAX_MSG_SIZE, &prio);
    if (msgLength == -1){
        puts("Queue Read Failure'n");
        return EXIT_FAILURE;
        }
    printf("Message Received: %i'n", (int)msg[0]);
    mq_close(mQueue);
    return EXIT_SUCCESS;
}

访问服务器队列的权限包括:S_IRWXU |S_IRWXG |S_IRWXO

执行 cgi 代码的权限是:-rwxr-xr-x 1 www-data www-data 59008 Mar 20 17:47 mq_client.cgi

如果这是一个权限问题,你能建议缺少哪些权限吗?

我终于找到了另一个有助于解决问题的帖子。是的,这是一个权限问题。程序权限将覆盖消息队列权限。一旦解决了这个问题,问题就解决了。问候拉克兰