서버에 포트가 열려 있는지 확인하는 스크립트를 만들고 싶습니다. 열리지 않으면 잠시 머물다 가세요. 열려 있으면 계속하십시오. 사용된 인터럽트 조건은 "종료"가 아니라 "호스트 작동 중"입니다. 연결이 잘 된 것 같아요. 문제는 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 구문과 거리가 멀다는 것입니다. 오류 메시지는 문제를 해결하는 방법을 정확하게 알려주지는 않지만 심각한 문제가 발생했음을 암시합니다.
[[
표현하다]]
대괄호 안에는 공백이 필요합니다. 바라보다if 조건의 괄호: 공백 없이 구문 오류가 발생하는 이유는 무엇입니까?|
명령 사이의 파이프 연산자입니다. 그 사람은 운영자가 아니다조건식. 실제로 이는[[ foo | bar ]]
명령에 파이프된 명령으로 구문 분석되어 유용한 작업을 수행하지 않습니다.[[ foo
bar ]]
- 이것
-eq
운영자정수를 비교하지만 그 주위에 넣은 것은 정수가 아닙니다.
문자열에 하위 문자열이 포함되어 있는지 테스트하려면 다음을 수행하십시오.누구나==
조건식에 연산자를 사용하세요.또는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
다음은 성공할 때와 아무것도 반환되지 않을 때를 보여주는 예입니다 .grep
Host is down
grep
NMAP=$(nmap -p 1700 router.eu.thethings.network)
(NMAP$ | grep "Host is up") &>/dev/null && echo "Host is up" || echo "Host is down"