Jeg leter etter en rask og enkel metode for å teste om en gitt TCP-port er åpen på en ekstern server, fra innsiden av et Shell-skript.
Jeg har klart å gjøre det med telnet-kommandoen, og det fungerer fint når porten åpnes, men det ser ikke ut til å timeout når det ikke er det og bare henger der ...
Her er et eksempel:
l_TELNET=`echo "quit" | telnet $SERVER $PORT | grep "Escape character is"`
if [ "$?" -ne 0 ]; then
echo "Connection to $SERVER on port $PORT failed"
exit 1
else
echo "Connection to $SERVER on port $PORT succeeded"
exit 0
fi
Jeg trenger enten en bedre måte, eller en måte å tvinge telnet til timeout hvis den ikke kobler til på under 8 sekunder for eksempel, og returnere noe jeg kan fange i Shell (returkode eller streng i stdout).
Jeg kjenner til Perl-metoden, som bruker IO::Socket::INET-modulen og skrev et vellykket skript som tester en port, men vil helst unngå å bruke Perl hvis mulig.
Merk: Dette er hva serveren min kjører (hvor jeg trenger å kjøre dette fra)
SunOS 5.10 Generic_139556-08 i86pc i386 i86pc
Som påpekt av B. Rhodes, vil nc
gjøre jobben. En mer kompakt måte å bruke det på:
nc -z <host> <port>
På den måten vil nc
bare sjekke om porten er åpen, og avslutte med 0 ved suksess, 1 ved feil.
For en rask interaktiv sjekk (med 5 sekunders tidsavbrudd):
nc -z -v -w5 <host> <port>
Med netcat
kan du sjekke om en port er åpen på denne måten:
nc my.example.com 80 < /dev/null
Returverdien for nc
vil være suksess hvis TCP-porten ble åpnet, og feil (typisk returkoden 1) hvis den ikke kunne opprette TCP-forbindelsen.
Noen versjoner av nc
vil henge når du prøver dette, fordi de ikke lukker sendehalvdelen av kontakten selv etter å ha mottatt end-of-file fra /dev/null
. På min egen Ubuntu laptop (18.04) tilbyr netcat-openbsd
-versjonen av netcat som jeg har installert en løsning: -N
-alternativet er nødvendig for å få et øyeblikkelig resultat:
nc -N my.example.com 80 < /dev/null
Jeg antar at det er for sent for et svar, og dette er kanskje ikke et godt svar, men vær så god ...
Hva med å sette det inn i en while-løkke med en timer på av noe slag. Jeg er mer av en Perl fyr enn Solaris, men avhengig av skallet du bruker, bør du være i stand til å gjøre noe som:
TIME = 'date +%s' + 15
while TIME != `date +%s'
do whatever
Og så er det bare å legge til et flagg i while-sløyfen, slik at hvis det går ut før du fullfører, kan du sitere timeout som årsak til feil.
Jeg mistenker at telnet har en timeout-bryter også, men bare av toppen av hodet mitt, tror jeg det ovennevnte vil fungere.