帮助测试 `/sys/class/net/` 中的特殊文件

帮助测试 `/sys/class/net/` 中的特殊文件

背景

我正在管理蜂窝接口。我有一个bash正在测试接口的脚本。有问题的是该文件/sys/class/net/wwan1/carrier位于wwan1未配置的界面。

这显然是一个特殊文件,但我不确定如何在 bash 脚本中正确测试它。见下文...

考虑以下:

file /sys/class/net/wwan0/carrier # a good interface
/sys/class/net/wwan0/carrier: ASCII text

file /sys/class/net/wwan1/carrier # an unconfigured interface
/sys/class/net/wwan1/carrier: ERROR: cannot read `/sys/class/net/wwan1/carrier' (Invalid argument)

一些cat数据:

$ cat /sys/class/net/wwan0/carrier # good interface
1

$ cat /sys/class/net/wwan1/carrier # unconfigured
cat: /sys/class/net/wwan1/carrier: Invalid argument

这个错误cat就是问题所在。

然而,位于以下位置的文件/sys/class/net/wwan1/carrier被报告ls

$ cd /sys/class/net/wwan1
$ ls -al
total 0
drwxr-xr-x 4 root root    0 Dec 27 17:36 .
drwxr-xr-x 3 root root    0 Dec 27 17:36 ..
-r--r--r-- 1 root root 4096 Dec 28 20:24 addr_assign_type
-r--r--r-- 1 root root 4096 Dec 28 20:24 address
-r--r--r-- 1 root root 4096 Dec 28 20:24 addr_len
-r--r--r-- 1 root root 4096 Dec 28 20:24 broadcast
-r--r--r-- 1 root root 4096 Dec 28 18:57 carrier
lrwxrwxrwx 1 root root    0 Dec 28 20:24 device -> ../../../1-1:1.10
-r--r--r-- 1 root root 4096 Dec 28 20:24 dev_id
-r--r--r-- 1 root root 4096 Dec 28 20:24 dormant
-r--r--r-- 1 root root 4096 Dec 28 20:24 duplex
-rw-r--r-- 1 root root 4096 Dec 28 20:24 flags
-rw-r--r-- 1 root root 4096 Dec 28 20:24 ifalias
-r--r--r-- 1 root root 4096 Dec 28 20:24 ifindex
-r--r--r-- 1 root root 4096 Dec 28 20:24 iflink
-r--r--r-- 1 root root 4096 Dec 28 20:24 link_mode
-rw-r--r-- 1 root root 4096 Dec 28 20:24 mtu
-rw-r--r-- 1 root root 4096 Dec 28 20:24 netdev_group
-r--r--r-- 1 root root 4096 Dec 28 18:57 operstate
drwxr-xr-x 2 root root    0 Dec 28 20:24 power
-r--r--r-- 1 root root 4096 Dec 28 20:24 speed
drwxr-xr-x 2 root root    0 Dec 28 20:24 statistics
lrwxrwxrwx 1 root root    0 Dec 27 17:36 subsystem -> ../../../../../../../../../../class/net
-rw-r--r-- 1 root root 4096 Dec 28 20:24 tx_queue_len
-r--r--r-- 1 root root 4096 Dec 28 20:24 type
-rw-r--r-- 1 root root 4096 Dec 27 17:36 uevent

问题

我正在 bash 脚本中测试各种可能的接口配置和问题。其中之一是接口未配置。我正在探索,/sys因为我发现ifconfig和的输出ip不可靠。

我的问题

/sys/class/net/wwan1/carrier如何在语句中测试文件的值bash if(文件本身不可读但存在,即这是一个未配置的界面?这是我尝试过的:

if [[ -e "/sys/class/net/wwan1/carrier" ]]; then
    echo "Good"
else
    echo "Bad"
fi

我还使用了所有测试,-b, -c, -f所有这些测试都无法区分该文件的“可读”状态/sys/class/net/wwan1/:“坏”文件和/sys/class/net/wwan0/“好”文件。

编辑

-r和测试-s在两种情况下都报告良好,这是一个问题,因为cat在第一种情况下会失败。

编辑stat输出

$ stat /sys/class/net/wwan0/carrier
  File: `/sys/class/net/wwan0/carrier'
  Size: 4096            Blocks: 0          IO Block: 4096   regular file
Device: fh/15d  Inode: 5657        Links: 1
Access: (0444/-r--r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2015-12-28 17:01:06.976418548 +0000
Modify: 2015-12-28 17:01:06.976418548 +0000
Change: 2015-12-28 17:01:06.976418548 +0000
 Birth: -

$ stat /sys/class/net/wwan1/carrier
  File: `/sys/class/net/wwan1/carrier'
  Size: 4096            Blocks: 0          IO Block: 4096   regular file
Device: fh/15d  Inode: 6181        Links: 1
Access: (0444/-r--r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2015-12-28 18:57:37.876419704 +0000
Modify: 2015-12-28 18:57:37.876419704 +0000
Change: 2015-12-28 18:57:37.876419704 +0000
 Birth: -

答案1

我已经尝试过我的 WiFi 接口,它也有carrier伪文件:/sys/class/net/wlan0/carrier。 (注意:我曾经用来nmtui启用/禁用无线网络)。

似乎有三种状态:

  • ./carrier不可读(例如,当网络管理器中禁用该接口时)。
  • ./carrier包含“1”(当接口激活且连接到 WiFi 网络时)
  • ./carrier包含“0”(当接口被激活并且它是不是连接到 WiFi 网络)

  if ! cat /sys/class/net/wlan0/carrier > /dev/null; then
    echo "Not connected to any network"
  elif [ "$(head -c1 /sys/class/net/wlan0/carrier)" -eq 1 ]; then
    echo "Connected to a wireless network"
  elif [ "$(head -c1 /sys/class/net/wlan0/carrier)" -eq 0 ]; then
    echo "Not connected to a wireless network"
  else
    echo "Unknown/Unhandled state"
  fi

相关内容