繁体   English   中英

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

[英]How to execute a MySQL command using shell script from PHP page?

我想从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页面 runscript.php调用sqlscript.sh ,它可以正常工作并按预期返回200

但是,当我在~/.my.cnf输入MYSQL用户名和密码时,根本不必将其放在命令行中:

[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)

因此,请帮助我解决问题。

通过添加--defaults-extra-file选项解决。
mysql --defaults-extra-file=~/.my.cnf ...

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

你有尝试过吗?

在您的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用户身份登录,但由于没有参数密码,因此失败

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM