![正确的 MySQL 用户名/密码,但从脚本运行时出现“访问被拒绝”错误](https://linux22.com/image/557295/%E6%AD%A3%E7%A1%AE%E7%9A%84%20MySQL%20%E7%94%A8%E6%88%B7%E5%90%8D%2F%E5%AF%86%E7%A0%81%EF%BC%8C%E4%BD%86%E4%BB%8E%E8%84%9A%E6%9C%AC%E8%BF%90%E8%A1%8C%E6%97%B6%E5%87%BA%E7%8E%B0%E2%80%9C%E8%AE%BF%E9%97%AE%E8%A2%AB%E6%8B%92%E7%BB%9D%E2%80%9D%E9%94%99%E8%AF%AF.png)
我目前正在尝试从 shell 脚本中运行以下命令。
/usr/bin/mysql -u username -ppassword -h localhost database
手动执行时,它工作得很好,而不是在脚本中执行。当我尝试执行包含该命令的脚本时,出现以下错误:
ERROR 1045 (28000) at line 3: Access denied for user 'username'@'localhost' (using password: YES)
我确实将有效命令复制并粘贴到了脚本中。为什么会出现错误?附注:最终目的是使用 cron 运行脚本。
编辑:这是我尝试运行的脚本的精简版。您可以忽略其中的大部分内容,直到第 19 行左右连接到 MySQL 为止。
#!/bin/sh
#Run download script to download product data
cd /home/dir/Scripts/Linux
/bin/sh script1.sh
#Run import script to import product data to MySQL
cd /home/dir/Mysql
/bin/sh script2.sh
#Download inventory stats spreadsheet and rename it
cd /home/dir
/usr/bin/wget http://www.url.com/file1.txt
mv file1.txt sheet1.csv
#Remove existing export spreadsheet
rm /tmp/sheet2.csv
#Run MySQL queries in "here document" format
/usr/bin/mysql -u username -ppassword -h localhost database << EOF
--Drop old inventory stats table
truncate table table_name1;
--Load new inventory stats into table
Load data local infile '/home/dir/sheet1.csv' into table table_name1 fields terminated by ',' optionally enclosed by '"' lines terminated by '\r\n';
--MySQL queries to combine product data and inventory stats here
--Export combined data in spreadsheet format
group by p.value into outfile '/tmp/sheet2.csv' fields terminated by ',' optionally enclosed by '"' lines terminated by '\r\n';
EOF
编辑 2:经过更多测试后,问题出在<< EOF
命令末尾的那个。这是为“此处文档”准备的。删除后,命令可以正常工作。问题是我需要<< EOF
那个,这样 MySQL 查询才能运行。
答案1
事实证明,根本原因是我尝试在没有适当权限的情况下执行 MySQL 查询中的命令。这就是为什么它显示错误at line 3
,即 SQL 查询的第 3 行。我切换到root
,现在一切正常。以下是更清楚地提出和回答的问题:
答案2
您是否在本地主机上使用相同的命令/脚本?或者在远程服务器上,请记住,中的每个条目mysql.users
都是由设置的host
,因此如果您只使用本地主机,它将无法用于远程访问,反之亦然。
答案3
如果是 bash shell 脚本,您可以将 #! 行设置为#!/bin/bash -x
,这会使脚本向控制台输出其正在执行的确切命令。然后,您可以获取该命令并手动尝试,或者查看它与您已经手动运行的命令有何不同。
除此之外,从运行此命令的脚本中发布一个片段会很有帮助,这样我们就有更多的上下文来回答这个问题。
答案4
最后一行仅包含“EOF\n”是绝对重要的。行尾的单个空格符号可以使标记与第一行使用的标记不同。对于您的情况,只需在“EOF”行后添加空字符串即可。
在代码的最后一行添加注释行是一个好习惯。
/usr/bin/mysql -u username -ppassword -h localhost database << EOF
. . . . .
EOF
###