我想从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
所以,请帮我解决这个问题。
答案 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身份登录,但由于没有参数密码,因此失败