mirror of
https://github.com/ohmybash/oh-my-bash.git
synced 2024-05-11 05:55:37 +00:00
tools/autossh.sh
This is a small script which allows you reconnect to SSH automatically without installing a package like `mosh-server`
This commit is contained in:
192
tools/autossh.sh
Normal file
192
tools/autossh.sh
Normal file
@ -0,0 +1,192 @@
|
||||
#!/usr/bin/env bash
|
||||
# ------------------------------------------------------------------------------
|
||||
# FILE: autossh
|
||||
# DESCRIPTION: This is an SSH-D proxy with auto-reconnect on disconnect
|
||||
# AUTHOR: Toan Nguyen (nntoan at protonmail dot com)
|
||||
# VERSION: 1.0.0
|
||||
# ------------------------------------------------------------------------------
|
||||
VERSION="1.0.0"
|
||||
GITHUB="https://github.com/nntoan/autossh"
|
||||
AUTHOR="Toan 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
|
Reference in New Issue
Block a user