【问题标题】:Execute a shell script from HTML从 HTML 执行 shell 脚本
【发布时间】:2017-06-08 18:32:11
【问题描述】:

我编写了一个简单的 HTML 代码,在提交时它会执行一个 bash 脚本。 该脚本位于正确的文件夹 (cgi-bin) 中。 当我在 Firefox 上加载此页面时。它给出了一个错误

/somePATH/cgi-bin/script.sh could not be opened because an unknown error occurred.

是脚本权限的问题吗?我试过了:

chmod 777

这是 HTML 代码的一部分。

<form action="cgi-bin/script.sh" method="post">
<input type="submit" value="Call my Shell Script">
</form>

编辑: 该脚本基本上只是打印日期:

#!/bin/bash    
# get today's date
OUTPUT=$(date)
# script
echo "Content-type: text/html"
echo ""
echo "<html><head><title>Demo</title></head><body>"
echo "Today is $OUTPUT <br>"
echo "You can do anything with this Schell Script"
echo "</body></html>"

【问题讨论】:

  • 脚本是什么样的?
  • @ShammelLee 在问题中编辑
  • cgi-gin/script.sh 的内容是什么?另外,请指定您的服务器/配置。
  • @ShammelLee 我在问题中添加了该脚本。我在本地主机上运行它并且 HTTP 服务正在运行
  • 您是否在脚本顶部指定了 shebang 行(#!/usr/bin/env bash 或类似的)?

标签: html bash shell


【解决方案1】:

您可以使用服务器端语言。使用 PHP 很容易做到这一点

<?php
 if(isset($_POST['submit']))
 {
   $output=shell_exec('sh /somePATH/cgi-bin/script.sh');
   echo $output;
 }
?>

<form action="" method="post">
<input type="submit" name="submit" value="Call my Shell Script">
</form>

包含所有其他 HTML 并使用扩展名 .php 保存文件

【讨论】:

    【解决方案2】:

    以下是您可以在 httpd.conf 中检查的有关 CGI 的内容列表:

    如果您正在加载 CGI 模块:

    LoadModule cgi_module modules/mod_cgi.so
    

    验证 CGI 的别名

    # ScriptAlias: This controls which directories contain server scripts. 
    # ScriptAliases are essentially the same as Aliases, except that
    # documents in the target directory are treated as applications and
    # run by the server when requested rather than as documents sent to the
    # client.  The same rules about trailing "/" apply to ScriptAlias
    # directives as to Alias.
    #
    ScriptAlias /cgi-bin/ "/etc/your_httpd_path/cgi-bin/"
    

    脚本目录的规则:

    # "/etc/your_httpd_path/cgi-bin/" should be changed to whatever your ScriptAliased
    # CGI directory exists, if you have that configured.
    #
    <Directory "/etc/your_httpd_path/cgi-bin/">
        AllowOverride All
        Options None
        Require all granted
    </Directory>
    

    不同文件扩展名的处理程序(添加 .sh)

    # AddHandler allows you to map certain file extensions to "handlers":
    # actions unrelated to filetype. These can be either built into the server
    # or added with the Action directive (see below)
    #
    # To use CGI scripts outside of ScriptAliased directories:
    # (You will also need to add "ExecCGI" to the "Options" directive.)
    #
    AddHandler cgi-script .cgi .pl .asp .sh
    

    检查是否在您的环境中按预期配置了所有内容。

    顺便说一句,作为一个好习惯:不要给脚本 777,给 apache 用户特定的权限,找出哪个用户正在运行 httpd 服务(通常是 www-data)并执行以下操作:

    # remove extra file permissions for others
    chmod o-wx /somePATH/cgi-bin/script.sh
    # Define the user of the script (same as the user who runs httpd)
    chown www-data  /somePATH/cgi-bin/script.sh
    

    【讨论】: