監視スクリプトを作成しようとしています。サーバー上のポートに接続し、出力を読み取り、出力が期待値の場合は1を出力し、そうでない場合は0を出力する必要があります。
私はを含む解決策に取り組んでいますcat < /dev/tcp/hostname/port
が、解決策は私にはわかりません。多分何かが期待を含む?私はbashスクリプトソリューションを好みます。感謝します!
監視スクリプトを作成しようとしています。サーバー上のポートに接続し、出力を読み取り、出力が期待値の場合は1を出力し、そうでない場合は0を出力する必要があります。
私はを含む解決策に取り組んでいますcat < /dev/tcp/hostname/port
が、解決策は私にはわかりません。多分何かが期待を含む?私はbashスクリプトソリューションを好みます。感謝します!
他のすべてのソリューションはネットワーク サポートに netcat を使用しますが、bash が十分に新しく、コンパイルされている場合は、それを廃止できます--enable-net-redirections
(つまり、私が知る限り、Debian と Ubuntu を除くすべてです。調整する必要がある場合は、お気軽にコメントしてください。 )。
その後grep
、実際のテストを行うことができます。その戻りコードはシェル 1 (成功の場合は 0、失敗の場合はゼロ以外) であるため、それを反転する必要がありますが、問題なくbash
処理されます。
手短に:
< /dev/tcp/host/port grep -q 'expected value'
echo $(( 1 - $? ))
#!/bin/bash
EXPECTED="hello"
SERVER="example.com"
PORT="123"
netcat $SERVER $PORT | grep -F -q "$EXPECTED"
if [ $? ]; then
echo 1
else
echo 0
fi
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
行ごとのアプローチが必要だとあなたが言及していると思います。
ここにはほとんど例がありません。参考にすることができます。ただし、ポートで実行されているサービスと、それが話すプロトコルにも依存することに注意してください。
Web サーバーに接続している場合、共通ポートは 80 です。ただし、サーバーとして実行している独自のアプリケーションを実行している場合は、スクリプトが相互に「対話」する方法を知っていることを確認してください。
ここで見ることができる別のリソース。ただし、それは gawk であるため、gawk をお持ちの場合は、試してみることをお勧めします。(bashに「移植」することもできます)