首页 > 解决方案 > 从 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,我想将相同的参数(实际上只是TrueFalse)保存到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

标签: phpsshshell-exec

解决方案


抛开在你到达那个点之前的特殊选择,当期望脚本到达时你到底期望发生什么

interact

?

你的 shell 脚本中没有任何东西可以启动 python 脚本,也没有跟踪它的执行,也没有退出 shell。同时,您的 PHP 代码将被阻止,直到本地脚本退出。

虽然有很多方法可以解决这个问题,但如果没有更好地理解您为什么选择如此复杂的机制来处理调用,我会犹豫提出任何建议。


推荐阅读