2010-01-15 5 views
3

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

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

ответ

1

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

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

еще один ресурс вы можете посмотреть на here. Его gawk, хотя, поэтому, если у вас есть gawk, тогда вы можете попробовать. (Вы можете «порт», чтобы колотить тоже)

2

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

echo "GET /"|netcat google.com 80 

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

2
#!/bin/bash 
EXPECTED="hello" 
SERVER="example.com" 
PORT="123" 

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

if [ $? ]; then 
    echo 1 
else 
    echo 0 
fi 
+0

'grep -c' для проверки соответствия является противотанковым. Просто 'grep -q' скажет вам, есть ли совпадение. См. Также [бесполезное использование wc] (http://partmaps.org/era/unix/award.html#wc). – tripleee

+0

tripleee, вы, конечно, правы. Я написал из памяти и не запоминаю все флаги для всех команд (если я могу решить это с помощью трубы и другой команды, обычно это нормально).Также обратите внимание, что полученный код очень похож на мою первую итерацию. –

+2

У вас все еще есть бесполезное использование 'test $?' - элегантное и идиоматическое выражение будет 'if netcat '$ SERVER" "$ PORT" | grep -F -q "$ ОЖИДАЕТСЯ"; затем '... – tripleee

1

обработки Я хотел бы предложить вам использовать POPEN подход , Таким образом, вы можете читать с помощью любой команды, которая вам нравится (например, 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, что вам нужен линейный подход.

3

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

Затем grep может выполнить фактическое тестирование. Его код возврата является оболочкой (0 для успеха, отличным от нуля для отказа), поэтому вам нужно будет инвертировать это, но bash обрабатывает его просто отлично.

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

< /dev/tcp/host/port grep -q 'expected value' 
echo $((1 - $?)) 
0

Вот скрипт 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 

Смотрите также: More on Using Bash's Built-in /dev/tcp File (TCP/IP).