Nmap은 bash에서 포트가 열려 있는지 확인합니다.

Nmap은 bash에서 포트가 열려 있는지 확인합니다.

서버에 포트가 열려 있는지 확인하는 스크립트를 만들고 싶습니다. 열리지 않으면 잠시 머물다 가세요. 열려 있으면 계속하십시오. 사용된 인터럽트 조건은 "종료"가 아니라 "호스트 작동 중"입니다. 연결이 잘 된 것 같아요. 문제는 grep이 예상대로 작동하지 않는다는 것입니다.

나는 다음을 시도했습니다 :

while true; do
 NMAP=$(nmap -p 1700 router.eu.thethings.network)
 if [[$NMAP | grep "Host is up" -ne ""]] && [[$NMAP | grep "closed" -eq ""]]; then
    echo "connection!!!"
    break
 fi


 echo "waiting for connectiong"
 done

저는 Raspberry Pi Jesse 시스템에서 실행하고 있습니다.

답변1

nmap -p 1700 router.eu.thethings.network

호스트 네트워크가 작동 중이고 포트에서 수신 대기 중인 것이 없으면 "Host is up"이 인쇄됩니다. 대신 사용하십시오 nc:

if nc -w1 -z router.eu.thethings.network 1700; then
  echo "Port is listening"
else
  echo "Port is not listening"
fi

답변2

문제는 이것이 [[$NMAP | grep "Host is up" -ne ""]]유효한 bash 구문과 거리가 멀다는 것입니다. 오류 메시지는 문제를 해결하는 방법을 정확하게 알려주지는 않지만 심각한 문제가 발생했음을 암시합니다.

문자열에 하위 문자열이 포함되어 있는지 테스트하려면 다음을 수행하십시오.누구나==조건식에 연산자를 사용하세요.또는grep을 통해 파이프합니다(조건식이 포함되지 않음). grep을 사용하면 $NMAP명령으로 실행하는 것이 아니라 grep에 입력으로 전달하려고 하므로 echo파이프에 넣어야 합니다. -q출력이 아닌 반환 상태에만 관심이 있기 때문에 grep으로 전달되었습니다 .

if echo "$NMAP" | grep "Host is up"  && echo "$NMAP" | grep "closed"; then …

조건식을 사용하십시오.

if [[ $NMAP == *"Host is up"* || $NMAP == *"closed"* ]]; then …

꼭 읽어야 할연산자에 대해 혼란스러워 [[ vs [ vs ( ( vs ((조건식을 설명하고 이것이 조건이 참인지 테스트하는 유일한 방법이 아닌 이유를 설명합니다. 또한 꼭 읽어주세요공백이나 기타 특수 문자 때문에 쉘 스크립트가 멈추는 이유는 무엇입니까?

답변3

Host is up다음은 성공할 때와 아무것도 반환되지 않을 때를 보여주는 예입니다 .grepHost is downgrep

NMAP=$(nmap -p 1700 router.eu.thethings.network)
(NMAP$ | grep "Host is up") &>/dev/null && echo "Host is up" || echo "Host is down"

관련 정보