单击 html 按钮执行 sh 文件
Execute sh file with html button click
我是 html/php/javascript 的编程新手,所以我不知道如何开始。
我正在尝试使用网页上的按钮执行 .sh 文件(在 linux 上)(所以 html 我猜)。
我读到我必须在 html 上制作一个按钮,但将执行代码放在 php 中,但我似乎无法从中制作代码。
不胜感激
这不是重复的,我说我是新手,我不知道如何使用按钮执行此操作,这是一个不同的问题。
你需要做的是用程序调用这个文件。按照评论中的建议用 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
和其他人。
最简单的方法是使用 GET 方法并向脚本发送请求。即使没有花哨的 php 编码也能工作。
简单Link
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/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 并读取标准输入。然后它通过 html-decode query_string 通过 sed.
一些安全问题...
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服务器的手册中列出了所有环境变量。
注意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
link 看起来像...
http://example.com/cgi-bin/script.sh
我是 html/php/javascript 的编程新手,所以我不知道如何开始。
我正在尝试使用网页上的按钮执行 .sh 文件(在 linux 上)(所以 html 我猜)。
我读到我必须在 html 上制作一个按钮,但将执行代码放在 php 中,但我似乎无法从中制作代码。
不胜感激
这不是重复的,我说我是新手,我不知道如何使用按钮执行此操作,这是一个不同的问题。
你需要做的是用程序调用这个文件。按照评论中的建议用 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
和其他人。
最简单的方法是使用 GET 方法并向脚本发送请求。即使没有花哨的 php 编码也能工作。
简单Link
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/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 并读取标准输入。然后它通过 html-decode query_string 通过 sed.
一些安全问题...
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服务器的手册中列出了所有环境变量。
注意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
link 看起来像...
http://example.com/cgi-bin/script.sh