如何知道CGI代码是否有效运行?

时间:2018-03-01 17:24:22

标签: python raspberry-pi lighttpd

这个问题是我调用一个函数来运行,我不确定它是否正在运行。我使用lighttpd和位于/ var / www / cgi-bin中的一些.cgi和.py在raspberry上托管了站点。当我去那个位置,即192.168.1.24/cgi-bin/test1.py它运行但是当我点击应该触发事件的按钮时,我似乎没有得到任何东西。脚本中还有系统命令,但它们似乎也不起作用。

HTML code:

<button style="height: 75px; width: 85px" onclick="bot_stop()">
<img style="height: 63px"src="http://images.clipartpanda.com/stop-sign-
clipart-119498958977780800stop_sign_right_font_mig_.svg.hi.png">
</button>

<script>
var xmlhttp;
function bot_stop()
{
xmlhttp.open('POST','CGI-Executables/test1.py',true);
xmlhttp.send(null);
}
</script>

CGI代码:

!#/usr/bin/python
import os

print  "Content-type: text/html\r\n\r\n"
print  "<html>"
print  "<head><title> code is executing</title></head>"
os.system("sudo service motion stop")
os.system("sudo service motion stop")
os.system("sudo motion")
os.system("sudo service motion start")
print  "<p> code ran </p>"
print  "</html>"

1 个答案:

答案 0 :(得分:0)

cgi脚本返回整个页面的html,并且不需要发布。它可能不适合你试图做的ajax调用。尝试在主html文件中添加一个简单的链接以启动

<a href='/cgi-bin/test1.py'>
  <img style="height: 63px"src="http://images.clipartpanda.com/stop-sign-clipart-119498958977780800stop_sign_right_font_mig_.svg.hi.png">
</a>

如果你想切换到一个帖子,也许一个简单的表格也可以这样做。

<form method='post' action='/cgi-bin/test1.py'>
  <input type="submit" value="stop">
</form>

我认为ajax调用可能有错误的路径,还有一些其他问题。这可能会奏效。如果警报显示200,它就会运行。

function bot_stop() {
  var xmlhttp = new XMLHttpRequest();
  xmlhttp.onreadystatechange = function() {
    if (this.readyState == 4) {
      alert(this.status);
    }
  };
  xmlhttp.open('POST','/cgi-bin/test1.py',true);
  xmlhttp.send(null);
}

如果您只是通过ajax访问脚本,则可以更改它,以便只打印一个简单的“OK”而不是完整的html页面。像这样......

#! /usr/bin/python
import os

# TODO: maybe check that this is a post and not a get before restarting
os.system("sudo service motion stop")
os.system("sudo service motion stop")
os.system("sudo motion")
os.system("sudo service motion start")

print "Content-type: text/plain"
print ""
print "OK"

---------------下一期-----------

如果服务器用户没有设置权限,您可能无法使用sudo运行这些命令。在上面的脚本中并不真正需要Python,所以可以用它代替:

#! /bin/bash
sudo service motion stop
sudo service motion stop
sudo motion
sudo service motion start

echo Content-type: text/plain
echo
echo OK

查看运行这些脚本的用户是否可以将浏览器指向脚本(名为/var/www/cgi-bin/whoami.sh) (当您创建新脚本时,请记住chmod +x <scriptname>

#! /bin/bash
echo Content-type: text/plain
echo
whoami

然后将浏览器指向http://192.168.1.24/cgi-bin/whoami.sh

看看当你尝试sudo一个不同的命令时会发生什么,试试这个

#! /bin/bash
echo Content-type: text/plain
echo
sudo echo 1
echo 2

如果sudo是问题,可以在命令行上sudo su <whatever user you get from the whoami script>查看当您尝试脚本时会发生什么。

----如果sudo权限是问题---

解决方案可以是将四个重启命令放入自己的脚本中,并为lighttpd用户提供sudo权限,以便在没有这样的密码的情况下运行该脚本:https://serverfault.com/questions/294661/how-to-grant-sudo-rights-only-to-specific-script-files。 (或者找到另一种方法使这些命令在没有sudo的情况下工作 - 可能是另一个问题的主题)

#!在上面的代码中是向后的。

当您在命令行上运行cgi脚本来测试它们时,请尝试像这样运行它们

./test1.py

python test1.py

这将有助于确保正确设置解释器和权限。您可能需要修复此chmod +x test1.py

之类的权限

在某些情况下,服务器将使用此信息来运行脚本。在其他情况下,我会为扩展配置解释器,但这一部分都不重要。