Here's a small script that generates an SQL backup of all MySQL users from a server.

It uses bash and the MySQL command-line client. To use it, simply provide the machine name (-h), login (-u) and password (-p) as parameters.

$> ./backup-user.sh -h localhost -u login -p passwd

Here's the source code:

#! /bin/bash

while getopts ':h:u:p:' flag ; do
case $flag in
h ) sHost=$OPTARG ;;
u ) sLogin=$OPTARG ;;
p ) sPasswd=$OPTARG ;;
* ) ;;
esac
done

if [ "x" != "x${sPasswd}" ] ; then
sPasswd="-p${sPasswd}"
fi

for u in $(mysql -h "$sHost" -u "$sLogin" "${sPasswd}" --skip-column-names -e "SELECT DISTINCT CONCAT('\'', User, '\'@\'', Host, '\'') FROM mysql.user;" | sort) ; do
echo "### User : $u" ;
mysql -h "$sHost" -u "$sLogin" "-p${sPasswd}" --skip-column-names -e "SHOW GRANTS FOR $u" | ( while read l ; do echo -e "$l ;\nFLUSH PRIVILEGES ;" ; done ) ;
done

And here's a version without parameters:

#! /bin/bash

sHost='localhost' ;
sLogin='login' ;
sPasswd='passwd' ;

for u in $(mysql -h "$sHost" -u "$sLogin" "-p${sPasswd}" --skip-column-names -e "SELECT DISTINCT CONCAT('\'', User, '\'@\'', Host, '\'') FROM mysql.user;" | sort) ; do
echo "### User : $u" ;
mysql -h "$sHost" -u "$sLogin" "-p${sPasswd}" --skip-column-names -e "SHOW GRANTS FOR $u" | ( while read l ; do echo -e "$l ;\nFLUSH PRIVILEGES ;" ; done ) ;
done