mirror of
				https://github.com/ohmybash/oh-my-bash.git
				synced 2024-05-11 05:55:37 +00:00 
			
		
		
		
	`which` has been deprecated in Debian (at least, the rolling release installed on chromebooks via Linux Containers) https://github.com/ohmybash/oh-my-bash/pull/239#issuecomment-1000974461 Co-authored-by: Koichi Murase <myoga.murase@gmail.com>
		
			
				
	
	
		
			195 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
			
		
		
	
	
			195 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
| #!/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
 | |
| # USAGE: autossh your_user@your_server_ip
 | |
| # shellcheck disable=SC2034,SC2182,SC2162,SC2236,SC2120,SC2009,SC2119,SC2086,SC2059,SC2006
 | |
| # ------------------------------------------------------------------------------
 | |
| 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 type -P 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
 |