2015-11-25 144 views
2

經過多年的'只看'我終於需要你的幫助! 我找不到這個謎題的解決方案。命令輸出和字符串比較

我想做一個腳本,檢查服務器是否在我的Ubuntu平臺上運行,如果有回聲「smthing」else echo「other_thing」。

我在開始時被阻塞,因爲我需要檢查我的localhost:端口進行連接。

我正在使用「nc -zv localhost 80」進行測試。

我的想法:如果端口80回顯「是」,如果不回顯「否」

我總是得到錯誤或錯過結果,因爲代碼似乎不好。

#! /bin/sh 

cmd=`nc -zv localhost 80` 
answer="Connection to localhost 80 port [tcp/http] succeeded!" 


if [ "$cmd" = "$answer" ]; then 
    echo "Yes" 
else 
    echo "No" 
fi 

exit 0 

謝謝!

+2

該腳本似乎很好(在http://www.shellcheck.net/中粘貼它只是顯示了使用'$()'而不是反引號)的建議。我不知道什麼是錯的。 'nc -zv localhost 80'的輸出是什麼?如果你說'echo「$ cmd」',你會得到什麼? – fedorqui

+0

我實際上是'printf'%q \ n'「$ cmd」',而不是'echo「$ cmd」',以確保顯示任何隱藏的字符。 –

+0

......雖然看上下文,但很明顯,小二郎和那個男人有權利。 –

回答

3

如果你運行你的代碼,你會看到消息打印到屏幕上,而你期望它被捕獲。這是因爲它正在寫入stderr。

您可以捕獲該輸出與cmd=`nc -zv localhost 80 2>&1`,但更好,更可靠的方法是使用一個事實,即所有的Unix工具有一個退出代碼,告訴您該命令是成功還是失敗,因此可以在if直接使用語句:

if nc -z localhost 80 
then 
    echo "Port open" 
else 
    echo "Port closed" 
fi 
+0

但是,對於用戶的情況,要與'$ answer' *進行比較的文本被寫入標準輸出。此外,它可能(儘管在這種情況下不太可能)'nc'可以成功,但不會輸出預期的文本。 – chepner

+0

這就像一個魅力。謝謝。 但是,當我將命令分配給cmd - > cmd =''nc -zv localhost 80 <2&1'時,它會大喊:'./test.sh:5:./test.sh :: Permission denied'並始終獲取否定答案。 –

+0

@chepner你確定嗎?我的netcat.traditional將這些消息寫入stderr。 @DiogoAlpha'2&1'和'<2&1'是非常不同的東西 –

0

取下的nc輸出後回車:

cmd=$(nc -zv localhost 80) 
cmd=${cmd%$'\r'} 

或包括在預期的輸出回車:

answer="Connection to localhost 80 port [tcp/http] succeeded!"$'\r'