Home > Software engineering >  Bash script that check connection with host:port using telnet and netcar
Bash script that check connection with host:port using telnet and netcar

Time:08-24

I have task to create quite complicated bash script, which at first part is checking the connection to host:port with telnet and- if telnet would fail or would not be installed, try the connection using netcat.

I have problem with loop, where it will skip netcat if telnet would connect to the host and also, if both- telnet and netcat would fail- script would finish with error message. The script:

#!/bin/bash
echo Type host IP address
read REMOTEHOST
echo Type port number
read REMOTEPORT
TIMEOUT=5

echo quit | timeout --signal=9 5 telnet $REMOTEHOST $REMOTEPORT


if nc -w $TIMEOUT -z $REMOTEHOST $REMOTEPORT; then
    echo "I was able to connect to ${REMOTEHOST}:${REMOTEPORT}"
else
    echo "Connection to ${REMOTEHOST}:${REMOTEPORT} failed. Exit code from Netcat was ($?)."
fi

CodePudding user response:

You can use the $? variable to get the exit code from the last command.

I found that your original telnet command exits with error code 1 on my system because the escape character is ^]. When I telnet manually I need to hit ctrl-] to enter the telnet prompt, then I can enter 'quit'.

The trick here is you cannot just type ^], you have to type ctrl-v ctrl-]
ctrl-v tells the system to capture the next ctrl character.

The following gives me an exit code of 0, and you can verify by running it manually with echo $? at the command line

-- remember to use ctrl-v ctr-]

$ (echo ^]; echo quit) | timeout --signal=9 5 telnet <REMOTEHOST> <REMOTEPORT>  
$ echo $?

Then you can use this in your script:

#!/bin/bash
echo Type host IP address
read REMOTEHOST
echo Type port number
read REMOTEPORT
TIMEOUT=5
    
(echo ^]; echo quit) | timeout --signal=9 5 telnet $REMOTEHOST $REMOTEPORT > /dev/null 2>&1    
TELNET_EXIT_CODE=$?
    
if [[ $TELNET_EXIT_CODE -ne 0 ]]; then
    nc -w $TIMEOUT -z $REMOTEHOST $REMOTEPORT > /dev/null 2>&1
    NC_EXIT_CODE=$?
fi

if [[ $TELNET_EXIT_CODE -eq 0 ]] || [[ $NC_EXIT_CODE -eq 0 ]]; then
    echo "success"
else
    echo "fail"
fi

Tested on Ubuntu 20.04.04, GNU bash version 5.0.17, Telnet version 0.17-41

  • Related