Предел ежедневной загрузки

Я ищу способ создать ежедневный интернет-лимит для моего Ubuntu Server. Весь исходящий трафик оставляет Eth2, usb dongle, это предоплачено, и дети едят его быстро. Мне нужно разделить мою предоплаченную сумму, обычно 12 ГБ, на ежедневные выделения и остановить трафик на следующий день после достижения этой суммы. Возможно, с веб-страницей, в которой говорилось, что ежедневный лимит превышен.

Предпочтительно что-то из CLI. Это безударный зверь с единственным доступом к SSH.

VNSTAT, похоже, делает то, что мне нужно, у меня просто нет навыков написания скриптов, чтобы он управлял командой ifdown.

Спасибо.

5
задан 10 October 2017 в 13:51

3 ответа

Мое предложение - это следующий скрипт, который будет получать данные входящего и исходящего трафика с ifconfig interface-name и будет сравнивать сумму с предопределенным предельным значением. Это действие будет повторяться каждые 5 секунд (например).

Когда количество трафика (доход + результат) становится равным или превышает лимит, скрипт отключит целевой интерфейс и выйдет. Максимальное несоответствие между фактическим значением, при котором интерфейс будет отключен, и предельным значением будет равно 5s x MaxSpeed.

Сценарий может выполняться заданием Cron. Таким образом, вы сможете установить разные задания для каждого дня недели и т. Д. Кроме того, когда предел достигнут, вы можете запустить скрипт вручную с дополнительным количеством трафика.

Имя сценария должно быть [ f11], в противном случае вы должны изменить 5-ю строку. Мое предложение состоит в том, чтобы поместить его в /usr/local/bin, таким образом, он будет доступен как команда оболочки. Не забудьте сделать его исполняемым: chmod +x /usr/local/bin/traffic-watch.

Сценарий должен выполняться как root (sudo). Он создает файл журнала: /tmp/traffic-watch-interface-name.log, где вы можете проверить последнее действие. Сценарий имеет две входные переменные:

$1 = $LIMIT - значение ограничения трафика в МБ - значением по умолчанию является 400. $2 = $IFACE - имя целевого сетевого интерфейса - значением по умолчанию является eth0. Если вы хотите переопределить эти значения во время выполнения сценария, используйте следующие форматы:
traffic-watch "250" "enp0s25"
traffic-watch "250"
traffic-watch "" "enp0s25"

traffic-watch Если вы хотите запускать скрипт каждое утро в 6:30, откройте корень Crontab (sudo crontab -e) и добавьте эту строку:

30 6 * * * /usr/local/bin/traffic-watch 2>/dev/null

Используйте «трафик-часы» вручную. Чтобы запустить скрипт с правами root и направить его в фоновый режим, мы будем использовать sudo -b:

sudo -b traffic-watch "150" 2>/dev/null

Использовать «трафик-часы» вручную.

#!/bin/bash

# Initialize
[ -z "${1}" ] && LIMIT="400"  || LIMIT="$1" # Set the total traffic daily limit in MB
[ -z "${2}" ] && IFACE="eth0" || IFACE="$2" # Set the name of the target interface
LOG="/tmp/traffic-watch-$IFACE.log"         # Set the log file name
LANG=C                                      # Set envvar $LANG to `C` due to grep, awk, etc.
IPPT='[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+'       # Set IP address match pattern #IPPT='[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'

NIC="$(/sbin/ethtool -i "$IFACE" | awk 'FS=": " {print $2; exit}')" # Get the $IFACE (NIC) driver

# Function: Get the current traffic
get_traffic(){
    RX="$(/sbin/ifconfig "$IFACE" | grep -Po "RX bytes:[0-9]+" | sed 's/RX bytes://')" # Get the incoming traffic
    TX="$(/sbin/ifconfig "$IFACE" | grep -Po "TX bytes:[0-9]+" | sed 's/TX bytes://')" # Get the outgoing traffic
    XB=$(( RX + TX ))                                                            # Calculate the total traffic
    XM=$(( XB / ( 1000 * 1000 ) ))                                               # Convert the total traffic in MB
}

# Functions: Disable the interface
interface_down(){ /sbin/ifconfig "$IFACE" down 2>/dev/null && exit; }

# Function: Reset the traffic and enable the interface
reset_traffic_interface_up(){ /sbin/modprobe -r "$NIC" 2>/dev/null && /sbin/modprobe "$NIC" 2>/dev/null && /sbin/ifconfig "$IFACE" up 2>/dev/null; }

# Function: Get the IP address
get_ip(){ /sbin/ifconfig "$IFACE" 2>/dev/null | grep -Po "${IPPT}" | head -1; }

# --- The main program ---

reset_traffic_interface_up

# Wait until the IP address is obtained
until [[ "$(get_ip)" =~ ${IPPT} ]]; do sleep 1; done

# While the interface has IP address == while it is up; check if it is up on every 5 seconds (the `time` of the cycle is about 75 ms)
while [[ "$(get_ip)" =~ ${IPPT} ]]; do

    get_traffic

    # Start logging
    printf '\n%s\n\nI-face:\t%s\nDriver:\t%s\nIP:\t%s\n' "$(date)" "$IFACE" "$NIC" "$(get_ip)" > "$LOG"
    printf '\nRX:\t%s\nTX:\t%s\nXB:\t%s\nXM:\t%s\n' "$RX" "$TX" "$XB" "$XM" >> "$LOG"

    if (( XM >= LIMIT )); then
        printf '\nThe daily limit of %s MB was reached.' "$LIMIT" >> "$LOG"
        printf '  The interface %s was disabled!\n\n' "$IFACE" >> "$LOG"
        interface_down
    else
            printf '\n%s MB remains on %s.\n\n' "$(( LIMIT - XM ))" "$IFACE" >> "$LOG"
    fi

    # Debug:    cat "$LOG"

    sleep 5 ## *Adjust this value* ##

done; interface_down

Примечания:

$1 = $LIMIT - значение предела трафика в МБ - значением по умолчанию является 400. Это хорошая идея чтобы попытаться убить предыдущий экземпляр скрипта (на всякий случай его предел не достигнут) перед запуском нового:
sudo pkill traffic-watch
sudo -b traffic-watch "150" 2>/dev/null
29 6 * * * /usr/bin/pkill traffic-watch 2>/dev/null 
30 6 * * * /usr/local/bin/traffic-watch 2>/dev/null 
$2 = $IFACE - имя целевого сетевого интерфейса - по умолчанию значение eth0. Чтобы проверить оставшийся трафик удаленно, вы можете использовать эту команду:
ssh user@host.or.ip tail -n3 /tmp/traffic-watch-eth0.log
Благодаря @Dessert для этой идеи! (Замените eth0 фактическим используемым интерфейсом.) Если вы хотите переопределить эти значения во время выполнения сценария, используйте следующие форматы:
traffic-watch "250" "enp0s25"
traffic-watch "250"
traffic-watch "" "enp0s25"

Если вы хотите переопределить эти значения во время выполнения сценария, используйте эти форматы:

Сценарий доступен как репозиторий GitHub по адресу: https://github.com/pa4080/traffic-watch. Другой скрипт, основанный на текущем, который только получит трафик на определенный промежуток времени предоставляется: Как получить текущий сетевой трафик через командную строку в простом формате.

Этот сценарий можно воссоздать для работы с iptables вместо ifconfig - up/down. Это будет мощное решение.

Лучше попытаться убить предыдущий экземпляр скрипта (на всякий случай его предел не достигнут) перед запуском нового:
sudo pkill traffic-watch
sudo -b traffic-watch "150" 2>/dev/null
29 6 * * * /usr/bin/pkill traffic-watch 2>/dev/null 
30 6 * * * /usr/local/bin/traffic-watch 2>/dev/null 
выполнить скрипт, когда сетевой интерфейс вверх Чтобы проверить оставшийся трафик удаленно, вы можете использовать эту команду:
ssh user@host.or.ip tail -n3 /tmp/traffic-watch-eth0.log
Благодаря @Dessert для этой идеи! (Замените eth0 фактическим используемым интерфейсом.)
Как получить байты TX / RX без ifconfig
5
ответ дан 22 May 2018 в 17:42
  • 1
    $1=LIMIT содержит значение предела трафика в MiB , не так ли? Остальное изменится на XM=$(( XB / ( 1000 * 1000 ) )). – dessert 10 October 2017 в 20:54
  • 2
    Woot, спасибо всем – A.Adverse 11 October 2017 в 03:14
  • 3
    Для запуска команды sudo в фоновом режиме, используйте sudo -b . Кроме того, вы намеревались обрезать журнал в начале каждого цикла? – muru 11 October 2017 в 11:19
  • 4
    @muru, да, с новой записью каждые 5 секунд журнал будет быстро расти, и никто не будет читать историю этого журнала. Важная информация: сколько трафика осталось, и интерфейс отключен. sudo -b для меня ново, спасибо! – pa4080 11 October 2017 в 11:25
  • 5
    @muru, мне нужно использовать nohup с sudo -b? – pa4080 11 October 2017 в 11:41

Мое предложение - это следующий скрипт, который будет получать данные входящего и исходящего трафика с ifconfig interface-name и будет сравнивать сумму с предопределенным предельным значением. Это действие будет повторяться каждые 5 секунд (например).

Когда количество трафика (доход + результат) становится равным или превышает лимит, скрипт отключит целевой интерфейс и выйдет. Максимальное несоответствие между фактическим значением, при котором интерфейс будет отключен, и предельным значением будет равно 5s x MaxSpeed.

Сценарий может выполняться заданием Cron. Таким образом, вы сможете установить разные задания для каждого дня недели и т. Д. Кроме того, когда предел достигнут, вы можете запустить скрипт вручную с дополнительным количеством трафика.

Имя сценария должно быть traffic-watch, в противном случае вы должны изменить 5-ю строку. Мое предложение состоит в том, чтобы поместить его в /usr/local/bin, таким образом, он будет доступен как команда оболочки. Не забудьте сделать его исполняемым: chmod +x /usr/local/bin/traffic-watch.

Сценарий должен выполняться как root (sudo). Он создает файл журнала: /tmp/traffic-watch-interface-name.log, где вы можете проверить последнее действие. Сценарий имеет две входные переменные:

$1 = $LIMIT - значение ограничения трафика в МБ - значением по умолчанию является 400. $2 = $IFACE - имя целевого сетевого интерфейса - значением по умолчанию является eth0. Если вы хотите переопределить эти значения во время выполнения сценария, используйте следующие форматы: traffic-watch "250" "enp0s25" traffic-watch "250" traffic-watch "" "enp0s25"

traffic-watch Если вы хотите запускать скрипт каждое утро в 6:30, откройте корень Crontab (sudo crontab -e) и добавьте эту строку:

30 6 * * * /usr/local/bin/traffic-watch 2>/dev/null

Используйте «трафик-часы» вручную. Чтобы запустить скрипт с правами root и направить его в фоновый режим, мы будем использовать sudo -b:

sudo -b traffic-watch "150" 2>/dev/null

Использовать «трафик-часы» вручную.

#!/bin/bash # Initialize [ -z "${1}" ] && LIMIT="400" || LIMIT="$1" # Set the total traffic daily limit in MB [ -z "${2}" ] && IFACE="eth0" || IFACE="$2" # Set the name of the target interface LOG="/tmp/traffic-watch-$IFACE.log" # Set the log file name LANG=C # Set envvar $LANG to `C` due to grep, awk, etc. IPPT='[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' # Set IP address match pattern #IPPT='[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' NIC="$(/sbin/ethtool -i "$IFACE" | awk 'FS=": " {print $2; exit}')" # Get the $IFACE (NIC) driver # Function: Get the current traffic get_traffic(){ RX="$(/sbin/ifconfig "$IFACE" | grep -Po "RX bytes:[0-9]+" | sed 's/RX bytes://')" # Get the incoming traffic TX="$(/sbin/ifconfig "$IFACE" | grep -Po "TX bytes:[0-9]+" | sed 's/TX bytes://')" # Get the outgoing traffic XB=$(( RX + TX )) # Calculate the total traffic XM=$(( XB / ( 1000 * 1000 ) )) # Convert the total traffic in MB } # Functions: Disable the interface interface_down(){ /sbin/ifconfig "$IFACE" down 2>/dev/null && exit; } # Function: Reset the traffic and enable the interface reset_traffic_interface_up(){ /sbin/modprobe -r "$NIC" 2>/dev/null && /sbin/modprobe "$NIC" 2>/dev/null && /sbin/ifconfig "$IFACE" up 2>/dev/null; } # Function: Get the IP address get_ip(){ /sbin/ifconfig "$IFACE" 2>/dev/null | grep -Po "${IPPT}" | head -1; } # --- The main program --- reset_traffic_interface_up # Wait until the IP address is obtained until [[ "$(get_ip)" =~ ${IPPT} ]]; do sleep 1; done # While the interface has IP address == while it is up; check if it is up on every 5 seconds (the `time` of the cycle is about 75 ms) while [[ "$(get_ip)" =~ ${IPPT} ]]; do get_traffic # Start logging printf '\n%s\n\nI-face:\t%s\nDriver:\t%s\nIP:\t%s\n' "$(date)" "$IFACE" "$NIC" "$(get_ip)" > "$LOG" printf '\nRX:\t%s\nTX:\t%s\nXB:\t%s\nXM:\t%s\n' "$RX" "$TX" "$XB" "$XM" >> "$LOG" if (( XM >= LIMIT )); then printf '\nThe daily limit of %s MB was reached.' "$LIMIT" >> "$LOG" printf ' The interface %s was disabled!\n\n' "$IFACE" >> "$LOG" interface_down else printf '\n%s MB remains on %s.\n\n' "$(( LIMIT - XM ))" "$IFACE" >> "$LOG" fi # Debug: cat "$LOG" sleep 5 ## *Adjust this value* ## done; interface_down

Примечания:

$1 = $LIMIT - значение предела трафика в МБ - значением по умолчанию является 400. Это хорошая идея чтобы попытаться убить предыдущий экземпляр скрипта (на всякий случай его предел не достигнут) перед запуском нового: sudo pkill traffic-watch sudo -b traffic-watch "150" 2>/dev/null 29 6 * * * /usr/bin/pkill traffic-watch 2>/dev/null 30 6 * * * /usr/local/bin/traffic-watch 2>/dev/null $2 = $IFACE - имя целевого сетевого интерфейса - по умолчанию значение eth0. Чтобы проверить оставшийся трафик удаленно, вы можете использовать эту команду: ssh user@host.or.ip tail -n3 /tmp/traffic-watch-eth0.log Благодаря @Dessert для этой идеи! (Замените eth0 фактическим используемым интерфейсом.) [D9] Если вы хотите переопределить эти значения во время выполнения сценария, используйте следующие форматы: traffic-watch "250" "enp0s25" traffic-watch "250" traffic-watch "" "enp0s25"

Если вы хотите переопределить эти значения во время выполнения сценария, используйте эти форматы:

Сценарий доступен как репозиторий GitHub по адресу: https://github.com/pa4080/traffic-watch. Другой скрипт, основанный на текущем, который только получит трафик на определенный промежуток времени предоставляется: Как получить текущий сетевой трафик через командную строку в простом формате.

Этот сценарий можно воссоздать для работы с iptables вместо ifconfig - up/down. Это будет мощное решение.

Лучше попытаться убить предыдущий экземпляр скрипта (на всякий случай его предел не достигнут) перед запуском нового: sudo pkill traffic-watch sudo -b traffic-watch "150" 2>/dev/null 29 6 * * * /usr/bin/pkill traffic-watch 2>/dev/null 30 6 * * * /usr/local/bin/traffic-watch 2>/dev/null выполнить скрипт, когда сетевой интерфейс вверх Чтобы проверить оставшийся трафик удаленно, вы можете использовать эту команду: ssh user@host.or.ip tail -n3 /tmp/traffic-watch-eth0.log Благодаря @Dessert для этой идеи! (Замените eth0 фактическим используемым интерфейсом.) Как получить байты TX / RX без ifconfig
5
ответ дан 18 July 2018 в 05:31

Мое предложение - это следующий скрипт, который будет получать данные входящего и исходящего трафика с ifconfig interface-name и будет сравнивать сумму с предопределенным предельным значением. Это действие будет повторяться каждые 5 секунд (например).

Когда количество трафика (доход + результат) становится равным или превышает лимит, скрипт отключит целевой интерфейс и выйдет. Максимальное несоответствие между фактическим значением, при котором интерфейс будет отключен, и предельным значением будет равно 5s x MaxSpeed.

Сценарий может выполняться заданием Cron. Таким образом, вы сможете установить разные задания для каждого дня недели и т. Д. Кроме того, когда предел достигнут, вы можете запустить скрипт вручную с дополнительным количеством трафика.

Имя сценария должно быть traffic-watch, в противном случае вы должны изменить 5-ю строку. Мое предложение состоит в том, чтобы поместить его в /usr/local/bin, таким образом, он будет доступен как команда оболочки. Не забудьте сделать его исполняемым: chmod +x /usr/local/bin/traffic-watch.

Сценарий должен выполняться как root (sudo). Он создает файл журнала: /tmp/traffic-watch-interface-name.log, где вы можете проверить последнее действие. Сценарий имеет две входные переменные:

$1 = $LIMIT - значение ограничения трафика в МБ - значением по умолчанию является 400. $2 = $IFACE - имя целевого сетевого интерфейса - значением по умолчанию является eth0. Если вы хотите переопределить эти значения во время выполнения сценария, используйте следующие форматы: traffic-watch "250" "enp0s25" traffic-watch "250" traffic-watch "" "enp0s25"

traffic-watch Если вы хотите запускать скрипт каждое утро в 6:30, откройте корень Crontab (sudo crontab -e) и добавьте эту строку:

30 6 * * * /usr/local/bin/traffic-watch 2>/dev/null

Используйте «трафик-часы» вручную. Чтобы запустить скрипт с правами root и направить его в фоновый режим, мы будем использовать sudo -b:

sudo -b traffic-watch "150" 2>/dev/null

Использовать «трафик-часы» вручную.

#!/bin/bash # Initialize [ -z "${1}" ] && LIMIT="400" || LIMIT="$1" # Set the total traffic daily limit in MB [ -z "${2}" ] && IFACE="eth0" || IFACE="$2" # Set the name of the target interface LOG="/tmp/traffic-watch-$IFACE.log" # Set the log file name LANG=C # Set envvar $LANG to `C` due to grep, awk, etc. IPPT='[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' # Set IP address match pattern #IPPT='[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' NIC="$(/sbin/ethtool -i "$IFACE" | awk 'FS=": " {print $2; exit}')" # Get the $IFACE (NIC) driver # Function: Get the current traffic get_traffic(){ RX="$(/sbin/ifconfig "$IFACE" | grep -Po "RX bytes:[0-9]+" | sed 's/RX bytes://')" # Get the incoming traffic TX="$(/sbin/ifconfig "$IFACE" | grep -Po "TX bytes:[0-9]+" | sed 's/TX bytes://')" # Get the outgoing traffic XB=$(( RX + TX )) # Calculate the total traffic XM=$(( XB / ( 1000 * 1000 ) )) # Convert the total traffic in MB } # Functions: Disable the interface interface_down(){ /sbin/ifconfig "$IFACE" down 2>/dev/null && exit; } # Function: Reset the traffic and enable the interface reset_traffic_interface_up(){ /sbin/modprobe -r "$NIC" 2>/dev/null && /sbin/modprobe "$NIC" 2>/dev/null && /sbin/ifconfig "$IFACE" up 2>/dev/null; } # Function: Get the IP address get_ip(){ /sbin/ifconfig "$IFACE" 2>/dev/null | grep -Po "${IPPT}" | head -1; } # --- The main program --- reset_traffic_interface_up # Wait until the IP address is obtained until [[ "$(get_ip)" =~ ${IPPT} ]]; do sleep 1; done # While the interface has IP address == while it is up; check if it is up on every 5 seconds (the `time` of the cycle is about 75 ms) while [[ "$(get_ip)" =~ ${IPPT} ]]; do get_traffic # Start logging printf '\n%s\n\nI-face:\t%s\nDriver:\t%s\nIP:\t%s\n' "$(date)" "$IFACE" "$NIC" "$(get_ip)" > "$LOG" printf '\nRX:\t%s\nTX:\t%s\nXB:\t%s\nXM:\t%s\n' "$RX" "$TX" "$XB" "$XM" >> "$LOG" if (( XM >= LIMIT )); then printf '\nThe daily limit of %s MB was reached.' "$LIMIT" >> "$LOG" printf ' The interface %s was disabled!\n\n' "$IFACE" >> "$LOG" interface_down else printf '\n%s MB remains on %s.\n\n' "$(( LIMIT - XM ))" "$IFACE" >> "$LOG" fi # Debug: cat "$LOG" sleep 5 ## *Adjust this value* ## done; interface_down

Примечания:

$1 = $LIMIT - значение предела трафика в МБ - значением по умолчанию является 400. Это хорошая идея чтобы попытаться убить предыдущий экземпляр скрипта (на всякий случай его предел не достигнут) перед запуском нового: sudo pkill traffic-watch sudo -b traffic-watch "150" 2>/dev/null 29 6 * * * /usr/bin/pkill traffic-watch 2>/dev/null 30 6 * * * /usr/local/bin/traffic-watch 2>/dev/null $2 = $IFACE - имя целевого сетевого интерфейса - по умолчанию значение eth0. Чтобы проверить оставшийся трафик удаленно, вы можете использовать эту команду: ssh user@host.or.ip tail -n3 /tmp/traffic-watch-eth0.log Благодаря @Dessert для этой идеи! (Замените eth0 фактическим используемым интерфейсом.) [D9] Если вы хотите переопределить эти значения во время выполнения сценария, используйте следующие форматы: traffic-watch "250" "enp0s25" traffic-watch "250" traffic-watch "" "enp0s25"

Если вы хотите переопределить эти значения во время выполнения сценария, используйте эти форматы:

Сценарий доступен как репозиторий GitHub по адресу: https://github.com/pa4080/traffic-watch. Другой скрипт, основанный на текущем, который только получит трафик на определенный промежуток времени предоставляется: Как получить текущий сетевой трафик через командную строку в простом формате.

Этот сценарий можно воссоздать для работы с iptables вместо ifconfig - up/down. Это будет мощное решение.

Лучше попытаться убить предыдущий экземпляр скрипта (на всякий случай его предел не достигнут) перед запуском нового: sudo pkill traffic-watch sudo -b traffic-watch "150" 2>/dev/null 29 6 * * * /usr/bin/pkill traffic-watch 2>/dev/null 30 6 * * * /usr/local/bin/traffic-watch 2>/dev/null выполнить скрипт, когда сетевой интерфейс вверх Чтобы проверить оставшийся трафик удаленно, вы можете использовать эту команду: ssh user@host.or.ip tail -n3 /tmp/traffic-watch-eth0.log Благодаря @Dessert для этой идеи! (Замените eth0 фактическим используемым интерфейсом.) Как получить байты TX / RX без ifconfig
5
ответ дан 24 July 2018 в 18:21

Другие вопросы по тегам:

Похожие вопросы: