【问题标题】:Running Shell Script from PHP Page从 PHP 页面运行 Shell 脚本
【发布时间】:2019-04-08 15:39:05
【问题描述】:

我想做的事:

当查看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 站点能够运行该命令。当我在终端中运行sudo -u www-data ./save.sh arg1 arg2 时,一切都按预期工作,我可以看到python_script.py 的输出(我打印出来用于测试)。

但是,当调用index.php 并回显shell_exec-Call 的输出时,我看到user@ip's password: 之前的所有内容,但没有python_script.py 的输出,我可以检查一下,该脚本尚未在另一台机器上调用。

知道吗,我错过了什么? 我很高兴有任何帮助! :)


更新

感谢您的快速回复。很抱歉没有让自己足够清楚。

首先:这用于公共/商业/精心制作的网站,而是用于私人娱乐,mydomain.comauth_basic 锁定。

我的设置:Server1 正在托管 mydomain.comServer2 正在运行一些私人娱乐活动,例如智能家居软件和 Telegram 机器人。

我想要做什么:调用mydomain.com/index.php时,我想将相同的参数(实际上只是TrueFalse)保存到Server2,以便将它们用于在那里运行的一些脚本。 Server1Server2 在同一个本地网络中,但只有 Server1 可以从外部访问,因此建议通过 SSH 登录并运行 Python 脚本。

感谢任何有关如何以更好的方式执行此操作或使我的预期解决方案发挥作用的建议。 :)


更新 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

【问题讨论】:

  • 请注意,从 PHP 脚本运行脚本可能非常危险,尤其是当用户输入用于构建执行的命令行时。我建议完全不要这样做,如果你这样做了,那么你需要对用户输入进行一些非常强大的验证。
  • 感谢您的建议。目的是将根据用户输入计算的相同参数保存在本地计算机上。您对如何以更节省的方式执行此操作有什么建议吗?
  • 你说你想保存在“本地”机器上?你的意思是运行 PHP 的机器? PHP 可以直接做到这一点,无需 shell 命令或 SSH。那会让事情变得更安全。您应该编写一些 PHP 来验证输入是否符合您的预期,然后再将其传递给任何其他脚本或文件。但是你真的需要稍微澄清一下用例和确切的情况,然后才能有人就不同的设计给你具体的建议。
  • 哎呀,试图保持简短真的会扼杀上下文......我在更新中添加了对我的设置的描述。
  • 感谢您的更新。值得注意的是,除非您还使用 HTTPS,否则基本身份验证几乎没有任何安全性 - 否则任何人都可以通过不安全的连接嗅探您的密码。

标签: php ssh shell-exec


【解决方案1】:

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

interact

?

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

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

【讨论】:

    猜你喜欢
    • 2012-03-28
    • 2021-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多