PHP诱发的期望脚本[关闭]

问题描述 投票:-4回答:1

我有一台运行Ubuntu 14的服务器,无论使用的是最新的apache兼容版本。该服务器用于家庭自动化任务。我使用的某些设备只能通过SSH访问脚本来控制。我一直为此使用Expect脚本。我的设置过去可以在运行Jessie的旧RPI2上正常工作。

我已经淘汰了RPI2,并将Web服务器移到了我使用其他软件安装的另一个盒子上。

我有一个PHP文件,因此我可以通过Web请求来调用脚本:

<?php

exec ("sudo /var/www/powersaving/on.sh");

?>

<script type="text/javascript">

window.close();

</script>

稍后添加了sudo部分,以使脚本以root身份运行,以尝试进行故障排除。似乎实际上并不需要它,因为我可以以root或sudo的身份运行脚本。一旦工作,它将被删除。我还在sudoer中添加了ALL ALL = NOPASSWD脚本:/ var / www / power Saving / on.sh

它运行的脚本:

#!/bin/bash

cd /var/www/powersaving/on/

./hue.sh

sleep 15

./mfi.sh

sleep 15

./rbrelay.sh

sleep 15

./tsright.sh

sleep 15

./tstop.sh

sleep 15

./tsleft.sh

以超级用户或普通用户身份登录服务器后运行:

使用hue.sh关闭色相灯-#!/ bin / bash /-卷曲

使用mfi.sh关闭UBNT mFi素材-#!/ bin / bash /-curl

使用rbrelay.sh-#!/ bin / bash /-curl关闭数字记录仪重新启动板上的东西

使用tsright.sh关闭UBNT ToughSwitch上的内容-#!/ bin / expect /-期望ssh

使用tstop.sh关闭UBNT ToughSwitch上的内容-#!/ bin / expect /-期望ssh

使用tsleft.sh关闭UBNT ToughSwitch上的内容-#!/ bin / expect /-期望ssh

当通过腻子登录时被./on.sh调用时,它的工作原理是完美的。

[当通过Home Assistant服务器使用浏览器或curl命令使用php文件运行时:

使用hue.sh关闭色相灯-#!/ bin / bash /-卷曲

使用mfi.sh关闭UBNT mFi素材-#!/ bin / bash /-curl

使用rbrelay.sh-#!/ bin / bash /-curl关闭数字记录仪重新启动板上的东西

没别的

我已经更改了订单,没有任何改变。这是我喜欢的顺序,所以我改了一下。在此过程中,任何关闭或重新启动的操作都不会断开Web服务器与其所连接的设备或Home Assistant的连接。从腻子中起作用的事实也使这一点非常清楚。

已使用chmod -R 777 *尝试了整个/ var / www /文件夹,没有区别。当前将其设置为chown -R root:root *和chmod go-w + rx *(不确定这是100%命令,基本上root可以wrx,其他所有人可以rx)。

一切都指向PHP调用Expect脚本的问题,因为它确实bash可以使bash正常运行,但是bash希望不进行。奇怪的是,如果我使用Internet Explorer,则会收到一条消息,指出该网页正在尝试关闭窗口,并且实际上我可以看到期望的cmds运行。我认为,这意味着它实际上是在读取和执行脚本,但是由于实际获取设备而停止。

[我相信同一脚本以前曾在Ubuntu 16的裸机上工作(不记得了,自那以后已经有一段时间了。它与Raspbian Jesse一起移到RPI2已有一段时间了,但除了exec(“”);,我不得不使用system(“”);,但是仍然可以工作。我已经尝试了exec和system,两者都在这个裸机上做同样的事情。

由于我已经遍及整个论坛,所以我觉得我必须包括以下内容:

Ubuntu 14-是的,我知道。我一直在尝试减少吸电的计算机的数量,并且该计算机仅运行旧版的UBNT mFi软件,永远不会更新,不会被UBNT确认失效,并且在16或更高版本上不受支持(让它正常工作)一次经过16次调整)。我认为,它也仅在本地可用,没有端口转发到它,并且位于良好的防火墙后面(我对Mikrotik Routers相当好,但是不会说我很完美)。此外,即使软件已停产,但实际上与我花了很多钱的硬件仍然非常有用,即使我已经为大部分代码编写了替代代码,但也有一些我不能没有的事情刚刚。

Apache / PHP以root身份运行脚本-这是用于测试的临时性工具,再次是仅本地可用的服务器。

期望-当我第一次了解期望脚本时,此站点上有很多支持。我最近查看过的大多数资料试图弄清楚这一点,其中有很多评论和“答案”说不要使用期望。当从腻子中跑出来时,期望不是问题。我无法在UBNT ToughSwitch上安装SSH密钥,并希望它们在重新引导后仍保持在那里(在UBNT设备上修补了此问题,这使人们无法在每次引导时运行自定义脚本)。

[最终,我想要一个解决方案,该解决方案使用我已经花费大量时间编写的脚本,并且使用的是我大多数已经理解的语言。

过去有一些人帮助我在这里期待脚本和PHP,希望他们还在。

@ Dinesh上次我遇到期望方面的问题时,他是一位了不起的帮助。

php bash shell ubuntu-14.04 expect
1个回答
0
投票

在我期望脚本的结尾处:

send "save\r"
expect "*#*"
send "reboot\r"
interact

[当与./on.sh混合使用腻子时有效。通过php on.php

运行时也可以使用

由于某种原因,当通过Web请求访问on.php时,它将执行所有操作,但在实际发送重新启动命令之前会退出。

更改为:

send "save\r"
expect "*#*"
send "reboot\r"
expect "*#*"
interact

额外的expect命令为它提供了足够的时间在关闭连接之前运行它。

我不认为期望脚本是问题,因为它在其他地方都能正常运行。

我想我也应该在问题中添加至少一个脚本,但不确定是否会被捕获,因为从逻辑上讲,如果您可以使用php on.php运行脚本就可以了,那么应该在线。

显然,在使用脚本时,使用php on.phpcurl on.php是有区别的。

© www.soinside.com 2019 - 2024. All rights reserved.