Ven*_*nom 3 linux command-line shell-script
你知道一个单行命令来捕获服务器主接口的网卡速度吗?
例如,对于 eth0
uname -nnslookup `uname -n`ifconfig输出中搜索 IP以了解它配置在哪个接口上ethtool <interface captured in above command> | grep -i speed以上所有命令都可以在单个命令中执行吗?
尝试:
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 的语法与 Bournerc和fish系列的shell 兼容,但不兼容(t)csh.