非root用户执行含MySQL查询的Bash脚本失败求助
问题:非root用户运行Bash脚本连接MySQL失败
脚本示例
#!/bin/bash USER="myuser" PASS="mypass" author="tester" whoami >> /tmp/log echo $author >> /tmp/log cmdu=`/usr/bin/mysql -D mydb -s -u $USER -p$PASS -e "SELECT id FROM users WHERE username='$author'"` echo $cmdu >> /tmp/log echo "ended" >> /tmp/log
运行结果对比
- root用户运行,/tmp/log输出正常:
root tester 2987 ended
- 非root用户(如kola)运行,MySQL查询报错:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (13)
/tmp/log输出:
kola tester ended
已尝试但无效的操作
usermod -a -G mysql kola chmod -R 777 /var/lib/mysql
已在mysql.user中创建kola用户并授予全部权限,生产环境中apache用户运行类似脚本也失败。
解决方案
1. 检查MySQL套接字文件及目录权限
错误码13为权限拒绝,先查看套接字文件的权限与归属:
ls -l /var/run/mysqld/mysqld.sock
正常应属mysql:mysql组,权限为rw-rw----(660)。同时检查套接字所在目录权限:
ls -ld /var/run/mysqld
目录需至少开放rx权限给其他用户/组,可执行命令修正:
chmod 755 /var/run/mysqld
2. 修正过度授权的安全问题
之前给/var/lib/mysql设置777权限存在严重安全风险,需恢复正确权限:
chown -R mysql:mysql /var/lib/mysql chmod -R 750 /var/lib/mysql
3. 确认MySQL连接用户权限
脚本中使用myuser连接,需确保该用户允许本地连接,而非仅创建kola用户。执行以下SQL语句验证并授权:
CREATE USER 'myuser'@'localhost' IDENTIFIED BY 'mypass'; GRANT ALL PRIVILEGES ON mydb.* TO 'myuser'@'localhost'; FLUSH PRIVILEGES;
4. 切换为TCP/IP连接绕过套接字问题
若套接字权限问题难以排查,可强制MySQL使用TCP连接,在命令中添加-h 127.0.0.1:
cmdu=`/usr/bin/mysql -D mydb -s -u $USER -p$PASS -h 127.0.0.1 -e "SELECT id FROM users WHERE username='$author'"`
5. Apache用户的适配方案
- 确保apache用户加入可访问MySQL资源的组:
usermod -a -G mysql apache - 若仍有问题,可采用上述TCP连接方式,或在sudoers中配置apache无密码运行特定mysql命令(需严格限制范围)
内容的提问来源于stack exchange,提问作者Ivanhou
相关产品推荐
相关产品推荐

