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 脚本 的相关文章

  • Zend Framework 中的动态默认模块

    有谁知道在 Zend Framework 中动态设置默认模块并且不会遇到命名空间问题的方法 例如 我想要做的是有一个允许加载的模块表 其中一个设置为默认模块 例如 我可能有 admin blog calendar 作为可以加载的模块 如果我
  • Ajax文件上传

    我想使用 Ajax 和 php 上传文件 我有一个表格
  • 检查字符串是否是哈希值

    我正在使用 SHA 512 来散列我的密码 当然还有盐 我认为我想要的不可能 但无论如何我们还是要问一下 有没有办法检查字符串是否已经是 SHA 512 或其他算法 哈希值 当用户登录时 我想检查他的密码 如果它仍然是纯文本 则应将其转换为
  • Cakedc.users => 总是重定向到主页

    我在新的 Cakephp 安装上使用插件 CakeDC Users 我有两个控制器 PagesController php CardsController php Pages 有 1 个操作 Beta 它是主页 Cards 有两个操作 索引
  • PHP DOM - 剥离 span 标签,保留其内容

    我希望采用如下标记 span class test Some text that is strong bolded strong and contains a a href link a span 并在 PHP 中找到剥离跨度的最佳方法 剩
  • 切换到 mysqli 是个好主意吗?

    我正在考虑为我的所有 php 项目切换到 mysqli 我的代码编写方式 我运行非常简单的网站并构建了自己的基本框架 我在所有网站上使用该框架 我在修改函数和类时不应该遇到太多问题 然而 我只听说过关于准备好的语句的积极的事情 除了一些关于
  • 将IP保存到数据库中

    当用户登录时 我想将他们的 IP 保存在数据库中 我该怎么做呢 MySQL 字段最适合使用哪种类型 获取IP的PHP代码是什么样的 我正在考虑将其用作登录 会话内容的额外安全功能 我正在考虑使用用户现在拥有的 IP 检查用户从数据库登录的
  • 在 iOS 模拟器中安装应用程序的脚本

    我正在尝试自动化构建应用程序 运行单元测试以及最终运行 UI 测试的过程 我正在通过命令行 xcodebuild sdk iphonesimulator6 0 在某个目录中构建应用程序 如何通过命令行 在 Library Applicati
  • Composer 无法获取 github

    今天 我尝试通过运行来安装 Laravelcomposer create project laravel laravel 5 1 myproject prefer dist我收到此错误 Could not fetch https api g
  • 如何在php中使用一张图像绘制形状

    我需要使用图像的一部分来创建帧图像 例如 用户将从后端上传图像片段 现在我需要根据前端用户的要求在前端创建一个框架 用户将选择框架的高度和宽度 然后他将选择该图像片段 如下所示 我没有办法做到这一点 我尝试通过 css 和 html can
  • php oracle客户端oci8安装出现什么问题

    我尝试了安装 PHP Oracle 客户端的所有过程 1 我安装了客户端版本8和32位 2 我在php ini中取消了oci的注释 3 重新启动Wamp 4 不确定是否真的安装 但我在 php ini 中得到了引用 5 但仍然无法连接 泰汉
  • 扩展构建器中的“映射到现有表”显示 TYPO3 中的奇怪问题

    在我的扩展中MyExt 我映射了模型Page to pagesTYPO3 中的表 首先它向我展示了type mismatch错误 无论如何我继续保存它 会发生以下情况 我的页面树变成这样 我的新记录表单仅显示 UID 而不显示标题 My P
  • 如何在shell中输出返回码?

    我正在尝试通过调用自定义 shell 脚本sh bin sh c myscript sh gt log txt 2 gt 1 echo 该命令的输出是创建的后台进程的 PID 我想指导 bin sh保存返回码myscript sh到某个文件
  • ACL授权失败后ZF3重定向

    我有一个带有 ACL 的新 ZF3 应用程序 现在 我需要在未经授权的访问的情况下重定向到错误页面 例如 403 我认为最好的方法是触发一个事件 然后捕获它 但我失败了 全部都在我的用户模块中Module php 摘录 namespace
  • 在 PHP 中接受带有小数点和千位分隔符的国际数字

    对于用户可以输入能量值来计算相应费用的在线计算器 我需要 PHP 脚本来接受各种用户输入 200 万又四分之一焦耳 的值可以输入为 2000000 25 默认表示法 2 000 000 25 带千位分隔符 2000000 25 逗号作为小数
  • 使用 PHP 中的 GD 库在图像上绘图

    我创建了一个代码来生成随机图案图像 它创建一个具有给定宽度和高度的图像 并用 40x40 像素的小矩形填充它 这是我的代码
  • iptables通过注释删除特定规则

    我需要删除一些具有相同评论的规则 例如 我有带有 comment test it 的规则 所以我可以像这样获得它们的列表 sudo iptables t nat L grep test it 但是我怎样才能删除所有带有注释 测试它 的 PR
  • 禁用 WooCommerce 手动/编辑订单的电子邮件通知

    需要 WooCommerce 专业知识 我需要禁用手动创建的订单的电子邮件通知 我必须使用处理状态 由于处理订单状态的自定义挂钩 我无法创建自定义状态 理想情况下 手动订单页面中可以勾选一个复选框 勾选后 它将禁止在每种状态下向客户发送电子
  • 如何以管理员身份在 rake 任务中运行 shell 命令?

    我有一个简短的 cmd 文件 我想将其作为部署过程的一部分运行 不幸的是 cmd 文件需要管理员权限 是否可以从 rake 中获得管理员权限 或者我是否需要以管理员身份启动 shell 您可以尝试runas http ss64 com nt
  • Linux 中什么处理 ping?

    我想覆盖 更改 linux 处理 ping icmp echo 请求数据包的方式 这意味着我想运行自己的服务器来回复传入的 icmp 回显请求或其他 数据包 但为了使其正常工作 我想我需要禁用 Linux 的默认 ping icmp 数据包

随机推荐

  • 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 脚本