“while read line” retorna cedo ao chamar ssh “mysql…”

1

Eu tenho um script que lê dados do mysql (a função get_sql_results abaixo) Em seguida, leio em cada linha, analisando colunas individuais com o awk.
Tudo funciona bem, exceto pela linha que atribui os resultados de uma consulta mysql via ssh para cmusername. Quando esta linha é incluída, apenas a primeira linha dos resultados $ é lida, e o script parece "escape" do loop while read, depois de terminar sua primeira iteração.
Quando eu comento o cmusername = line, ele exibe as várias linhas como seria de esperar.

Aqui está o script principal:

new_results() {
get_sql_results

printf %s "$results" |
while read -r line 
do        
    accounttyperaw=$(echo -en "$line" | awk -F $'\t' '{print $5}')
    accountstatusraw=$(echo -en "$line" | awk -F $'\t' '{print $3}')
    accountname=$(echo -en "$line" | awk -F $'\t' '{print $4}')
    datelastchange=$(echo -en "$line" | awk -F $'\t' '{print $8}')
    cmuserid=$(echo -en "$line" | awk -F $'\t' '{print $9}')

    accounttype=$( get_account_type $accounttyperaw )
    accountstatus=$( get_account_status $accountstatusraw )
    cmusername=$(ssh -p $mysqlport username@remotemysqlserver "/usr/local/mysql/bin/mysql -hdb00 -udba -ppassword -N -e \"SELECT username from userapp.users where userapp.users.user_id rlike '$cmuserid'; \" ")

    echo -en "$domainname\t"
    echo -en "$accounttype\t"
    echo -en "$accountstatus\t"
    echo -en "$accountname\t"
    echo -en "$datelastchange\t"
    echo -en "$cmusername\t"

    echo
done 
}

new_results

Editar - Resolvido:

ssh necessário - não passou para ele. veja minha resposta abaixo.

    
por senorsmile 06.06.2013 / 19:35

3 respostas

1

Necessário incluir -n no comando ssh conforme

link

 -n      Redirects stdin from /dev/null (actually, prevents reading from stdin).  This must be used when ssh is run in the background.  A common trick is to use this to run X11 programs on a remote machine.  For example, ssh -n shadows.cs.hut.fi emacs & will
         start an emacs on shadows.cs.hut.fi, and the X11 connection will be automatically forwarded over an encrypted channel.  The ssh program will be put in the background.  (This does not work if ssh needs to ask for a password or passphrase; see also the
         -f option.)
    
por 06.06.2013 / 20:08
1

Outra maneira de fazer com que ssh funcione em um loop canalizado de while é usar a substituição de processo e um descritor de arquivo alternativo se sua versão do Bash suportar esses recursos.

while read -r -u 3 line
do
    ...
    cmusername=$(ssh -p $mysqlport username@remotemysqlserver "/usr/local/mysql/bin/mysql -hdb00 -udba -ppassword -N -e \"SELECT username from userapp.users where userapp.users.user_id rlike '$cmuserid'; \" ")
    ...
done 3< <(printf %s "$results")

Isso tem a vantagem adicional de não criar um subshell no loop while , para que as variáveis definidas no loop fiquem disponíveis após o término do loop. Isso pode ser usado mesmo se você não estiver usando o descritor de arquivo alternativo.

    
por 07.06.2013 / 03:21
0

Não vejo parênteses de fechamento em sua linha. Poderia ser esse o problema?

    cmusername=$(ssh -p $mysqlport username@remotemysqlserver "/usr/local/mysql/bin/mysql -hdb00 -udba -ppassword -N -e \"SELECT username from userapp.users where userapp.users.user_id rlike '$cmuserid'; \" "

Deve ser

    cmusername=$(ssh -p $mysqlport username@remotemysqlserver "/usr/local/mysql/bin/mysql -hdb00 -udba -ppassword -N -e \"SELECT username from userapp.users where userapp.users.user_id rlike '$cmuserid'; \" ")
    
por 06.06.2013 / 19:38

Tags