我正在尝试创建一个bash脚本,该脚本在我的PC而非无线网卡上创建一系列以太网设备名称。我想要一个名称列表,以便以后可以迭代它们。
例如-假设我有两个以太网NIC-enp2s0和enp3s0和一个无线卡-wlp4s0
从lscpi
中我会看到
02:00.0 Ethernet controller: <truncated>
03:00.0 Ethernet controller: <truncated>
04:00.0 Network controller: Intel Corporation Wireless
类似ip a
显示
1: lo: <truncated>
2: enp2s0: <truncated>
3: enp3s0: <truncated>
4: wlp4s0: <truncated>
如何创建名称数组,以便可以迭代它们?
enp2s0
enp3s0
我已经弄清楚了如何使用查找第一个NIC
NIC=$(basename $(udevadm info -e | grep "DEVPATH=.*$(lspci | grep -m 1 Ethernet | cut -f 1 -d\ )/net" | cut -f 2 -d\ ))
但是我不知道如何循环这种方法。有什么建议可以在bash中实现吗?
谢谢
Densha
答案 0 :(得分:2)
nmcli
的输出可以轻松解析,但是您可能必须先安装它。
nmcli device
的示例输出:
DEVICE TYPE STATE CONNECTION
eno1 ethernet connected wired connection
wlp2s0 wifi unavailable --
lo loopback unmanaged --
要仅提取以太网设备的名称,请使用
nmcli device | awk '$2=="ethernet" {print $1}'
在此示例中,输出将为eno1
。您可以像往常一样在循环中使用该命令:
for device in $(nmcli device | awk '$2=="ethernet" {print $1}'); do
# stuff
done
答案 1 :(得分:0)
for f in $(ip a | grep enp | awk '{print $2}' | cut -d":" -f1)
do
<something with $f>
done
对于不是以“ enp”开头的设备,可以选择以下方法:
for f in $(ip a | grep -B1 "ether" | grep -v ether | awk '{print $2}' | cut -d":" -f1)
do
<something with $f>
done
答案 2 :(得分:0)
感谢我将原件修改为
的建议for DEV in $(lspci | grep Ethernet | cut -f 1 -d\ )
do
NIC=$(basename $(udevadm info -e | grep "DEVPATH=.*$DEV/net" | cut -f 2 -d\ ))
echo $NIC
done
感谢您的建议
答案 3 :(得分:0)
最近的Linux发行版使用 iproute2 套件来管理网络。
列出设备的基本命令是ip link show
,可以缩写为ip l
。
ip l | sed 's/^ *[0-9]\+: \([^ ]\+\):.*/\1/p;d'
可能会返回:
lo
eth0
ip l
的典型输出(可以写成:ip links show
)如下:
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000 link/ether b8:27:eb:5f:b0:eb brd ff:ff:ff:ff:ff:ff
sed
命令将
s///
)*
)开头的行[0-9]\+:
)\([^ ]\+\)
)的格式/\1/
)匹配p
);d
要对$iface
进行循环操作,您可以编写:
shopt -s extglob
while IFS=$' :\t\r\n' read num iface line;do
if [ "$num" ] && [ -z "${num//*([0-9])}" ] && [ "$iface" ] ;then
echo Doing something with $iface
fi
done < <(ip l)
...
Doing something with lo
Doing something with eth0
此小循环将为每个接口的每个IPv4地址打印1行。 (未使用或未配置的界面将不会显示):
while IFS=$' :\t\r\n' read p1 p2 line ;do
[ "$p1" ] && {
[ -z "${p1//*([0-9])}" ] && [ "$p2" ] && crtif=$p2
if [ -z "${p1/inet}" ] ;then
echo Doing something with $crtif having ip $p2
fi
}
done < <(ip a)
Doing something with lo having ip 127.0.0.1/8
Doing something with eth0 having ip 192.168.1.35/24