Вы можете использовать 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
Интерфейс в данный момент времени принадлежит одному сетевому пространству имен и только одному. Начальное )сетевое пространство имен 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