在 bash 中获取当前网络速度

在 bash 中获取当前网络速度

有没有一种方法可以在 bash 脚本中获取当前网络速度(就像我可以使用“nload”获取一样)?我只需将脚本运行时的速度放入变量中即可。例如:“./script.sh”将输出“In:50Ko/s | Out:25Ko/s”。

谢谢 :)

答案1

cat /proc/net/dev显示每个接口已传输了多少字节。

您可以取一些样本并计算当前每秒的千字节数吗?

这是我找到并稍加修改的脚本交通信息将其复制到你的小路并将权限更改为 755chmod 755 traffic.sh

用法是

traffic.sh eth0

打印出来

 Transmitted: 5352K
 Received: 13M
 Total: 19M
 Sleeping 3 to calculate speed...
 Current speed: 690B/s

答案2

下面是一个适用于大多数嵌入式 Linux 路由器(如 Ubiquiti 和 OpenWRT 兼容路由器)的脚本,它可以从 /proc/net/dev 获取其详细信息。

(并且易于更改为数据包等)

#!/bin/sh

SLP=1 # output / sleep interval
DEVICE=$1
IS_GOOD=0
for GOOD_DEVICE in `grep \: /proc/net/dev | awk -F: '{print $1}'`; do
    if [ "$DEVICE" = $GOOD_DEVICE ]; then
        IS_GOOD=1
        break
    fi
done

if [ $IS_GOOD -eq 0 ]; then
    echo "Device not found. Should be one of these:"
        grep ":" /proc/net/dev | awk -F: '{print $1}' | sed s@\ @@g 
    exit 1
fi

while true; do

LINE=`grep $1 /proc/net/dev | sed s/.*://`;
RECEIVED1=`echo $LINE | awk '{print $1}'`
TRANSMITTED1=`echo $LINE | awk '{print $9}'`
TOTAL=$(($RECEIVED1+$TRANSMITTED1))

sleep $SLP

LINE=`grep $1 /proc/net/dev | sed s/.*://`;
RECEIVED2=`echo $LINE | awk '{print $1}'`
TRANSMITTED2=`echo $LINE | awk '{print $9}'`
SPEED=$((($RECEIVED2+$TRANSMITTED2-$TOTAL)/$SLP))
INSPEED=$((($RECEIVED2-$RECEIVED1)/$SLP))
OUTSPEED=$((($TRANSMITTED2-$TRANSMITTED1)/$SLP))

printf "In: %12i KB/s | Out: %12i KB/s | Total: %12i KB/s\n" $(($INSPEED/1024)) $(($OUTSPEED/1024)) $((($INSPEED+$OUTSPEED)/1024)) ;

done;

将以上内容复制到剪贴板,然后在路由器的终端会话中执行以下操作:

$ cat > /tmp/n.sh

然后:Ctrl+V(或右键单击/粘贴)

然后:Ctrl+D

$ chmod +x /tmp/n.sh

$ /tmp/n.sh eth0

您也可以将其粘贴到记事本中,然后如果需要编辑,只需重复上述操作即可 - 并非所有嵌入式路由器都有编辑器!确保复制从顶部的 # 到底部的 done; 的所有内容。

您可能需要将 /bin/bash 更改为 /bin/sh 或反之亦然。这里还有另一个使用 /sys 的示例:如何在 Linux 中获取特定端口或应用程序进程 ID 的 KB/MB/Bytes 格式的实时网络统计信息?

来源:https://gist.github.com/dagelf/ab2bad26ce96fa8d79b0834cd8cab549

相关内容