Web 本地应用程序 Apache:运行 shell 脚本

2024-05-06

我开发了一个 shell 脚本,我想用它创建一个 UI。我决定使用带有本地服务器的 Web 界面,因为我对 HTML/PHP 的了解很少,比 QT 或 Java 的了解更多。我只是希望我的 html 可以在我的计算机上运行 shell 脚本。

我有一个 Apache php 服务器,我使用 apachectl 在 localhost 中启动它。

在 /var/www/html/ 中,我有一个 shell 脚本和一个 test_web.php 文件,它使用以下命令执行该脚本exec('/var/www/html/test.sh')

在我的 html 中我有这个:

<form method="POST" action="test_web.php?"> 
<input type="submit" value="Execute" name="exec"> 
</form>

如果我单击“执行”,它将打开一个新页面,我可以在其中看到脚本中 echo 命令的输出,但它不会作为标准脚本在终端上执行(就像脚本不在服务器端执行一样)。

我希望这个脚本从终端启动时执行。

感谢您的帮助


正如一些评论者所建议的,您可以使用 Apache cgi 功能来直接执行您的 test.sh 文件(1),但既然你说你正在使用支持 Php 的 Apache 服务器,那么你有一个替代的、更简单的 Php 选项,你已经部分尝试过(2)。在这两种情况下,您都需要注意 bash 脚本的权限和所有权及其执行环境,以使其产生与命令行相同的结果(3).

1. CGI

CGI 代表通用网关接口。它允许 Web 服务器执行可在主机上执行的程序,并与 Web 服务器交互。那是一个协议per se,而CGI不仅可以用来execute程序,还用于创建动态站点。您可以用任何语言编写动态网站,前提是可执行文件被编程为通过标准输入从服务器接收数据并解释标头,正确解码任何内容,并且程序可以通过标准输出将正确的动态数据返回到服务器,并使用适当的方法。标题、内容类型等

许多语言都有帮助完成此任务的库(对于 C,Perl 在核心模块等中有一个 CGI 模块,甚至对于Bash http://bashlib.sourceforge.net/).

在 Linux 上,要将 CGI 与 Apache 2 一起使用,您需要确保您的 Apache 配置加载支持它所需的模块,并选择允许您的 Web 服务器执行程序的目录:

# uncomment or add the directive for the module
LoadModule cgid_module modules/mod_cgid.so

# one way to allow the server to execute cgi programs is to
# set a ScriptAlias directive to a directory dedicated to CGI programs
ScriptAlias "/cgi-bin/" "/var/www/html/cgi-bin/"

你把你的test.sh脚本在/var/www/html/cgi-bin/,并且浏览器可以指向http://localhost/cgi-bin/test.sh直接执行脚本。还有其他可能的配置,请参阅此Apache CGI 教程 http://httpd.apache.org/docs/current/en/howto/cgi.html.

如果您需要执行 Bash 程序并希望 CGI 向浏览器发送任何内容,则 Bash 脚本发送的第一个回显应为以下输出:

Content-type: text/html

接下来是您想要生成的任何动态 html。

2. Php

实际上,所有这些复杂性可能都没有必要,因为您说您使用支持 Php 的 Apache 服务器,并且您可能不希望 Bash 脚本直接将 html 发送到浏览器。

在这种情况下,shell_exec() http://php.net/manual/en/function.shell-exec.php命令或反引号运算符 http://php.net/manual/en/language.operators.execution.php,将允许您运行 Bash 脚本并在 Php 变量中获取其输出,并在 Php 中对其执行任何您想要执行的操作。

你说你已经尝试过使用exec http://php.net/manual/en/function.exec.php命令,它也应该起作用,除了您得到一个状态代码作为响应,而不是程序输出。

如果您的执行命令根本不起作用,这可能是因为权限、所有权或执行环境问题。

3. 权限、所有权和执行环境

查看您的 Apache 日志,了解由以下各项产生的错误:exec or shell_exec命令。

该脚本需要具有执行权限,并且需要能够被Web服务器读取和执行。

例如,在 Debian 上,Apache Web 服务器作为用户 www-data 运行,因此脚本需要由该用户拥有并可执行:

chown www-data:www-data test.sh
chmod u+x test.sh

您可以通过检查(以 root 身份)以下结果来找到 Apache 日志的位置以及 Web 服务器在 Apache 配置文件中运行的用户和组:

apachectl -S

另一个可能的问题是 Apache 运行脚本的环境。该环境可能包含也可能不包含相同的环境变量,$PATH 将有所不同,并且可能不包含“普通”用户在控制台上执行相同脚本时可用的所有目录。

再次检查日志中是否有错误。

最常见的失败原因是未找到 Bash 命令,因为它不在 Apache 进程的 $PATH 中。然后,快速修复方法是更改​​脚本以使用其完整路径作为命令前缀。

所以,举例来说,如果你的test.sh使用一个名为validjson,以可以正确执行脚本的用户身份打开终端,并检查它在哪里:

$ which validjson
validjson: /usr/local/bin/validjson

而不是打电话validjson在脚本中假设它位于 $PATH 中,则使用其完整路径来调用它/usr/local/bin/validjson由which命令报告。

如果您正在调用其他脚本或程序,它们可能会遇到相同的问题,请检查该问题,直到调试完脚本的执行为止。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Web 本地应用程序 Apache:运行 shell 脚本 的相关文章

  • 正则表达式将从文本文件中提取句子

    我需要一个正则表达式来从文本文件中提取句子 示例文本 以 2004 年底发生的亚洲海啸灾难为例 对 Google 新闻 http news google com 的查询在一个月内 1 月 17 日 返回了超过 80 000 篇有关该事件的在
  • 将变量设置为函数调用以在 PHP 中的 if 语句中使用

    好的 我正在做一些 Wordpress 编辑 并且编写了一个 if 语句 正如您所看到的 这使用函数调用作为变量 这是因为函数调用会调用当前页面的名称 这很好 然而 当我这样做时 它也往往会与页面上的标题相呼应 这是有道理的 我可能正在尝试
  • while 循环中的表并排

    in a while loop its creating a list of heading and image links i want to display it as side by side like in following im
  • PHP 中给定日期的下一个工作日

    有人有一个 PHP 代码片段来计算给定日期的下一个工作日吗 例如 需要如何转换 YYYY MM DD 才能找到下一个工作日 例子 对于 03 04 2011 DD MM YYYY 下一个工作日是 04 04 2011 对于 2011 年 4
  • SVN 提交后挂钩在提交后不会运行

    我的服务器上设置了 SVN 存储库 并且遇到提交后问题 我在 iMac 上使用 SmartSVN 作为客户端 我通过 SmartSVN 的 ssh svn 连接 我能够成功连接到 SVN 并对其进行更改 但从 SVN 客户端提交后 我的提交
  • PHP比较两个字符串的随机位置

    PHP比较两个字符串 示例我得到了一串数字 1 2 2 1 and another is 2 1 2 1 结果是 true 因为它只是 1 2 2 1 和 2 2 1 1 的位置洗牌 但如果该值为 1 2 2 2 and another i
  • 配置tomat的server.xml文件并自动生成mod_jk.conf

    我在用apache 2 2 15 and tomcat6 6 0 24 on CentOS 6 4并希望使用 tomcat 服务器的功能 通过添加以下内容自动生成 mod jk conf 文件
  • PHP—array_merge_recursive() - 相同键没有数组

    php a php gt data1 tag gt div classes gt 1 2 3 php gt data2 tag gt section classes gt 2 3 4 5 6 php gt result array merg
  • 如果 Row1 = 值 1,则更新其他行

    我有一个小的 php 脚本 用于访问 mySql 数据库 我想在数据库中插入新记录之前查看该数字 值 1 是否等于数据库中的记录 这也在第 1 行 所以我想 查看传入的电话号码是否等于数据库中的电话号码 如果是这样 则必须保持电话号码相同的
  • javascript 和 PHP 中的正则表达式有什么区别吗?

    这是在 javascript 中验证电子邮件地址的正则表达式 我不确定是否可以直接在 PHP 中使用它 a z d u00A0 uD7FF uF900 uFDCF uFDF0 uFFEF a z d u00A0 uD7FF uF900 uF
  • C修改printf()输出到文件

    有没有办法修改printf为了将字符串输出到文件而不是控制台 我尝试在互联网上查找一些内容 发现了类似的电话dup dup2 and fflush这可能与此有关 EDIT 也许我不清楚 问题是这是C考试问题 问题如下 解释一个通常将字符串输
  • 使用 OpenSSL 在 PHP 中进行 AES 加密/在 Node.js 中进行解密

    我正在使用 PHP 和 Nodejs 使用 OpenSSL 进行对称加密 PHP 使用 OpenSSL 库 Node js 解密基于实现的加密 问题是 Node js 中的解密文本只是部分正确 PHP 加密函数 function encry
  • 在 php、ajax 或 javascript 中加载进度?

    任何人都知道如何在系统仍在服务器端获取数据的同时在客户端显示加载进度以及完成的百分比 例如 当我在客户端按下 确定 按钮时 它会调用服务器端从数据库收集数据 整个过程可能需要2到3分钟 如何在客户端显示加载进度 大约加载完成了多少 我怎样才
  • 自动生成PHP代码的策略?

    我正在开发一个框架 在后端创建 ER 图后 该框架可以动态地对自身的各个部分进行编程 作为一名 PHP 新手 我想知道是否还有比打开一个纯 xyz php 文本文件然后将动态生成的代码添加到该文件更奇特的事情 是的 尝试一下Zend Cod
  • NetBeans 代码模板 ${date}?

    我在 Eclipse 中有这个代码模板 自 日期 起 当输入时我得到这样的东西 自2009年8月4日起 但是当我添加相同的模板时 自 日期 起 到 NetBeans 它输出 自日期以来 有人可以帮忙吗 还没有答案吗 这在 Netbeans
  • 通过 jQuery 从输入类型=“文件”多个中删除文件

    我在使用 PHP 和 jQuery 上传文件时遇到问题 表单可以一次上传多个图像 这些图像可以在滑块中预览 表单还包含两个字段标题和描述 滑块通过 jQuery 工作 当用户通过单击选择文件来选择多个图像时
  • 递归获取数组的键并创建下划线分隔的字符串

    现在我得到了一个包含某种信息的数组 我需要从中创建一个表 例如 Student Address StreetAddress gt Some Street StreetName gt Some Name Marks1 gt 100 Marks
  • 如何查找哪个 Yocto 项目配方填充图像根文件系统上的特定文件

    我经常与 Yocto 项目合作 一个常见的挑战是确定文件为何 或来自什么配方 包含在 rootfs 中 这有望从构建系统的环境 日志和元数据中得出 理想情况下 一组命令将允许将文件链接回源 即配方 我通常的策略是对元数据执行搜索 例如gre
  • 如何在 *nix 中登录时运行脚本?

    我知道我曾经知道如何做到这一点 但是 如何在 unix 中登录时运行脚本 bash 可以 From 维基百科 Bash http en wikipedia org wiki Bash 28Unix shell 29 当 Bash 启动时 它
  • Zend Framework 生成唯一的字符串

    我想生成一个唯一的 4 6 个字符长的字母数字字符串 以便与每个记录 用户 一起保存在数据库中 db 字段具有唯一索引 因此尝试保存预先存在的字符串会生成错误 现在我正在生成一个随机字符串并使用 try catch 因此在添加新记录时如果抛

随机推荐

  • emberjs 无法克隆未实现 Ember.Copyable 的 Ember.Object

    我正在使用 ember 1 3 1 和 ember data 1 0 0 beta 5 在创建新模式时我收到 以下错误 断言失败 无法克隆未实现 Ember Copyable 的 Ember Object 以下是我的模型代码 App myM
  • 如何在列表中使用 CSS 计数器而不重置计数器?

    我想要有多个 ol 列表 其中计数器值not在列表之间重置 另一种说法是 我希望第二个列表中第一个 li 的计数器比前一个列表最后一个元素的计数器值高一个 有什么 CSS 魔法可以做到这一点吗 While 苏的回答 https stacko
  • 多重集删除最后一个元素

    我试图使用以下方法删除多重集的最后一个元素 minheap erase minheap rbegin 它无法编译 并出现 4 5 个错误 请注意 在 C 多重集中 end 指向最后一个元素的旁边 而不是最后一个元素 有任何想法吗 EDIT
  • JSON 和 JavaScript 对象有什么区别? [复制]

    这个问题在这里已经有答案了 我对 JSON 和 JavaScript 对象很陌生 有人可以解释一下 JSON 和 JavaScript 对象之间的区别吗 它们的用途是什么 这个比那个好吗 还是要看情况而定 何时使用哪一个 在什么情况下使用
  • ios 将 alpha 通道视频叠加在另一个视频上

    我一直在尝试创建一个视频模板 该模板使用 alpha 通道视频叠加在 mp4 视频和图像上 这就是我需要创建视频的方式http viewptch ptchcdn com rendered 52b28a9f8d4f980f3a3f99c3 c
  • 如何使用 HTML/CSS/jQuery 编写复数分数?

    我希望能够使用 HTML CSS jQuery 编写分数 而不是使用 TeX 渲染器甚至 MathML 目前 有一个很好的解决方法可以编写简单的分数 如果您有one term对于分子和分母来说 但是一旦你开始使用多个术语 它看起来就相当可怕
  • mockito:如何在java 8中匹配可变参数?

    我正在努力将项目从 java 7 迁移到 8 并且在 Mockito 何时 情况下遇到编译错误 我很难追踪 when queryRunner query any String class any ResultSetHandler class
  • 为什么即使显式抛出错误也没有被捕获?

    我想使用带注释的 ExceptionHandler 捕获 SpringMVC3 中的 错误 我可以捕获可抛出异常和任何异常 但是当我尝试使用 Error 时 它没有捕获异常 知道为什么吗 下面的代码演示了这个问题 Controller Re
  • $PATH 中 /usr/bin 和 /usr/local/bin 等的顺序

    在我的 Mac 上 我经常使用 bash 对于我的环境设置 我添加了 usr bin and usr local bin into PATH就像我平常做的那样 虽然我知道什么 usr bin and usr local bin关于 我很好奇
  • Android 手机号码验证

    如何检查电话号码是否有效 长度最大为13 包括字符 在前 我怎么做 我试过这个 String regexStr 0 9 String number entered number getText toString if entered num
  • 如果我从 python 中的多个不同进程登录到同一个文件,会发生什么?

    我花了几个小时来挖掘这种行为 首先是关于这些问题 write 2 到本地文件系统的原子性 https stackoverflow com questions 10650861 atomicity of write2 to a local f
  • 如何在我的项目中使用 FFTW DLL 导入库 .lib 作为静态 .lib?

    我了解 C 和编译小型插件 始终基于类似且布局的工作流程 虽然目前我需要将最新版本的 FFTW 编译成静态库 或者从编译版本中获取它 这应该会容易得多 但这给了我一个非常困难的时间 可能是因为我不知道编译的来龙去脉 请注意 我正在使用 Vi
  • 在慢速连接上使用 picasso 加载图像

    我正在使用 Picasso 加载列表视图的图像 问题是互联网连接速度很慢 如何更改 Picasso 中的加载超时时间 我的代码是 Picasso with context load MainActivity WEBSITE book ite
  • mongoDB 对嵌套对象数组的聚合查找

    我有一个如下所示的集合 但我无法执行 lookup 并按开始时的方式返回它 但包含填充的字段 我已经对我想要填充的字段发表了评论 代理 missions clients client title Tourn e libre agent 5d
  • 如何仅重置 Angular 5 中表单的特定字段

    我在我的组件文件之一中创建了一个函数来重置表单 myform onSubmit if this myform valid console log Form Submitted this myform reset 它可以很好地重置整个表单 但
  • 想要运行命令列表,但能够在运行时编辑该列表

    我有一个要运行的 bash 命令列表
  • 使 Flex 子项的高度等于网格列内父项的高度

    我正在尝试构建一个定价表 其中每列都包含一张卡片 我希望所有卡片都拉伸到其父 col 元素的高度 注意 我正在使用 Bootstrap 4 并尝试使用现有的网格系统来实现这一点 为了保持一致性 并使用这个特定的标记 我无法让卡片增长到其父容
  • 如何使用 Asp.Net MVC 3 和 Razor 获得特定于视图的 内容?

    除了 Layout cshtml 中已链接的内容之外 我还想在某些视图中链接特定的样式表 对于非 Razor 我看到使用内容占位符 我该如何为 Razor 执行此操作 Razor 中的内容占位符相当于部分 在你的 Layout cshtml
  • /usr/sbin/install 到底有什么作用?

    我正在尝试安装discount https github com Orc discount on my VPS http no de它基于Solaris 设置一些环境变量后编译效果很好 但是安装失败 https gist github co
  • Web 本地应用程序 Apache:运行 shell 脚本

    我开发了一个 shell 脚本 我想用它创建一个 UI 我决定使用带有本地服务器的 Web 界面 因为我对 HTML PHP 的了解很少 比 QT 或 Java 的了解更多 我只是希望我的 html 可以在我的计算机上运行 shell 脚本