单击html按钮执行sh文件

时间:2017-03-05 14:02:42

标签: php html bash sh lamp

我是html / php / javascript编程的新手,所以我不知道如何开始。

我正在尝试使用网页上的按钮执行.sh文件(在linux上)(我猜是html)。

我读到我必须在html上创建一个按钮,但是将执行代码放在php中,但我似乎无法用它编写代码。

非常感谢帮助

这不是重复,我说我是新手,我不知道怎么用按钮做这个,这就是一个不同的问题。

2 个答案:

答案 0 :(得分:0)

您需要做的是使用程序调用该文件。按照评论中的建议用bash或sh调用它:

echo shell_exec('sh /home/scripts/fix-perm.sh');

另一种选择可能是:

$contents = file_get_contents('/home/scripts/fix-perm.sh');
echo shell_exec($contents);

我认为第一种选择会更好。

请务必注意,执行外部程序的所有命令都需要实际命令,而不是文件路径或其他命令。这适用于shell_exec, exec, passthru和其他人。

答案 1 :(得分:0)

最简单的方法是使用GET方法并向脚本发送请求。这甚至没有花哨的PHP编码。

简单链接

http://example.com/script.sh?name=value&name2=value2&name3=value3&

CGI-Scripts可以通过QUERY_STRING变量处理请求。

结合SSL和POST,您可以在网址后发送数据,这样您的请求就会受到一定的保护。

<强> HTML的形式

<form action="script.sh" method="POST">
<input type="hidden" name="name3" value="value3">
<input type="hidden" name="name2" value="value2">
<button name="name" value="value">Click me</button>
</form>

脚本应对POST请求作出反应并读取stdin以获取所传递的数据。 首先,最重要的变量是REQUEST_METHOD和QUERY_STRING。

希望这有点帮助。

以下是从cgi ...

请求数据的简单 JavaScript 变体
var query_string = "name=value&name2=value2&name3=value3&";
var request = new XMLHttpRequest();
request.open("POST", "script.sh");
request.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
request.addEventListener('load', function(event) {
    if (request.status >= 200 && request.status < 300) {
        console.log(request.responseText);
    } else {
        console.warn(request.statusText);
    }
});
request.send(query_string);

此代码为。addEventListener(“click”,functionname);

等事件

我还可以想象你想要自己创建一个 Bash-Script 。如果是这样,你必须考虑很多事情。我尽可能简单地走你...

要对请求作出反应,您需要首先发回内容类型,然后是空行。

echo "Content-Type: text/html"
echo ""

CORS还有很多选项,但内容类型是最重要的。

下一步是检查请求。

case "$REQUEST_METHOD" in
POST)
    if [ "$CONTENT_TYPE" = "application/x-www-form-urlencoded" ]; then
        read -n "$CONTENT_LENGTH" QUERY_STRING_POST
            QUERY_STRING_ENC=$(echo -e $(echo "$QUERY_STRING_POST" | sed 's/+/ /g;s/%\(..\)/\\x\1/g;'))
    else    
        echo -e "Error\t777\ņReceived header has a bad CONTENT_TYPE.\nThe value has to be application/x-www-form-urlencoded."
    fi
;;
*)
    echo -e "Error:\t555\nReceived header has wrong REQUEST_METHOD.\nThe value has to be POST only."
;;
esac

此代码部分检查valide REQUEST_METHOD并读取stdin。然后通过 sed html-decode query_string。

一些安全问题......

DOMAIN="example.com"
if [ "$HTTP_CONNECTION" != "keep-alive" ] || [ "$HTTP_HOST" != "$DOMAIN" ] || [ "$SERVER_NAME" != "$DOMAIN" ] || [ "$SERVER_PORT" -ne 443 ]; then
    echo -e "Error:\t666\nCorrupted connection refused."
fi

这将检查valide连接。 所有环境变量都列在http服务器的手册中。

请注意,shell可以直接处理环境变量,如REQUEST_METHOD和QUERY_STRING。必须过滤输入以避免跨站点脚本。过滤掉“&lt;&gt;&amp; *?。/”以避免黑客的麻烦!

在这些步骤之后,你可以把你想要的东西放在stdout中。但请记住,每个envirement-variable和stdin都可能是一个威胁,你需要在处理这些事情之前将其全部过滤掉。

cat << EOF
<!DOCTYPE html>

<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>CGI Test</title>
</head>
<body>
    <h1>Hello World</h1>
</body>
</html>
EOF

<强>增加:

为了逐步测试我创建了envtest.sh和inputtest.sh。您可以将 inputtest.sh 复制到 / usr / lib / cgi-bin / 并使其可执行。

<强>终端

cd /usr/lib/cgi-bin
chmod +x inputtest.sh 

现在你可以先学习html方面了。 或JavaScript变体。 或者php和phyhon ......

<强> inputtest.sh

#!/bin/bash

exec 2>&1       # every error gets redirected into the html too


echo "Content-type: text/html"
echo ""
echo "<html>"
echo "<head>"
echo "<title>Test</title>"
echo "<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">"
echo "</head>"
echo "<body>"

case "$REQUEST_METHOD" in
GET)
    echo "<p>QUERY_STRING: ${QUERY_STRING}</p>"
;;
POST)
    if [ "$CONTENT_TYPE" != "" ]; then
        read -n "$CONTENT_LENGTH" QUERY_STRING_POST
        echo "<p>$QUERY_STRING_POST</p>"
    else
        echo "<p>Error while REQUEST_METHOD=POST and CONTENT_TYPE=${CONTENT_TYPE}</p>"
    fi
;;
*)
    echo "<p>Error wrong REQUEST_METHOD: \"${REQUEST_METHOD}\"</p>"
esac

echo "</body></html>"

exit 0

链接看起来像......

http://example.com/cgi-bin/script.sh