sudo apt install tcptraceroute
sudo wget https://gist.github.com/lostsnow/f0d9e5036212dbac5abace26dc359062/raw/d300f4f02f297200a2c44b0ec24bfaa6cc6a0665/tcping -O /usr/bin/tcping
sudo chmod +x /usr/bin/tcping
Last active
May 12, 2025 07:26
-
-
Save lostsnow/f0d9e5036212dbac5abace26dc359062 to your computer and use it in GitHub Desktop.
tcping
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/sh | |
# | |
# tcpping: test response times using TCP SYN packets | |
# URL: http://www.vdberg.org/~richard/tcpping.html | |
# | |
# uses tcptraceroute from http://michael.toren.net/code/tcptraceroute/ | |
# | |
# (c) 2002-2005 Richard van den Berg <[email protected]> under the GPL | |
# http://www.gnu.org/copyleft/gpl.html | |
# | |
# 2002/12/20 v1.0 initial version | |
# 2003/01/25 v1.1 added -c and -r options | |
# now accepting all other tcptraceroute options | |
# 2003/01/30 v1.2 removed double quotes around backquotes | |
# 2003/03/25 v1.3 added -x option, courtesy of Alvin Austin <[email protected]> | |
# 2005/03/31 v1.4 added -C option, courtesy of Norman Rasmussen <[email protected]> | |
# 2007/01/11 v1.5 catch bad destination addresses | |
# 2007/01/19 v1.6 catch non-root tcptraceroute | |
# 2008/02/10 v1.7 make -C work when reverse lookup fails, courtesy of Fabrice Le Dorze <[email protected]> | |
ver="v1.7" | |
format="%Y%m%d%H%M%S" | |
d="no" | |
c="no" | |
C="no" | |
ttl=255 | |
seq=0 | |
q=1 | |
r=1 | |
w=3 | |
topts="" | |
usage () { | |
name=`basename $0` | |
echo "tcpping $ver Richard van den Berg <[email protected]>" | |
echo | |
echo "Usage: $name [-d] [-c] [-C] [-w sec] [-q num] [-x count] ipaddress [port]" | |
echo | |
echo " -d print timestamp before every result" | |
echo " -c print a columned result line" | |
echo " -C print in the same format as fping's -C option" | |
echo " -w wait time in seconds (defaults to 3)" | |
echo " -r repeat every n seconds (defaults to 1)" | |
echo " -x repeat n times (defaults to unlimited)" | |
echo | |
echo "See also: man tcptraceroute" | |
echo | |
} | |
_checksite() { | |
ttr=`tcptraceroute -f ${ttl} -m ${ttl} -q ${q} -w ${w} $* 2>&1` | |
if echo "${ttr}" | egrep -i "(bad destination|got roo)" >/dev/null 2>&1; then | |
echo "${ttr}" | |
exit | |
fi | |
} | |
_testsite() { | |
myseq="${1}" | |
shift | |
[ "${c}" = "yes" ] && nows=`date +${format}` | |
[ "${d}" = "yes" ] && nowd=`date` | |
ttr=`tcptraceroute -f ${ttl} -m ${ttl} -q ${q} -w ${w} $* 2>/dev/null` | |
host=`echo "${ttr}" | awk '{print $2 " " $3}'` | |
rtt=`echo "${ttr}" | sed 's/.*] //' | awk '{print $1}'` | |
not=`echo "${rtt}" | tr -d ".0123456789"` | |
[ "${d}" = "yes" ] && echo "$nowd" | |
if [ "${c}" = "yes" ]; then | |
if [ "x${rtt}" != "x" -a "x${not}" = "x" ]; then | |
echo "$myseq $nows $rtt $host" | |
else | |
echo "$myseq $nows $max $host" | |
fi | |
elif [ "${C}" = "yes" ]; then | |
if [ "$myseq" = "0" ]; then | |
echo -n "$1 :" | |
fi | |
if [ "x${rtt}" != "x" -a "x${not}" = "x" ]; then | |
echo -n " $rtt" | |
else | |
echo -n " -" | |
fi | |
if [ "$x" = "1" ]; then | |
echo | |
fi | |
else | |
echo "${ttr}" | sed -e "s/^.*\*.*$/seq $myseq: no response (timeout)/" -e "s/^$ttl /seq $myseq: tcp response from/" | |
fi | |
# echo "${ttr}" | |
} | |
while getopts dhq:w:cr:nNFSAEi:f:l:m:p:s:x:C opt ; do | |
case "$opt" in | |
d|c|C) eval $opt="yes" ;; | |
q|w|r|x) eval $opt="$OPTARG" ;; | |
n|N|F|S|A|E) topt="$topt -$opt" ;; | |
i|l|p|s) topt="$topt -$opt $OPTARG" ;; | |
f|m) ttl="$OPTARG" ;; | |
?) usage; exit ;; | |
esac | |
done | |
shift `expr $OPTIND - 1` | |
if [ "x$1" = "x" ]; then | |
usage | |
exit | |
fi | |
max=`echo "${w} * 1000" | bc` | |
if [ `date +%s` != "%s" ]; then | |
format="%s" | |
fi | |
_checksite ${topt} $* | |
if [ "$x" = "" ]; then | |
while [ 1 ] ; do | |
_testsite ${seq} ${topt} $* & | |
pid=$! | |
if [ "${C}" = "yes" ]; then | |
wait $pid | |
fi | |
seq=`expr $seq + 1` | |
sleep ${r} | |
done | |
else | |
while [ "$x" -gt 0 ] ; do | |
_testsite ${seq} ${topt} $* & | |
pid=$! | |
if [ "${C}" = "yes" ]; then | |
wait $pid | |
fi | |
seq=`expr $seq + 1` | |
x=`expr $x - 1` | |
if [ "$x" -gt 0 ]; then | |
sleep ${r} | |
fi | |
done | |
fi | |
exit |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment