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

时间:2014-12-05 09:06:18

标签: php mysql bash shell

我想从php页面执行一个shell脚本,它将执行一个MySQL命令。

为此,我按照此处显示的方式进行操作:https://stackoverflow.com/a/8055745/2117868

这是我的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页面 sqlscript.sh调用runscript.php时,它可以正常运行并返回{ {1}}正如所料。

但是当我在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。但如果我从php页面调用它

200

它返回http://example.com/runscript.php ,因为它无法执行SQL命令。

更新

这是Apache 502

error.log

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

2 个答案:

答案 0 :(得分:1)

通过添加 - 默认 - 额外文件选项解决 mysql --defaults-extra-file=~/.my.cnf ...

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

答案 1 :(得分: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身份登录,但由于没有参数密码,因此失败