php - 从 PHP 页面运行 Shell 脚本
问题描述
我想做的事:
查看时mydomain.com/index.php
,运行一个脚本,该脚本登录到服务器本地网络中的另一台机器(不同于提供服务的机器index.php
)并运行 Python 脚本。
到目前为止我所拥有的:
在index.php
我打电话
shell_exec('/var/www/dir/save.sh '.$ARG1.' '.$ARG2);
脚本save.sh
:
#!/usr/bin/expect -f
set cmd "python /path/to/python_script.py"
set file [lindex $argv 0]
set content [lindex $argv 1]
spawn ssh usr@local_ip "$cmd $file $content"
expect "assword:"
send "PWD\r"
interact
我跑来sudo chmod www-data+x save.sh
启用 PHP-Site 来运行命令。当我sudo -u www-data ./save.sh arg1 arg2
在终端中运行时,一切都按预期工作,我可以看到python_script.py
(我打印用于测试)的输出。
但是,当调用index.php
和回显shell_exec
-Call 的输出时,我看到了所有内容,user@ip's password:
但没有看到输出,python_script.py
并且我可以检查该脚本尚未在另一台机器上调用。
任何想法,我错过了什么? 我很高兴有任何帮助!:)
更新
感谢您的快速回复。很抱歉没有让自己足够清楚。
首先:这不是用于公共/商业/精心制作的网站,而是用于私人娱乐,mydomain.com
并被auth_basic
.
我的设置:Server1
正在托管mydomain.com
. Server2
正在运行一些用于私人娱乐的东西,例如智能家居软件和 Telegram 机器人。
我想要做什么:调用时mydomain.com/index.php
,我想将相同的参数(实际上只是True
或False
)保存到Server2
,以便将它们用于在那里运行的一些脚本。Server1
并且Server2
在同一个本地网络中,但只能Server1
从外部访问,因此通过 SSH 登录并运行 Python 脚本的想法。
我感谢任何有关如何以更好的方式执行此操作或使我的 inteded 解决方案发挥作用的建议。:)
更新 2:
感谢 symcbean 指出脚本中的错误。我不得不承认,我从其他 stackoverflow 线程中复制粘贴了它。
还要感谢 ADyson 指出更好的方法来处理这个问题。对于更大的项目,我一定会记住它们。
与此同时,我能够让脚本运行。它仍然非常基本,不跟踪 Python 脚本的执行,也不处理错误。同样,我不想指出,我仅将其用于私人用途,并且mydomain.com/index.php
只会在有限的时间内使用(它将是一个 andvent 日历,并将在圣诞节后离线)。但为了完整起见,这是我想出的:
#!/usr/bin/expect -f
set cmd "python /path/to/python_script.py"
set file [lindex $argv 0]
set content [lindex $argv 1]
spawn ssh usr@local_ip
expect "assword:"
send "PWD\r"
expect "*\$ "
send "$cmd $file $content\r"
expect "*\$*"
send "exit\r"
interact
解决方案
抛开在你到达那个点之前的特殊选择,当期望脚本到达时你到底期望发生什么
interact
?
你的 shell 脚本中没有任何东西可以启动 python 脚本,也没有跟踪它的执行,也没有退出 shell。同时,您的 PHP 代码将被阻止,直到本地脚本退出。
虽然有很多方法可以解决这个问题,但如果没有更好地理解您为什么选择如此复杂的机制来处理调用,我会犹豫提出任何建议。
推荐阅读
- hash - 如何选择哈希算法
- html - 焦点博客主题 (WordPress) 的总宽度
- i2c - 为什么我的 i2cset 块写入命令不起作用
- php - CodeIgniter 上的 Ajax 格式数据与数据表
- vba - Excel-VBA:在查询中使用变量
- c# - RadMaskedTextBox 如何显示最后 4 个字符?
- javascript - 是否可以在输入文件中设置图像?
- java - Spring Boot + Hibernate:在集合序列化期间不获取延迟加载关系
- php - 我在代码 {Login-Signup form} 中收到 PHP 已弃用错误
- java - 在不检出元素的情况下获取通用类型的 Collection