I've written a script in the bash to connect to servers via SSH and check their traffic. If the traffic significantly decreases, the script will send an email to the address specified in the program.
#!/bin/bash # Variables server_ip="IP address" # Replace with your server's IP address username="ubuntu" # Replace with your SSH username # Function to fetch and calculate traffic data calculate_traffic() { echo "Connecting to $server_ip to fetch traffic data..." # Running vnstat command and saving output output=$(ssh -o StrictHostKeyChecking=no "${username}@${server_ip}" vnstat -d --json) # echo "$output" if [[ $? -ne 0 ]]; then echo "Failed to connect to $server_ip or vnstat is not installed." return fi # Extract daily traffic data # traffic_data=($(echo "$output" | jq -r '.interfaces[0].traffic | map(.day.rx + .day.tx) | .[]')) traffic_data=($(echo "$output" | jq -r '.interfaces[0].day[] | "(.rx + .tx) bytes"')) echo "$traffic_data" #traffic_data=($(echo "$output" | jq '.interfaces[].day[] | {date: .date, rx: .rx, tx: .tx}' data.json)) # Validate that we have enough data if [[ ${#traffic_data[@]} -lt 10 ]]; then echo "Not enough data available for the past 10 days." return fi # Calculate new_traffic (average of the last 5 days) new_traffic=0 for i in {0..4}; do new_traffic=$(echo "$new_traffic + ${traffic_data[$i]}" | bc) done new_traffic=$(echo "$new_traffic / 5" | bc -l) # Calculate old_traffic (average of days 6-10) old_traffic=0 for i in {5..9}; do old_traffic=$(echo "$old_traffic + ${traffic_data[$i]}" | bc) done old_traffic=$(echo "$old_traffic / 5" | bc -l) echo "Average traffic in the last 5 days: $new_traffic MB" echo "Average traffic in the 5 to 10 days ago: $old_traffic MB" # Optionally, compare or take action based on traffic }# Run the function to calculate traffic
The SSH connection works fine, but the following code leads to an error.
jq: error (at <stdin>:1): Cannot iterate over null (null)Not enough data available for the past 10 days.
The output is not empty. This is the result after running vnstat -d on the server.
and this is the output when I put the line
echo "$traffic_data"
after output variable in the code
{"vnstatversion":"2.12","jsonversion":"2","interfaces":[{"name":"eth0","alias":"","created":{"date":{"year":2024,"month":10,"day":13},"timestamp":1728801752},"updated":{"date":{"year":2024,"month":10,"day":13},"time":{"hour":9,"minute":35},"timestamp":1728812100},"traffic":{"total":{"rx":1301247,"tx":1443456},"fiveminute":[{"id":2,"date":{"year":2024,"month":10,"day":13},"time":{"hour":6,"minute":40},"timestamp":1728801600,"rx":35241,"tx":53433},{"id":1,"date":{"year":2024,"month":10,"day":13},"time":{"hour":6,"minute":45},"timestamp":1728801900,"rx":5604,"tx":4450},{"id":3,"date":{"year":2024,"month":10,"day":13},"time":{"hour":6,"minute":50},"timestamp":1728802200,"rx":5737,"tx":4531},{"id":4,"date":{"year":2024,"month":10,"day":13},"time":{"hour":6,"minute":55},"timestamp":1728802500,"rx":44158,"tx":45048},{"id":5,"date":{"year":2024,"month":10,"day":13},"time":{"hour":7,"minute":0},"timestamp":1728802800,"rx":8273,"tx":7747},{"id":6,"date":{"year":2024,"month":10,"day":13},"time":{"hour":7,"minute":5},"timestamp":1728803100,"rx":5234,"tx":4260},{"id":7,"date":{"year":2024,"month":10,"day":13},"time":{"hour":7,"minute":10},"timestamp":1728803400,"rx":10659,"tx":8577},{"id":8,"date":{"year":2024,"month":10,"day":13},"time":{"hour":7,"minute":15},"timestamp":1728803700,"rx":63903,"tx":55183},{"id":9,"date":{"year":2024,"month":10,"day":13},"time":{"hour":7,"minute":20},"timestamp":1728804000,"rx":67698,"tx":61890},{"id":10,"date":{"year":2024,"month":10,"day":13},"time":{"hour":7,"minute":25},"timestamp":1728804300,"rx":9286,"tx":8401},{"id":11,"date":{"year":2024,"month":10,"day":13},"time":{"hour":7,"minute":30},"timestamp":1728804600,"rx":5533,"tx":4165},{"id":12,"date":{"year":2024,"month":10,"day":13},"time":{"hour":7,"minute":35},"timestamp":1728804900,"rx":7187,"tx":6073},{"id":13,"date":{"year":2024,"month":10,"day":13},"time":{"hour":7,"minute":40},"timestamp":1728805200,"rx":10659,"tx":10097},{"id":14,"date":{"year":2024,"month":10,"day":13},"time":{"hour":7,"minute":45},"timestamp":1728805500,"rx":8103,"tx":7595},{"id":15,"date":{"year":2024,"month":10,"day":13},"time":{"hour":7,"minute":50},"timestamp":1728805800,"rx":10720,"tx":12586},{"id":16,"date":{"year":2024,"month":10,"day":13},"time":{"hour":7,"minute":55},"timestamp":1728806100,"rx":4151,"tx":3119},{"id":17,"date":{"year":2024,"month":10,"day":13},"time":{"hour":8,"minute":0},"timestamp":1728806400,"rx":4650,"tx":4004},{"id":18,"date":{"year":2024,"month":10,"day":13},"time":{"hour":8,"minute":5},"timestamp":1728806700,"rx":7248,"tx":6828},{"id":19,"date":{"year":2024,"month":10,"day":13},"time":{"hour":8,"minute":10},"timestamp":1728807000,"rx":9530,"tx":7368},{"id":20,"date":{"year":2024,"month":10,"day":13},"time":{"hour":8,"minute":15},"timestamp":1728807300,"rx":6675,"tx":6095},{"id":21,"date":{"year":2024,"month":10,"day":13},"time":{"hour":8,"minute":20},"timestamp":1728807600,"rx":4623,"tx":3447},{"id":22,"date":{"year":2024,"month":10,"day":13},"time":{"hour":8,"minute":25},"timestamp":1728807900,"rx":10352,"tx":9920},{"id":23,"date":{"year":2024,"month":10,"day":13},"time":{"hour":8,"minute":30},"timestamp":1728808200,"rx":8638,"tx":7432},{"id":24,"date":{"year":2024,"month":10,"day":13},"time":{"hour":8,"minute":35},"timestamp":1728808500,"rx":6395,"tx":6085},{"id":25,"date":{"year":2024,"month":10,"day":13},"time":{"hour":8,"minute":40},"timestamp":1728808800,"rx":100639,"tx":118300},{"id":26,"date":{"year":2024,"month":10,"day":13},"time":{"hour":8,"minute":45},"timestamp":1728809100,"rx":100824,"tx":133866},{"id":27,"date":{"year":2024,"month":10,"day":13},"time":{"hour":8,"minute":50},"timestamp":1728809400,"rx":123621,"tx":162497},{"id":28,"date":{"year":2024,"month":10,"day":13},"time":{"hour":8,"minute":55},"timestamp":1728809700,"rx":105350,"tx":127156},{"id":29,"date":{"year":2024,"month":10,"day":13},"time":{"hour":9,"minute":0},"timestamp":1728810000,"rx":53538,"tx":58412},{"id":30,"date":{"year":2024,"month":10,"day":13},"time":{"hour":9,"minute":5},"timestamp":1728810300,"rx":87424,"tx":101574},{"id":31,"date":{"year":2024,"month":10,"day":13},"time":{"hour":9,"minute":10},"timestamp":1728810600,"rx":58102,"tx":61288},{"id":32,"date":{"year":2024,"month":10,"day":13},"time":{"hour":9,"minute":15},"timestamp":1728810900,"rx":53089,"tx":58081},{"id":33,"date":{"year":2024,"month":10,"day":13},"time":{"hour":9,"minute":20},"timestamp":1728811200,"rx":82041,"tx":83978},{"id":34,"date":{"year":2024,"month":10,"day":13},"time":{"hour":9,"minute":25},"timestamp":1728811500,"rx":114346,"tx":120850},{"id":35,"date":{"year":2024,"month":10,"day":13},"time":{"hour":9,"minute":30},"timestamp":1728811800,"rx":62016,"tx":69120}],"hour":[{"id":1,"date":{"year":2024,"month":10,"day":13},"time":{"hour":6,"minute":0},"timestamp":1728799200,"rx":90740,"tx":107462},{"id":2,"date":{"year":2024,"month":10,"day":13},"time":{"hour":7,"minute":0},"timestamp":1728802800,"rx":211406,"tx":189693},{"id":3,"date":{"year":2024,"month":10,"day":13},"time":{"hour":8,"minute":0},"timestamp":1728806400,"rx":488545,"tx":592998},{"id":4,"date":{"year":2024,"month":10,"day":13},"time":{"hour":9,"minute":0},"timestamp":1728810000,"rx":510556,"tx":553303}],"day":[{"id":1,"date":{"year":2024,"month":10,"day":13},"timestamp":1728777600,"rx":1301247,"tx":1443456}],"month":[{"id":1,"date":{"year":2024,"month":10},"timestamp":1727740800,"rx":1301247,"tx":1443456}],"year":[{"id":1,"date":{"year":2024},"timestamp":1704067200,"rx":1301247,"tx":1443456}],"top":[{"id":1,"date":{"year":2024,"month":10,"day":13},"timestamp":1728777600,"rx":1301247,"tx":1443456}]}}]}