Как я могу сопоставить шаблон с TCP? - PullRequest
3 голосов
/ 15 января 2010

Я пытаюсь написать скрипт мониторинга. Он должен подключиться к какому-либо порту на моем сервере, прочитать выходные данные, а если выходные данные соответствуют ожидаемому значению, вывести 1, иначе 0.

Я работаю над решением, включающим cat < /dev/tcp/hostname/port, но решение ускользает от меня. Может быть, чего-то ожидающего? Я предпочел бы решение сценария bash. Помощь оценена!

Ответы [ 6 ]

3 голосов
/ 14 ноября 2013

Все другие решения используют netcat для поддержки сети, но вы можете покончить с этим, если ваш bash достаточно свежий и скомпилирован с --enable-net-redirections (что, насколько я могу судить, все, кроме Debian и Ubuntu; не стесняйтесь комментировать, если я должен приспособиться).

Тогда grep может провести реальное тестирование. Код возврата - оболочка (0 для успеха, ненулевое значение для сбоя), так что вам нужно будет инвертировать его, но bash прекрасно с этим справляется.

В двух словах:

< /dev/tcp/host/port grep -q 'expected value'
echo $(( 1 - $? ))
2 голосов
/ 15 января 2010
#!/bin/bash
EXPECTED="hello"
SERVER="example.com"
PORT="123"

netcat $SERVER $PORT | grep -F -q "$EXPECTED"

if [ $? ]; then
  echo 1
else
  echo 0
fi
2 голосов
/ 15 января 2010

вы можете использовать netcat :

echo "GET /"|netcat google.com 80

и затем перенаправить вывод в ваш скрипт обработки

1 голос
/ 15 января 2010

Я бы предложил вам использовать поп-подход. Таким образом, вы можете читать любую команду, которая вам нравится (т.е. nc) и обрабатывать вывод итеративно. При необходимости все это может быть вызвано скриптом bash.

Например:

#!/usr/bin/env ruby

IO.popen("nc host 4560") do |stdout|
   while line = stdout.gets
      if line =~ /pattern/
         puts "1"
      else
         puts "0"
      end
   end
end

Очевидно, вам нужно заменить pattern на то, что вы искали. Преимущество заключается в сравнении каждой строки вместо всего вывода команды. Я не уверен, что предпочтительнее в вашем случае. Я предполагаю, что вы упомянули expect, что вы хотите поэтапный подход.

1 голос
/ 15 января 2010

есть небольшие примеры здесь . Вы можете взять ссылку на это. Однако следует помнить, что это также зависит от того, какие службы работают на вашем порту и по какому протоколу он говорит.

если вы подключаетесь к веб-серверу, общий порт равен 80. Но если вы запускаете собственное приложение, работающее как сервер, убедитесь, что ваш скрипт знает, как «общаться» друг с другом.

другой ресурс, который вы можете посмотреть здесь . Хотя это тарак, так что если у тебя есть тараканы, ты можешь попробовать. (вы также можете "портировать" на bash)

0 голосов
/ 20 июля 2017

Вот скрипт в оболочке Bash, который включает HTTP-запрос:

exec {stream}<>/dev/tcp/example.com/80
printf "GET / HTTP/1.1\nHost: example.com\nConnection: close\n\n" >&${stream}
grep Example <&${stream}
[ $? -eq 0 ] && echo Pattern match || echo Pattern not match

См. Также: Подробнее об использовании встроенного в Bash файла / dev / tcp (TCP / IP) .

...