
Я работаю над скриптом для проверки статуса нескольких удаленных хостов MYSQL, входя в каждый сервер и записывая, был ли вход успешным или нет. Идея состоит в том, чтобы сохранить данные входа для хостов MYSQL в файле CSV и заставить скрипт циклически проходить по этому файлу, входить и записывать, был ли вход успешным.
Данные входа в MYSQL, сохраненные в CSV-файле, будут следующими:
$host,$user,$password
Будучи новичком в написании скриптов bash, я не могу понять, как лучше всего подойти к той части, где скрипт проходит по CSV для получения данных MYSQL. Может ли кто-нибудь помочь?
В настоящее время я протестировал следующее для отдельных хостов MYSQL
mysql -h$host -=$user -p$pass -d$db -e exit
if [ "$?" -eq "0" ]
then
echo "Connection established"
else
echo "Connection not established"
fi
Заранее спасибо.
решение1
Вы можете использовать read
встроенную функцию и указать ей, что она должна разбить строку запятыми, используя IFS
переменную оболочки (разделитель полей ввода):
$ cat file
user1,host1,pass1
user2,host2,pass2
$ while IFS="," read -r user host pass; do echo "$user:$host:$pass"; done < file
user1:host1:pass1
user2:host2:pass2
Итак, в вашем сценарии вы хотели бы что-то вроде:
while IFS="," read -r user host pass; do
if mysql -h "$host" -u "$user" -p"$pass" -e exit; then
echo "Connection established"
else
echo "Connection failed" fi;
done < file
Однако вышесказанное не сработает, если любой из ваших паролей (или других переменных, но я предполагаю, что только пароли могут иметь эту проблему) будет содержать запятую. Если это может быть проблемой для вас, вам придется изменить разделитель на что-то другое вместо запятой. Что-то, что никогда не будет встречаться в пароле. Например, табуляция, и тогда вы можете сделать:
while IFS=$'\t' read -r user host pass; do
if mysql -h "$host" -u "$user" -p"$pass" -e exit; then
echo "Connection established"
else
echo "Connection failed" fi;
done < file
решение2
CSV не очень удобен, но пусть будет.
while IFS=, read host user pass; do
if mysql -h"$host" -u"$user" -p"$pass" -d"$db" -e exit
then
echo "$host: Connection established"
else
echo "$host: Connection not established"
fi
done <file.csv
Обратите внимание, что if
(и вообще все операторы управления потоком командной оболочки) уже проверяются $?
за кулисами, поэтому вам очень редко придется явно проверять их в своих скриптах.
Кроме того, я добавил имя хоста в выходные сообщения, чтобы сделать их более информативными.
Если вместо этого у вас есть входной файл, разделенный пробелами, вы можете убрать IFS=,
и, возможно, также упростить некоторые другие части вашей обработки.