Search code examples
linuxbashshelltelnetnetcat

Bash script that check connection with host:port using telnet and netcar


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

Solution

  • 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