2016-09-21 5 views
1

私はこの回答を広範囲に検索しましたが、それでも私を逃しているようです。 私はip:portを持つ複数のサーバが生きているかどうかをチェックするbashスクリプトを書こうとしています。 pingが異なるポート(私の知る限り)をサポートしないので、私はbashの中に統合することができる気の利いパイソン1ライナーが見つかりました:bash内のpythonプロセスを呼び出し、出力を変数にキャプチャします

portping() { python <<<"import socket; socket.setdefaulttimeout(1); socket.socket().connect(('$1', $2))" 2> /dev/null && echo OPEN || echo CLOSED; } 

これはbashスクリプト内から呼び出すことができる関数portpingを作成し、Iはその後、ホストのリストが含まれているtxtファイルに使用したい:私は、これらの変数をportping、bashスクリプトはHOSTS.TXTから2つの変数$ IPおよび$ポートを読みたい

Contents of hosts.txt 
myserver.host.com 3301 
myserver.host.com 3302 

、その後、エコーを保存結果として、「OPEN」または「CLOSED」のいずれかの結果が変数に追加されます(サーバーがダウンしていることを知らせるプッシュプルメッセージを送信します)。

while read ip port; 
do 
    echo "Checking if $ip port $port is alive" 
    portping $ip $port # debug check to see if python function is actually working 
    status = 'portping $ip $port' # herein lies my issue, how do I get the python functions echo output into the variable ? 
    echo "$ip $port is $status" 
    if [ "$status" == "CLOSED" ] 
     then 
     echo "Sending pushbullet notification" 
     # pushbullet stuff; 
    else 
     echo "It's Alive!" 
    fi 
done < ${HOSTS_FILE} 

しかし、私は取得しています出力はこれです:

$ ./pingerWithPython.sh hosts.txt 
Using file hosts.txt 
Checking if myserver.host.com port 3301 is alive 
OPEN 
status: Unknown job: = 
myserver.host.com 3301 is 
It's Alive! 
Checking if myserver.host.com port 3302 is alive 
CLOSED 
status: Unknown job: = 
myserver.host.com 3302 is 
It's Alive! 

嘘!それは生きていない:) 明らかに問題は、ステータス=行です。これには単純な修正が必要ですが、私もそれを理解するにはn00bです!

+0

していずれかのバッククォートに単一引用符を変更、または – Jameson

+0

あなたの専門用語が混乱している 'FOO = "$(execute_me ARG1 ARG2)"'構文を使用している必要があります。 'ping'はポート番号を持っているプロトコルを使わないのでポート番号をサポートしません。特定のポートにTCP経由で接続しようとする場合は、次のように見てください。 'nc -z'(別名' netcat')です。 – tripleee

+0

Offtopic、あなたが必要とするものがPythonであることがわかったとき。全体をpythonスクリプトとして書く方が妥当でしょうか? – GhostCat

答えて

2

変数にコマンドの結果を得るには、あなたの代わりに、単純な引用符( ')、または$()イディオムのバッククォート( `)を使用する必要があります。

status=`portping $ip $port` 

または

status=$(portping $ip $port) 

等号の周囲にスペースを入れないでください

+0

あなた自身とJamesonの提案どおりに試しましたが、出力は同じです。 Python宣言自体と何か関係がありますか? – theCheek

+0

すみませんが、スペースコメントを忘れました - 明らかに私はbashに新しく、それはピンキーニティーです。私はゆっくりと学んでいます!助けてくれてありがとう、今働いている。 – theCheek

2

Serge Ballesta's answer,に追加するのは、シェルがスペースに敏感なためです。

理想的には、

status=$(portping $ip $port) 
+0

多くのおかげで、私はそれを逃した! – theCheek

関連する問題