如何使用PHP页面中的shell脚本执行MySQL命令?
I want to execute a shell script from php page which will execute a MySQL command.
To do this I followed the way shown here: https://stackoverflow.com/a/8055745/2117868
Here is my 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
And my php page is runscript.php
<?php
shell_exec("sudo /path/to/script/sqlscript.sh");
?>
Now, when I'm calling the sqlscript.sh
from the server console or php page runscript.php
it works perfectly and returns 200
as expected.
But when I take MYSQL user and password in ~/.my.cnf
so I don't have to put it on the command-line at all:
[client]
user = root
password = XXXXXXXX
And added credentials in sudoer
to execute this script without password.
User_Alias WWW_USER = www-data
Cmnd_Alias WWW_COMMANDS_SQL = /path/to/script/sqlscript.sh
WWW_USER ALL = (ALL) NOPASSWD: WWW_COMMANDS_SQL
Here is my 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
Now, when I'm calling the sqlscript.sh
from the server console it works perfectly and returns 200
as expected. But if I call it from the php page
http://example.com/runscript.php
it returns 502
as it couldn't execute the SQL command.
Update:
Here is the 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)
So, please help me to solve the issue.
Have you tried this?
In your shell script, instead of
mysql -h "localhost" "database-name" < "/tmp/update.sql"
use
mysql -h "localhost"-u root -ppassword "database-name" < "/tmp/update.sql"
Basically, try to pass MySQL username and password inside your shell script. Of course you can put them into variables/configs/whatever to obsecure it
MySQL 28000 error showed that your script was able to attempt to login as a root but because there was no parameter password, it failed
Solved by adding the --defaults-extra-file option.mysql --defaults-extra-file=~/.my.cnf
...
Or with absolute path (might be required via apache, depends on server config):mysql --defaults-extra-file=/absolute/path/to/.my.cnf
...