variável de porta de loop para se conectar a vários computadores

0

Eu tenho alguns pi's de framboesa criando túneis ssh reversos em um servidor ssh. Daquele servidor eu posso conectar em todos os pi da framboesa. Eu quero criar um script bash que será executado neste servidor ssh, coletar algumas informações de todos os pi de framboesa e gerar um relatório html. Eu tenho algo que já está funcionando, só se conecta em um único pi de framboesa. Eu preciso de alguma forma de loop, para que ele se conecte em todos os pi de framboesa.

A variável que deve ser colocada em loop de alguma forma é $ port porque cada pi do framboesa se conecta em uma porta exclusiva no servidor ssh, e é dessa porta que o servidor pode se conectar novamente no pi do framboesa.

Eu estou supondo que terá que ser algo como ... para cada porta $ no ports.txt execute os seguintes comandos e coloque os resultados na tabela html

#!/bin/bash

cpu="$(ssh -o StrictHostKeyChecking=no $user@localhost -p $port echo $[100-$(vmstat|tail -1|awk '{print $15}')]"%")"
dsk="$(ssh -o StrictHostKeyChecking=no $user@localhost -p $port df -h /dev/mmcblk0p2 | awk 'NR>1{print $5}')"
mem="$(ssh -o StrictHostKeyChecking=no $user@localhost -p $port free | grep -e-/+ | awk '{print $3/($3+$4) * 100.0 ''}' | cut -d '.' -f1)"
tmp="$(ssh -o StrictHostKeyChecking=no $user@localhost -p $port /opt/vc/bin/vcgencmd measure_temp | sed -e 's/temp=//')"
mda="$(ssh -o StrictHostKeyChecking=no $user@localhost -p $port /bin/ls -R -l /$user/media | /usr/bin/wc -l)"

echo '<html>'
echo '<head>'
echo '<title>BeatBox Report</title>'
echo '</head>'
echo '<body>'
echo '<table border="1" align="center">'
echo     '<tr>'
echo         '<td></td>'
echo         '<td>CPU Usage</td>'
echo         '<td>Disk Usage</td>'
echo         '<td>Memory Usage</td>'
echo         '<td>Temperature</td>'
echo         '<td>Media Count</td>'
echo     '</tr>'
echo     '<tr>'
echo         '<td>Client001</td>'
echo         "<td align="center">$cpu</td>"
echo         "<td align="center">$dsk</td>"
echo         "<td align="center">$mem%</td>"
echo         "<td align="center">$tmp</td>"
echo         "<td align="center">$mda</td>"
echo     '</tr>'
echo     '<tr>'
echo         '<td>Client002</td>'
echo         "<td align="center">$cpu</td>"
echo         "<td align="center">$dsk</td>"
echo         "<td align="center">$mem%</td>"
echo         "<td align="center">$tmp</td>"
echo         "<td align="center">$mda</td>"
echo     '</tr>'
echo     '<tr>'
echo         '<td>Client003</td>'
echo         "<td align="center">$cpu</td>"
echo         "<td align="center">$dsk</td>"
echo         "<td align="center">$mem%</td>"
echo         "<td align="center">$tmp</td>"
echo         "<td align="center">$mda</td>"
echo     '</tr>'
echo     '</table>'
echo '</body>'
echo '</html>'
    
por aristosv 06.04.2016 / 18:57

1 resposta

0

Sugiro refatorar seu código existente em uma função ( get_stats ) e chamar essa função de um loop while que lê cada número de porta do seu arquivo de porta (assumindo um número por linha):

#!/bin/bash

function get_stats {
    local port=$1

    local cpu="..."
    local dsk="..."
    # ... remaining assignments ...

    # Output an HTML table row for this client
    echo     '<tr>'
    echo         "<td>Client on port $port</td>"
    echo         "<td align='center'>$cpu</td>"
    # ... echo remaining vars in similar fashion ...
    echo     '</tr>'
}

# Print HTML intro
echo '<html>'
# ... more html code until end of table header ...
echo         '<td>Media Count</td>'
echo     '</tr>'

# Print statistics for each client in turn - one table row per client
portfile='ports.txt'
while read port; do
    get_stats $port
done <$portfile

# Print HTML outro
echo     '</table>'
echo '</body>'
echo '</html>'
    
por 06.04.2016 / 19:14