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

Ven*_*nom 3 linux command-line shell-script

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

例如,对于 eth0

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

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

Sté*_*las 8

尝试:

cat /sys/class/net/eth0/speed
Run Code Online (Sandbox Code Playgroud)

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

ip route show 0/0 | grep -Pom1 'dev +\K[^ ]+'
Run Code Online (Sandbox Code Playgroud)

(假设 GNU grep)。所以:

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

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

ip route show to match "${SSH_CLIENT%% *}" | grep -Pom1 'dev +\K[^ ]+'
Run Code Online (Sandbox Code Playgroud)

当然,如果该接口不是以太网接口(例如,在服务器上有一个桥接接口是很常见的),那这将不起作用。

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

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}'
Run Code Online (Sandbox Code Playgroud)

最后,对您要求单个命令的评论:注意shinssh是针对shell 的。所以它在远程机器上运行的代码是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
Run Code Online (Sandbox Code Playgroud)

上面那个 remote_code 的语法与 Bournercfish系列的shell 兼容,但不兼容(t)csh.

  • @Venom,我有一个带有多个接口的服务器。没有默认路由。所有这些都是服务器的有效地址。我们应该如何定义哪个是“主要的”? (2认同)