使用html按钮执行sh文件单击[重复]

Posted

技术标签:

【中文标题】使用html按钮执行sh文件单击[重复]【英文标题】:Execute sh file with html button click [duplicate] 【发布时间】:2017-07-25 08:34:50 【问题描述】:

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

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

我读到我必须在 html 上制作一个按钮,但将执行代码放在 php 中,但我似乎无法从中制作代码。

非常感谢您的帮助

这不是重复的,我说我是新手,我不知道如何使用按钮来执行此操作,这就是不同的问题。

【问题讨论】:

查看此链接 - ***.com/questions/6235785/… 这篇文章没有描述使用什么 html 代码 “这篇文章没有描述要使用的 html 代码” - 本身可能不是“按钮”,但 VIPIN 给出的链接中的这个答案足够接近你把它修改成一个按钮***.com/a/6235868/1415724 - 那是“HTML 101”的东西。 @Fred-ii- 就像我说我对这一切都很陌生,所以我不知道该怎么做 How do I create an HTML button that acts like a link? 【参考方案1】:

最简单的方法是使用 GET 方法并向脚本发送请求。即使没有花哨的 php 编码,这也可以工作。

简单链接

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

CGI 脚本可以通过 QUERY_STRING 变量处理请求。


结合 SSL 和 POST,您可以在 url 之后发送数据,因此您的请求将得到一些保护。

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 请求做出反应并读取标准输入以获取所传递的数据。 一开始最重要的变量是 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

此代码部分检查有效的 REQUEST_METHOD 并读取标准输入。然后通过 sed html-decode 查询字符串。

一些安全问题...

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

这将检查有效连接。 所有环境变量都列在 http-server 的手册中。

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

在这些步骤之后,您可以将您想要的任何内容放入标准输出中。但请记住,每个环境变量和标准输入都可能是一种威胁,您需要在处理这些事情之前将其全部过滤掉。

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

【讨论】:

几小时后我回到电脑前检查一下 我添加了更多信息。 这一切都是必要的,因为我不太了解这一切是什么。顺便说一句,我需要的代码对黑客来说不一定是安全的,因为它永远不会上线,我也没有任何域。我只了解非常基本的东西,因为 html php 和 javascript 对我来说很新 确保您可以在没有错误响应和过滤器的情况下完成所有操作。但这不会改变您必须创建一个 cgi 脚本并响应该请求的事实。通过表单和 GET/POST 使用纯 html,或者使用任何其他语言都没有关系。但是服务器需要以某种方式处理数据。 目前我还不太明白我要做什么,也许你可以让它更像一个循序渐进的指南?【参考方案2】:

您需要做的是用程序调用文件。按照评论中的建议用 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 和其他人。

【讨论】:

但这不是一个按钮,对吧? 你可以用简单的形式调用上面的代码。如果有帮助请点赞回答!

以上是关于使用html按钮执行sh文件单击[重复]的主要内容,如果未能解决你的问题,请参考以下文章

单击时播放音频文件的按钮[重复]

如何将按钮链接到另一个 html 文件(在 HTML 中)[重复]

在 WPF 中单击按钮执行文件操作

批处理文件打开程序并单击程序的特定区域[重复]

获取我刚刚单击以使用 java 应用程序(jar 可执行文件)打开的文件的路径 [重复]

在pyqt5中单击按钮之前触发浏览按钮方法[重复]