如何在PHP页面中使用shell脚本执行MySQL命令?

5
我希望您能够从php页面执行一个shell脚本,该脚本将执行一个MySQL命令。
为了实现这一点,我按照此处所示的方式进行操作:https://dev59.com/mWsz5IYBdhLWcg3wNU8R#8055745 以下是我的sqlscript.sh文件。
#!/bin/sh
sudo wget -t 50 -O /tmp/update.sql http://example.com/update.sql
if [ $? -eq 0 ]; then
    mysql -h "localhost" -u "root" "-pXXXXXXXX" "database-name" < "/tmp/update.sql"
    if [ $? -eq 0 ]; then
        sudo rm /tmp/update.sql
        echo "200"
    else
        echo "502"
    fi
else
    echo "404"
fi

我的php页面是runscript.php

<?php
    shell_exec("sudo /path/to/script/sqlscript.sh");
?>

现在,当我从服务器控制台php页面runscript.php调用sqlscript.sh时,它能够完美地运行并返回预期的200
但是,当我将MYSQL用户和密码放在~/.my.cnf中,这样我就不必在命令行中输入它们:
[client]
user = root
password = XXXXXXXX

并且在 sudoer 中添加了凭据,以便无需密码执行此脚本。

User_Alias WWW_USER = www-data
Cmnd_Alias WWW_COMMANDS_SQL = /path/to/script/sqlscript.sh
WWW_USER ALL = (ALL) NOPASSWD: WWW_COMMANDS_SQL

这是我的 sqlscript.sh 文件

#!/bin/sh
sudo wget -t 50 -O /tmp/update.sql http://example.com/update.sql
if [ $? -eq 0 ]; then
    mysql -h "localhost" "database-name" < "/tmp/update.sql"
    if [ $? -eq 0 ]; then
        sudo rm /tmp/update.sql
        echo "200"
    else
        echo "502"
    fi
else
    echo "404"
fi

现在,当我从服务器控制台调用sqlscript.sh时,它能够完美地运行并按预期返回200。但如果我从php页面调用,则会发生什么情况?

http://example.com/runscript.php

当无法执行SQL命令时,它会返回502

更新:

这是Apache的error.log日志。

--2014-12-05 10:51:55--  http://example.com/update.sql
Resolving example.com (example.com)... 162.144.71.XXX
Connecting to example.com (example.com)|162.144.71.XXX|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 146 [text/x-sql]
Saving to: `/tmp/update.sql'

     0K                                                       100% 10.9M=0s

2014-12-05 10:51:55 (10.9 MB/s) - `/tmp/update.sql' saved [146/146]

ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)

所以,请帮助我解决这个问题。

2
这很可能是一个权限问题。你正在使用 web 服务器用户运行 php,在控制台中使用不同的用户。为了分析问题,你应该检查 apache 日志,并查看(也许还要编辑你的问题)确切的错误消息。 - Volkan Ulukut
还是要检查一下 error.log,相信我,这会有所帮助。 - Volkan Ulukut
这显然是一个权限问题。执行 PHP 脚本的用户,因此您的 bash 脚本(和 mysql),无权访问 my.cnf 文件。 - PauloASilva
您执行的命令不需要 root 权限。 - Gumbo
你的意思是我应该将php页面更改为 <?php shell_exec("/path/to/script/sqlscript.sh"); ?>
我按照说明更改了php页面,但是得到了404错误。
- kuttumiah
显示剩余3条评论
2个回答

1
通过添加--defaults-extra-file选项解决问题。
mysql --defaults-extra-file=~/.my.cnf ...
或者使用绝对路径(可能需要通过apache,取决于服务器配置):
mysql --defaults-extra-file=/absolute/path/to/.my.cnf ...

谢谢你的回答。我会检查并告诉你。 - kuttumiah

0
你试过这个吗?
在你的shell脚本中,不要使用
mysql -h "localhost" "database-name" < "/tmp/update.sql"

使用

mysql -h "localhost"-u root -ppassword "database-name" < "/tmp/update.sql"

基本上,尝试在您的shell脚本中传递MySQL用户名和密码。当然,您可以将它们放入变量/配置文件/任何其他地方以进行模糊处理

MySQL 28000错误表明您的脚本能够尝试以root身份登录,但由于没有参数密码,因此失败了


您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - kuttumiah
非常抱歉没有正确阅读问题。由于某种原因,我误读了原始脚本。您是否尝试将.my.cnf放入www-data的主文件夹中,而不是您的用户主文件夹中?或者将apache用户设置为您的用户(这在某些人看来可能不是首选)。 - Don Djoe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接