SSHサーバーには、リバースSSHトンネルを生成するいくつかのラズベリーパイがあります。このサーバーから任意のラズベリーパイに接続できます。このSSHサーバーで実行するbashスクリプトを作成し、すべてのラズベリーパイからいくつかの情報を収集し、htmlレポートを生成したいと思います。私はすでにラズベリーパイに接続していることをしています。すべてのラズベリーパイに接続できるように、何とかループを作成する必要があります。
何とかループをとるべき変数は$ portです。各 Raspberry Pi は SSH サーバーの固有ポートに接続されており、サーバーはそのポートから Raspberry Pi に再接続できるためです。
おそらく次のようになります...ports.txtの各$ portに対して次のコマンドを実行し、結果を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>'
答え1
既存のコードを関数(get_stats
)にリファクタリングし、while
ポートファイルから各ポート番号を読み取るループでこの関数を呼び出すことをお勧めします(1行に1つの数字であると仮定)。
#!/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>'