Faz o loop pelo arquivo para obter a variável de script bash

0

Estou trabalhando em um script para verificar o status de vários hosts MYSQL remotos, fazendo login no servidor e registrando se o login foi bem-sucedido ou não. A idéia é armazenar os detalhes de login para os hosts MYSQL em um arquivo CSV e fazer com que o script faça um loop através desse arquivo, faça o login e registre se o login foi bem-sucedido.

Os dados de login do MYSQL armazenados no arquivo CSV seriam os seguintes:

$host,$user,$password

Sendo um novato no bash scripting, estou tendo problemas para entender como é melhor abordar a parte em que o script faz um loop por meio de um CSV para obter detalhes do MYSQL. Alguém pode ajudar?

Atualmente eu testei o abaixo 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

Obrigado antecipadamente.

    
por joebegborg07 28.04.2017 / 16:44

2 respostas

0

Você pode usar o read builtin e dizer que ele deve dividir a linha em vírgulas usando a variável de shell IFS (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 acima, no entanto, será quebrado se alguma de suas senhas (ou outras variáveis, mas eu suponho que apenas as senhas possam ter esse problema) conterem uma vírgula. Se isso pode ser um problema para você, você terá que mudar o separador para outra coisa em vez de uma vírgula. Algo que nunca aparecerá em uma senha. Por exemplo, uma guia e, em seguida, 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
    
por 28.04.2017 / 16:55
0

O CSV não é particularmente conveniente, mas aqui vai.

while IFS=, read host user pass; do
    if mysql -hu$host" -="$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á examina $? por trás da cena para você, portanto, raramente é necessário 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 inserir um arquivo de entrada separado por espaço em branco, poderá remover o IFS=, e talvez também simplificar algumas outras partes do processamento.

    
por 28.04.2017 / 17:01