
Estou trabalhando em um script para verificar o status de vários hosts MYSQL remotos, fazendo login em cada servidor e registrando se o login foi bem-sucedido ou não. A ideia é armazenar os detalhes de login dos hosts MYSQL em um arquivo CSV e fazer com que o script percorra esse arquivo, faça login e registre se o login foi bem-sucedido.
Os dados de login MYSQL armazenados no arquivo CSV seriam os seguintes:
$host,$user,$password
Sendo um novato em scripts bash, estou tendo problemas para entender como é melhor abordar a parte em que o script percorre um CSV para obter detalhes do MYSQL. Alguém pode ajudar?
Atualmente testei o seguinte para hosts MYSQL individuais
mysql -h$host -=$user -p$pass -d$db -e exit
if [ "$?" -eq "0" ]
then
echo "Connection established"
else
echo "Connection not established"
fi
Desde já, obrigado.
Responder1
Você pode usar o read
builtin e dizer que ele deve dividir a linha entre vírgulas usando a IFS
variável shell (separador de campo de entrada):
$ 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
Então, no seu script, você gostaria de algo como:
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
O texto acima, no entanto, será quebrado se alguma de suas senhas (ou outras variáveis, mas presumo que apenas as senhas possam ter esse problema) contiver uma vírgula. Se isso for um problema para você, você terá que alterar o separador para outra coisa em vez de uma vírgula. Algo que nunca aparecerá em uma senha. Por exemplo, uma guia, e então você pode fazer:
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
Responder2
CSV não é particularmente conveniente, mas aqui vai.
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
Observe como if
(e geralmente todas as instruções de controle de fluxo do shell) já examinam $?
os bastidores para você, portanto, muito raramente você precisará examiná-lo explicitamente em seus scripts.
Além disso, adicionei o nome do host às mensagens de saída, para torná-las mais informativas.
Se você puder instalar um arquivo de entrada separado por espaços em branco, poderá retirá-lo IFS=,
e talvez também simplificar algumas outras partes do seu processamento.