여러 컴퓨터에 연결하기 위한 루프 포트 변수

여러 컴퓨터에 연결하기 위한 루프 포트 변수

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포트 파일에서 각 포트 번호를 읽는 루프에서 이 함수를 호출하는 것이 좋습니다(한 줄에 하나의 숫자라고 가정).

#!/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>'

관련 정보