Shell脚本登录时警告不安全
说明
通过Shell脚本连接数据库MySQL进行操作时,在使用正确的用户密码正常登录MySQL后,会提示:[Warning] Using a password on the command line interface can be insecure
意思为:[警告]在命令行界面上使用密码可能不安全
复现
mysql_dev.sh脚本代码如下:
mysql_host=127.0.0.1
mysql_port=3306
mysql_user=root
mysql_passwd="123456"
mysql -h ${mysql_host} --port "${mysql_port}" -u "${mysql_user}" --password=${mysql_passwd} -e 'show databases'
执行脚本返回信息如下:
解决方案
通过全局设置密码export MYSQL_PWD=<明文密码>
,改造如下:
mysql_host=127.0.0.1
mysql_port=3306
mysql_user=root
mysql_passwd="123456"
export MYSQL_PWD="${mysql_passwd}"
mysql -h "${mysql_host}" --port "${mysql_port}" -u "${mysql_user}" -e 'show databases'
执行脚本返回信息如下,问题被解决
执行SQL报错可以获知和处理
说明
当使用错误的SQL执行时,如表不存在这种场景,是没办法直接报错的;但是预期应该是:当报错时,可以获知和处理
复现
原代码如下:
mysql -h "${mysql_host}" --port "${mysql_port}" -u "${mysql_user}" -e 'show database'
执行结果如下:
解决方案
通过shell的错误信号$?
判断是否成功执行,改造如下:
mysql -h "${mysql_host}" --port "${mysql_port}" -u "${mysql_user}" -e 'show database'
if [[ $? -ne 0 ]];then
echo "执行MySQL报错"
fi
执行结果如下:
执行SQL报错信息不进行输出
说明
如上一个例子,可以知道执行SQL报错,因为直接打印输出了;但由于在Shell中,代码量多,在正常情况下,预期知道执行错误但不期望打印输出错误
解决方案
在上一个例子的前提下,可以通过Shell的 2>&1
解决
改造如下:
mysql -h "${mysql_host}" --port "${mysql_port}" -u "${mysql_user}" -e 'show database' 2>&1
if [[ $? -ne 0 ]];then
echo "执行MySQL报错"
fi
改造后执行结果如下,MySQL客户端返回的错误信息没有被打印
补充:其中Shell脚本登录时告警不安全也可以通过这一方法解决
返回结果如何处理
说明
一般通过Shell脚本连接使用MySQL,不会有使用MySQL处理返回结果。但是也有这种场景问题。所以,怎么通过Shell处理MySQL执行SQL的返回结果,特别是多条返回结果的场景下。
解决方案
如处理获取MySQL表结构desc <table>
,
mysql_host=127.0.0.1
mysql_port=3306
mysql_user=root
mysql_passwd="123456"
export MYSQL_PWD="${mysql_passwd}"
sql="desc mysql.slow_log;"
if [[ $? -ne 0 ]];then
echo "执行MySQL报错"
fi
mysql -h "${mysql_host}" --port "${mysql_port}" -u "${mysql_user}" -e "${sql}" | awk '{
if(NR>1){
print "序号: "NR-1", 字段: "$1", 类型: "$2", 是否允许为空: "$3", 默认值: "$4
}
}'
执行返回结果
补充:由于awk默认是通过空格分列的,而MySQL也是,所以通过desc获取表结构信息的返回结果时,第5列预期返回的是描述信息,但实际上,如果描述信息有空格内容,会被截断。