Created
March 4, 2018 19:20
-
-
Save spiroski/78c8bf88e7f03add2a807a6f2dff692b to your computer and use it in GitHub Desktop.
Script alternative to autossh
This file contains 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/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 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
nice. I like scripts more that the executable autossh !
Thanks for sharing