使用单个命令查找网卡速度

使用单个命令查找网卡速度

您知道捕获服务器主接口的网卡速度的单行命令吗?

例如,对于eth0

  • 使用获取主机名uname -n
  • 使用获取其IPnslookup `uname -n`
  • 搜索 IP 在ifconfig以了解其配置在哪个接口上
  • 使用ethtool <interface captured in above command> | grep -i speed

以上所有命令可以在单个命令中执行吗?

答案1

尝试:

cat /sys/class/net/eth0/speed

我不确定你所说的主界面是什么意思。在具有 IPv4 堆栈的主机上,您可以检索第一个默认路由所在的接口:

ip route show 0/0 | grep -Pom1 'dev +\K[^ ]+'

(假设 GNU grep)。所以:

cat "/sys/class/net/$(ip route show 0/0 | grep -Pom1 'dev +\K[^ ]+')/speed"

并非所有 IPv4 连接的主机都有默认路由。您可能更喜欢通过一个接口来访问特定主机,例如已知的互联网接口,例如 8.8.8.8,或者因为您正在通过 运行这些命令ssh,所以我们看到连接来自的 IP 地址ssh(假设您通过 IPv4 连接)而不是 IPv6):

ip route show to match "${SSH_CLIENT%% *}" | grep -Pom1 'dev +\K[^ ]+'

当然,如果该接口不是以太网接口(通常有一个例如,服务器上的接口)。

作为一种不同的启发式方法,您可以获得已启动的非虚拟接口的名称,该接口确实有一个速度并且传输了最大数量的数据包,如下所示:

readlink -f /sys/class/net/* | awk -F / '
   $4 != "virtual" && \
     getline speed < ($0 "/speed") && \
     getline state < ($0 "/operstate") && \
     state == "up" && \
     getline tx < ($0 "/statistics/tx_packets") {
       if (tx > max) {returned_speed=speed; max=tx}
     }
   END{print returned_speed}'

最后,关于您要求单个命令的评论:请sh注意ssh用于。所以它在远程机器上运行的代码就是shell代码。您可以在那里运行多个命令和多行脚本。但要记住的是,代码是由远程用户的登录 shell 解释的,这不能保证与 Bourne 类似(尽管现在在基于 Linux 的系统上实际上通常是这样)。所以你可以这样做:

remote_code=$(cat << \end_of_script
  readlink -f /sys/class/net/* | awk -F / '
     $4 != "virtual" && \
       getline speed < ($0 "/speed") && \
       getline state < ($0 "/operstate") && \
       state == "up" && \
       getline tx < ($0 "/statistics/tx_packets") {
         if (tx > max) {returned_speed=speed; max=tx}
       }
     END{print returned_speed}'
end_of_script
)

for host in host1 host2 host3; do
  speed=$(ssh "$host" "$remote_code")
  printf '%20s: %s\n' "$host" "$speed"
done

rc上面的 Remote_code 的语法与 Bourne和系列的 shell 兼容fish,但与(t)csh.

答案2

在 RHEL7 上:
echo "$(uname -n):$(ethtool $(ip link|awk '$2 != "idrac:" && $8 == "state" && $9 == "UP" {gsub(":","");print $2}'|head -1) | grep Speed)"

相关内容