Skip to content

Instantly share code, notes, and snippets.

@spiroski
Created March 4, 2018 19:20
Show Gist options
  • Star 7 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save spiroski/78c8bf88e7f03add2a807a6f2dff692b to your computer and use it in GitHub Desktop.
Save spiroski/78c8bf88e7f03add2a807a6f2dff692b to your computer and use it in GitHub Desktop.
Script alternative to autossh
#!/bin/bash
# ------------------------------------------------------------------------------
# FILE: autossh
# DESCRIPTION: This is an SSH-D proxy with auto-reconnect on disconnect
# AUTHOR: Hector Nguyen (hectornguyen at octopius dot com)
# VERSION: 1.0.0
# ------------------------------------------------------------------------------
VERSION="1.0.0"
GITHUB="https://github.com/hectornguyen/autossh"
AUTHOR="Hector Nguyen"
SCRIPT=${0##*/}
IFS=$'\n'
ALIVE=0
HISTFILE="$HOME/.autossh.history"
# Use colors, but only if connected to a terminal, and that terminal supports them.
if which tput >/dev/null 2>&1; then
ncolors=$(tput colors)
fi
if [ -t 1 ] && [ -n "$ncolors" ] && [ "$ncolors" -ge 8 ]; then
RED="$(tput setaf 1)"
GREEN="$(tput setaf 2)"
YELLOW="$(tput setaf 3)"
BLUE="$(tput setaf 4)"
BOLD="$(tput bold)"
NORMAL="$(tput sgr0)"
else
RED=""
GREEN=""
YELLOW=""
BLUE=""
BOLD=""
NORMAL=""
fi
# Progress or something
start_progress()
{
while true
do
echo -ne "#"
sleep 1
done
}
quick_progress()
{
while true
do
echo -ne "#"
sleep .033
done
}
long_progress()
{
while true
do
echo -ne "#"
sleep 3
done
}
dot_progress()
{
for i in {1..100}; do
printf "." $i -1 $i
sleep .033
done
echo_c green " 100%{$NORMAL}"
sleep 1
}
stop_progress()
{
kill $1
wait $1 2>/dev/null
echo -en "\n"
}
# Case-insensitive for regex matching
shopt -s nocasematch
# Prepare history mode
set -i
history -c
history -r
# Input method
get_input()
{
read -e -p "${BLUE}$1${NORMAL}" "$2"
history -s "${!2}"
}
# Echo in bold
echo_b()
{
if [ "$1" = "-e" ]; then
echo -e "${BOLD}$2${NORMAL}"
else
echo "${BOLD}$1${NORMAL}"
fi
}
# Echo in colour
echo_c()
{
case "$1" in
red | r | -red | -r | --red | --r ) echo "${RED}$2${NORMAL}" ;;
green | g | -green | -g | --green | --g ) echo "${GREEN}$2${NORMAL}" ;;
blue | b | -blue | -b | --blue | --b ) echo "${BLUE}$2${NORMAL}" ;;
yellow | y | -yellow | -y | --yellow | --y ) echo "${YELLOW}$2${NORMAL}" ;;
* ) echo "$(BOLD)$2$(RESET)" ;;
esac
}
# Get data from parameters
if [[ ! -n "$remote_param" && -n "$1" ]]; then
remote_param="$1"
remote_user="${remote_param%%@*}"
remote_ip="${remote_param##*@}"
fi
# Get input data and save to history
save_input()
{
if [[ ! -n "$remote_user" && ! -n "$1" ]]; then
while get_input "SSH Username > " remote_user; do
case ${remote_user%% *} in
* )
if [ -n "$remote_user" ]; then
break
else
continue
fi
;;
esac
done
fi
if [[ ! -n "$remote_ip" && ! -n "$1" ]]; then
while get_input "SSH Alias/IP-address > " remote_ip; do
case ${remote_ip%% *} in
* )
if [ -n "$remote_ip" ]; then
break
else
continue
fi
;;
esac
done
fi
}
# Infinitie loop to keep connecting
auto_connect()
{
while true; do
exist=`ps aux | grep "$remote_user@$remote_ip" | grep 22`
if test -n "$exist"
then
if test $ALIVE -eq 0
then
echo_c yellow "I'm alive since $(date)"
fi
ALIVE=1
else
ALIVE=0
echo_c red "I'm dead... God is bringing me back..."
clear
printf "${GREEN}Connecting: "
for i in {1..100}; do
printf "." $i -1 $i
sleep .033
done
echo_c green " 100%${NORMAL}"
sleep 1
clear
ssh $remote_user@$remote_ip
fi
sleep 1
done
}
main()
{
save_input
auto_connect
}
main
@ASanaie
Copy link

ASanaie commented Jan 18, 2021

nice. I like scripts more that the executable autossh !
Thanks for sharing

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment