По умолчанию драйвер IP-протокола Linux использует оптимизацию, имеющую техническое название «модель слабой конечной системы» или «модель слабого хоста». Подробнее см. в этом вопросе.
Суть в том, что когда вы настраиваете две сетевые карты с комбинациями IP-адресов и масок сети, которые принадлежат к одному и тому же блоку пространства IP-адресов, код, отвечающий за маршрутизацию исходящих IP-адресов, будет считать, что обе эти сетевые карты подключены. к тому же физическому сегменту сети , и поэтому любой из них может использоваться для связи с любым хостом, имеющим IP-адрес в этом блоке. А затем он просто использует интерфейс, который указан первым в таблице маршрутизации для всего исходящего трафика в этот сегмент сети. В нем отсутствует концепция нескольких отдельных физических сетей, использующих копии одного и того же пространства IP-адресов.
Если в вашей системе включена фильтрация обратного пути (/proc/sys/net/ipv4/conf/*/rp_filter
), она может заблокировать проверку связи с одним из роботов, даже если вы укажете сетевой интерфейс (произнесите eth1
):, когда придет ответ через eth1
фильтр обратного пути видит, что нормальная маршрутизация к этому IP-адресу источника будет проходить через eth0
, и поэтому этот входящий пакет на eth1
должен быть поддельным. Вы можете увидеть, происходит ли это, если вы включите параметр журнал _марсиане :
.
for i in /proc/sys/net/ipv4/conf/*/log_martians; do
echo 1 > $i
done
Затем попробуйте пропинговать своих роботов, а затем проверьте конец dmesg
вывода :вы можете увидеть сообщения о потерянных пакетах.
В вашей ситуации потребуется, чтобы маршрутизация учитывала исходный IP-адрес при принятии решения о том, какую сетевую карту использовать для исходящих пакетов, и поэтому действовала в соответствии с так называемой «моделью сильной конечной системы» или «моделью сильного хоста». Что ж, Linux может сделать это, используя функциональность «расширенной маршрутизации», но она определенно не используется по умолчанию, и ее довольно сложно настроить.См. мой ответ в упомянутом выше вопросе -для рецепта конфигурации, если вы действительно хотите это сделать.
Однако, поскольку IP-адреса роботов не перекрываются, самым простым решением с точки зрения конфигурации программного обеспечения будет приобретение небольшого дешевого сетевого коммутатора (или даже концентратора )и подключения обоих роботов и одной сети. кабель от компа в него.
Или, если вам нужна простота с точки зрения минимального количества оборудования, просто настройте роботов на использование разных IP-сегментов, если вы хотите подключить их напрямую к нескольким сетевым адаптерам на одном компьютере.
Поскольку вы явно используете gawk
, вы можете использовать функцию match()
для поиска шаблона "Download:
номер Mbit/s
" и извлечения фактического значения этого шаблона, найденного в вашей строке, следующим образом:
gawk '{if (match($0,/Download: ([[:digit:]]+\.[[:digit:]]+) Mbit\/s/,a)>0) print a[1]}'
Это будет
(... )
-вложенные подгруппы -регулярного выражения в элементы массиваa
, откуда вы можете просто использовать запись 1 (, так как в регулярном выражении есть только одна такая подгруппа -).
speedtest-cli
имеет переключатель --simple
, который упрощает вывод (попробуйте speedtest-cli --help
для получения дополнительной информации):
# speedtest-cli --simple --no-upload
Ping: 18.833 ms
Download: 33.88 Mbit/s
Upload: 0.00 Mbit/s
Таким образом, мы можем получить -только скорость загрузки в виде числа:
# speedtest-cli --simple --no-upload|grep "^Download:"|cut -d" " -f2
34.92
Здесь используется --no-upload
, чтобы сэкономить немного времени, не проверяя скорость загрузки, grep
для извлечения только строки загрузки и cut
для извлечения второго поля, т. е. числа в Мбит/с.