您知道捕获服务器主接口的网卡速度的单行命令吗?
例如,对于eth0
- 使用获取主机名
uname -n
- 使用获取其IP
nslookup `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)"