Переменная длины в файле netcdf

Вы можете использовать nc для проверки почтового сервера SMTP следующим образом:

$ nc -w 5 mail.mydom.com 25 << EOF
HELO mail.mydom.com
QUIT
EOF

ПРИМЕЧАНИЕ: Опции -w 5 указывают nc ждать не более 5 секунд. Сервер для мониторинга - mail.mydom.com, а 25 - порт, к которому мы подключаемся.

Вы также можете использовать эту форму, если у вашего сервера возникли проблемы с HELO:

$ echo "QUIT" | nc -w 5 mail.mydom.com 25

ПРИМЕЧАНИЕ: Эта форма хорошо работает как с Postfix, так и с Sendmail!

Пример

Здесь я подключаюсь к своему почтовому серверу.

$ echo "QUIT" | nc -w 5 mail.bubba.net 25
220 bubba.net ESMTP Sendmail 8.14.3/8.14.3; Sat, 19 Apr 2014 16:31:44 -0400
221 2.0.0 bubba.net closing connection
$

Если проверить статус, возвращаемый этой операцией:

$ echo $?
0

Однако если ничто на другом конце не принимает наше соединение:

$ echo QUIT | nc -w5 localhost 25
Ncat: Connection refused.
$

Проверяем статус, возвращаемый этой операцией:

$ echo $?
1

Собираем все вместе

Вот моя версия скрипта под названием mail_chkr.bash.

#!/bin/bash

echo "Checking Mail Server #1"
echo "QUIT" | nc -w 5 mail.bubba.net 25 > /dev/null 2>&1

if [ $? == 0 ]; then
  echo "mail server #1 is UP"
else
  echo "mail server #1 is DOWN"
fi

echo "Checking Mail Server #2"
echo "QUIT" | nc -w 5 localhost 25 > /dev/null 2>&1

if [ $? == 0 ]; then
  echo "mail server #2 is UP"
else
  echo "mail server #2 is DOWN"
fi

Запуск:

$ ./mail_chkr.bash 
Checking Mail Server #1
mail server #1 is UP
Checking Mail Server #2
Ncat: Connection refused.
mail server #2 is DOWN
5
24.03.2019, 15:47
1 ответ

Интерфейс в данный момент времени принадлежит одному сетевому пространству имен и только одному. Начальное )сетевое пространство имен init (, за исключением наследования физических интерфейсов уничтоженных сетевых пространств имен, не имеет особых возможностей над другими сетевыми пространствами имен :, оно не может напрямую видеть их интерфейсы. Пока вы все еще находитесь в пространствах имен pid и mount init, вы все равно можете найти сетевые пространства имен, используя различную информацию, доступную из /proc, и, наконец, отобразить их интерфейсы, введя эти сетевые пространства имен.

Я приведу примеры в оболочке.

  • перечислить сетевые пространства имен

    Для этого вам нужно знать, как эти пространства имен существуют :, пока ресурс поддерживает их. Ресурсом здесь может быть процесс (, фактически поток процесса ), точка монтирования или дескриптор открытого файла (fd ). Все эти ресурсы упоминаются в /proc/и указывают на абстрактный псевдо-файл -в файловой системе nsfsпсевдо--, перечисляющий все пространства имен. Единственной значимой информацией этого файла является его индексный дескриптор, представляющий сетевое пространство имен, но с индексным дескриптором нельзя манипулировать в одиночку, это должен быть файл. Вот почему позже мы не можем просто сохранить только значение индекса (, заданное stat -c %i /proc/some/file):, мы сохраним индекс, чтобы иметь возможность удалять дубликаты и имя файла, чтобы по-прежнему иметь полезную ссылку дляnsenterпозже.

    • процесс (собственно поток)

      Самый распространенный случай :для обычных контейнеров. Сетевое пространство имен каждого потока можно узнать по ссылке/proc/pid/ns/net:только statи перечислить все уникальные пространства имен. 2>/dev/nullдолжен спрятаться, когда statбольше не может найти эфемерные процессы.

      find /proc/ -mindepth 1 -maxdepth 1 -name '[1-9]*' | while read -r procpid; do
              stat -L -c '%20i %n' $procpid/ns/net
      done 2>/dev/null
      

      Это можно сделать быстрее с помощью специализированной команды lsns, которая работает с пространствами имен,но, похоже, обрабатывает только процессы (, а не точки монтирования и не открывает fd, как показано позже):

      lsns -n -u -t net -o NS,PATH
      

      (, который позже нужно будет переформатировать какlsns -n -u -t net -o NS,PATH | while read inode path; do printf '%20u %s\n' $inode "$path"; done)

    • точка монтирования

      Они в основном используются командой ip netns add, которая создает постоянные сетевые пространства имен, монтируя их, что позволяет избежать их исчезновения, когда нет процесса или ресурса fd, поддерживающих их, а затем также позволяет, например, запустить маршрутизатор, брандмауэр или мост в сетевом пространстве имен без какого-либо связанного процесса.

      Смонтированные пространства имен (обработка пространств имен монтирования и, возможно, pid, вероятно, более сложна, но нас в любом случае интересуют только сетевые пространства имен )выглядят как любая другая точка монтирования в /proc/mounts, с типом файловой системы nsfs. В оболочке нет простого способа отличить сетевое пространство имен от пространства имен другого типа, но поскольку два псевдофайла -из одной и той же файловой системы (здесьnsfs)не будут совместно использовать один и тот же индексный дескриптор, просто выберите их все и игнорировать ошибки позже на шаге интерфейса при попытке использовать ссылку на сетевое пространство имен, отличное от -, в качестве сетевого пространства имен. Извините, ниже я не буду правильно обрабатывать точки монтирования со специальными символами в них, включая пробелы, потому что они уже экранированы в выводе /proc/mounts(это было бы проще на любом другом языке ), поэтому я выиграл не утруждайте себя использованием строк с нулевым завершением.

      awk '$3 == "nsfs" { print $2 }' /proc/mounts | while read -r mount; do
              stat -c '%20i %n' "$mount"
      done
      
    • дескриптор открытого файла

      Вероятно, они встречаются даже реже, чем точки монтирования, за исключением временных моментов при создании пространства имен, но могут удерживаться и использоваться некоторыми специализированными приложениями, обрабатывающими несколько пространств имен, включая, возможно, некоторые технологии контейнеризации.

      Я не мог придумать лучшего метода, чем искать все fd, доступные в каждом /proc/pid/fd/, используя stat для проверки того, что он указывает на пространство имен nsfsи снова не заботясь о том, действительно ли это сетевое пространство имен. Я уверен, что есть более оптимизированный цикл,но этот, по крайней мере, не будет бродить повсюду и не будет принимать никаких максимальных ограничений процесса.

      find /proc/ -mindepth 1 -maxdepth 1 -name '[1-9]*' | while read -r procpid; do
              find $procpid/fd -mindepth 1 | while read -r procfd; do
                      if [ "$(stat -f -c %T $procfd)" = nsfs ]; then
                              stat -L -c '%20i %n' $procfd 
                      fi
              done
      done 2>/dev/null
      

    Теперь удалите все повторяющиеся ссылки на сетевые пространства имен из предыдущих результатов. Например, используя этот фильтр для комбинированного вывода 3 предыдущих результатов (, особенно из части дескриптора открытого файла):

    sort -k 1n | uniq -w 20
    
  • в каждом пространстве имен перечислить интерфейсы

    Теперь у нас есть ссылки на все существующие сетевые пространства имен (, а также на некоторые не -сетевые пространства имен, которые мы просто проигнорируем ). Просто введите каждое из них, используя ссылку, и отобразите интерфейсы.

    Возьмите выходные данные предыдущих команд в качестве входных данных для этого цикла для перечисления интерфейсов (и, согласно вопросу OP, выберите отображение их адресов ), игнорируя при этом ошибки, вызванные не -сетевыми именами, как объяснялось ранее:

    while read -r inode reference; do
        if nsenter --net="$reference" ip -br address show 2>/dev/null; then
                printf 'end of network %d\n\n' $inode
        fi
    done
    

Индекс сети инициализации может быть напечатан с pid 1 в качестве ссылки:

echo -n 'INIT NETWORK: ' ; stat -L -c %i /proc/1/ns/net

Пример (реальный, но отредактированный )вывод с работающим контейнером LXC, пустое «подключенное» сетевое пространство имен, созданное с ip netns add...неподключенным мостовым интерфейсом, сетевое пространство имен с другим dummy0интерфейсом, сохраненное живым процессом , не в этом сетевом пространстве имен, но сохраняющим в нем открытый fd, созданный с помощью:

unshare --net sh -c 'ip link add dummy0 type dummy; ip address add dev dummy0 10.11.12.13/24; sleep 3' & sleep 1; sleep 999 < /proc/$!/ns/net &

и запущенный Firefox, который изолирует каждый из своих потоков «Веб-контента» в несвязанном сетевом пространстве имен (все неработающие loинтерфейсы):

lo               UNKNOWN        127.0.0.1/8 ::1/128 
eth0             UP             192.0.2.2/24 2001:db8:0:1:bc5c:95c7:4ea6:f94f/64 fe80::b4f0:7aff:fe76:76a8/64 
wlan0            DOWN           
dummy0           UNKNOWN        198.51.100.2/24 fe80::108a:83ff:fe05:e0da/64 
lxcbr0           UP             10.0.3.1/24 2001:db8:0:4::1/64 fe80::216:3eff:fe00:0/64 
virbr0           DOWN           192.168.122.1/24 
virbr0-nic       DOWN           
vethSOEPSH@if9   UP             fe80::fc8e:ff:fe85:476f/64 
end of network 4026531992

lo               DOWN           
end of network 4026532418

lo               DOWN           
end of network 4026532518

lo               DOWN           
end of network 4026532618

lo               DOWN           
end of network 4026532718

lo               UNKNOWN        127.0.0.1/8 ::1/128 
eth0@if10        UP             10.0.3.66/24 fe80::216:3eff:fe6a:c1e9/64 
end of network 4026532822

lo               DOWN           
bridge0          UNKNOWN        fe80::b884:44ff:feaf:dca3/64 
end of network 4026532923

lo               DOWN           
dummy0           DOWN           10.11.12.13/24 
end of network 4026533021

INIT NETWORK: 4026531992
3
27.01.2020, 20:41

Теги

Похожие вопросы