emkay443

SSH Multi Tool

Aug 31st, 2013
727
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 50.58 KB | None | 0 0
  1. #!/bin/bash
  2. # SSH Multitool
  3. #
  4. # Ein Multifunktionswerkzeug für SSH und darauf aufbauende (SCP, SFTP, SSHFS, ...).
  5. # Mit Unterstützung für Server, die mit Portknocking abgesichert sind.
  6. #
  7. # Die Konfigurationsdatei kann aus dem Menü heraus bearbeitet werden.
  8. #
  9. # Authors: Michael Koch, Sebastian Lehne
  10. # Contact: m<DOT>koch<AT>emkay443<DOT>de
  11. # License: GNU General Public License v3 (http://www.gnu.de/documents/gpl-3.0.en.html)
  12. #
  13. # Changelog und Liste bekannter Fehler siehe Ende des Scripts
  14.  
  15.  
  16. #################
  17. # KONFIGURATION #
  18. #################
  19.  
  20. # Name, Versionsnummer und Fenstertitel des Programms
  21. name="SSH Multitool"
  22. version="2015-12-20-2"
  23. title="$name - Version $version"
  24.  
  25. # Folgende Variablen nur überschreiben
  26. # wenn die Befehle nicht über die PATH-Variable erreichbar sind
  27. command_dialog="$(which dialog 2> /dev/null)"
  28. command_ssh="$(which ssh 2> /dev/null)"
  29. command_scp="$(which scp 2> /dev/null)"
  30. command_sshfs="$(which sshfs 2> /dev/null)"
  31. command_ssh_keygen="$(which ssh-keygen 2> /dev/null)"
  32. command_term="$(which xterm 2> /dev/null)"
  33. command_wget="$(which wget 2> /dev/null)"
  34. command_mktemp="$(which mktemp 2> /dev/null)"
  35. command_nc="$(which nc 2> /dev/null)"
  36. command_knock="$(which knock 2> /dev/null)"
  37. command_unison="$(which unison 2> /dev/null)"
  38. command_openvpn="$(which openvpn 2> /dev/null)"
  39. command_screen="$(which screen 2> /dev/null)"
  40.  
  41. # Ort und Aufbau der Konfigurationsdateien
  42. configfile_path="$HOME/.sshmultitool"
  43. configfile_ext="cfg"
  44. configfile_main_name="sshmultitool"
  45. configfile_main="$configfile_path/$configfile_main_name.$configfile_ext"
  46. configfile_template="$configfile_path/$configfile_main_name.$configfile_ext.template"
  47. configfile_full="$configfile_main"
  48.  
  49.  
  50. #######################################################################
  51. # VORSICHT!                                                           #
  52. # Das Verändern des folgenden Codes kann die Funktionalität           #
  53. # des Programms stark negativ beeinträchtigen!                        #
  54. #                                                                     #
  55. # Verändern Sie den folgenden Code nur, wenn Sie wissen, was Sie tun! #
  56. #######################################################################
  57.  
  58. ##################
  59. # HILFSVARIABLEN #
  60. ##################
  61.  
  62. TERM=linux
  63. weiter=true
  64. screen_name=home-$$
  65.  
  66. configfile_path_sed="$(echo $configfile_path | sed 's/\//\\\//g')"
  67. configfile_dl_url="https://raw.githubusercontent.com/emkay443/sshmultitool/master/sshmultitool.cfg.template"
  68.  
  69. github_url="https://github.com/emkay443/sshmultitool"
  70. github_file_url="https://raw.githubusercontent.com/emkay443/sshmultitool/master/sshmultitool"
  71.  
  72. cygwin_knock_dl_url="http://emkay443.de/private/scripts/knock.exe"
  73.  
  74. # Übergebene Parameter in Array speichern
  75. for i in $(seq 1 $#); do
  76.     eval param_array[$i]=\$$i
  77. done
  78.  
  79. ###################
  80. # HILFSFUNKTIONEN #
  81. ###################
  82.  
  83. function knockknock {
  84.     if [[ $knockd_enable ]]; then
  85.         echo "Bitte warten, es wird eine Verbindung zum Server aufgebaut..."
  86.         for port in "${knockd_ports[@]}"; do
  87.             if [[ "$(which knock)" ]]; then
  88.                 eval knock "$server" "$port"
  89.             else
  90.                 if [[ ! "$(uname)" == *CYGWIN* ]]; then
  91.                     nc "$server" "$port"
  92.                 else
  93.                     wget "$cygwin_knock_dl_url" -O "/bin/knock.exe"
  94.                     chmod +rx "/bin/knock.exe"
  95.                     eval "/bin/knock.exe" "$server" "$port"
  96.                 fi
  97.             fi
  98.             sleep $knockd_sleep
  99.         done
  100.     fi
  101. }
  102.  
  103. function ovpn_connect {
  104.     if [[ -n "$ovpn_enable" ]]; then
  105.         if $ovpn_enable; then
  106.             toInst=""
  107.             if [[ ! -e "$command_openvpn" ]]; then toInst="openvpn"; fi
  108.             if [[ ! -z "$toInst" ]]; then
  109.                 echo "Folgende Pakete müssen installiert werden, damit das Programm reibungslos funktioniert:"
  110.                 echo $toInst
  111.                 echo
  112.                 echo "Sollen sie installiert werden? [J|n]"
  113.                 read answer
  114.                 case $answer in
  115.                     j|J|'')
  116.                         installPkg $toInst
  117.                         knockknock
  118.                         ;;
  119.                     *)
  120.                         exit 1
  121.                         ;;
  122.                 esac
  123.             else
  124.                 if [[ "$(which sudo)" ]]; then
  125.                     sudo="sudo"
  126.                     suffix=""
  127.                 else
  128.                     sudo="su -c '"
  129.                     suffix="'"
  130.                 fi
  131.                 clear
  132.                 if [ -t 0 ]; then
  133.                     echo "Ein neues Terminal-Fenster wird jetzt geöffnet, um die OpenVPN-Verbindung herzustellen."
  134.                     echo "Wenn die Verbindung erfolgreich hergestellt wurde, wechseln Sie in dieses Fenster zurück"
  135.                     echo "und drücken Sie eine beliebige Taste, um die SSH-Verbindung herzustellen."
  136.                     echo
  137.                     echo "Haben Sie das vestanden? [J|n]"
  138.                     read answer
  139.                     case $answer in
  140.                         j|J|'')
  141.                             if [[ ! "$(which $terminal)" ]]; then
  142.                                 terminal="$command_term"
  143.                             fi
  144.                             "$terminal" -e "$sudo $command_screen $command_openvpn --config \"$ovpn_configfile\" $suffix" &
  145.                             clear
  146.                             echo "Drücken Sie eine beliebige Taste, wenn die OpenVPN-Verbindung erfolgreich hergestellt wurde."
  147.                             echo "Schließen Sie das andere Terminal-Fenster, um die OpenVPN-Verbindung zu trennen."
  148.                             read -n 1 any
  149.                             ;;
  150.                         *)
  151.                             # exit 0
  152.                             ;;
  153.                     esac
  154.                 else
  155.                     echo "Starte eine screen-Sitzung mit openVPN."
  156.                     echo "Wenn die Verbindung erfolgreich hergestellt wurde, drücken Sie STRG-A-D,"
  157.                     echo "um die screen-Sitzung zu verlassen und die SSH-Verbindung herzustellen."
  158.                     echo
  159.                     echo "Haben Sie das vestanden? [J|n]"
  160.                     read answer
  161.                     case $answer in
  162.                         j|J|'')
  163.                             $sudo $command_screen -S "$screen_name" $command_openvpn --config "$ovpn_configfile" $suffix
  164.                             clear
  165.                             echo "Drücken Sie eine beliebige Taste, wenn die OpenVPN-Verbindung erfolgreich hergestellt wurde."
  166.                             read -n 1 any
  167.                             ;;
  168.                         *)
  169.                             # exit 0
  170.                             ;;
  171.                     esac
  172.                 fi
  173.             fi
  174.         fi
  175.     fi
  176. }
  177.  
  178. function ovpn_disconnect {
  179.     if [[ -n "$ovpn_enable" ]]; then
  180.         if $ovpn_enable; then
  181.             if [ ! -t 0 ]; then
  182.                 if [ "$(pidof $(basename $command_openvpn))" ]; then
  183.                     clear
  184.                     echo "Soll die OpenVPN-Verbindung getrennt werden? [J|n]"
  185.                     read answer
  186.                     case $answer in
  187.                         j|J|'')
  188.                             echo "Drücken Sie im nächsten Fenster STRG-C, um die OpenVPN-Verbindung zu trennen."
  189.                             echo "Drücken Sie jetzt eine beliebige Taste, wenn Sie das verstanden haben."
  190.                             read -n 1 any
  191.                             screen -r $screen_name
  192.                             ;;
  193.                         *)
  194.                             echo "Um die OpenVPN-Verbindung später zu trennen,"
  195.                             echo "geben Sie \"$command_screen -r $screen_name\" ein"
  196.                             echo "und drücken Sie dort STRG-C."
  197.                             echo "Drücken Sie jetzt eine beliebige Taste, wenn Sie das verstanden haben."
  198.                             read -n 1 any
  199.                             exit 0
  200.                             ;;
  201.                     esac
  202.                 fi
  203.             fi
  204.         fi
  205.     fi
  206. }
  207.  
  208. function synchronise {
  209.     if $sync_enable; then
  210.         knockknock
  211.         $command_unison $sync_params $sync_profil
  212.         if [ $sync_wait_afterwards -lt 0 ]; then
  213.             echo "Drücken Sie eine beliebige Taste, um ins Hauptmenü zurückzukehren"
  214.             read -n 1 any
  215.         else
  216.             sleep $sync_wait_afterwards
  217.         fi
  218.     fi
  219. }
  220.  
  221. function dl_def_cfg {
  222.     echo "Für die richtige Funktionalität des Skripts muss eine Konfigurationsdatei aus dem Internet heruntergeladen werden."
  223.     echo "Soll das für Sie getan werden? [J|n]"
  224.     read answer
  225.     case $answer in
  226.     j|J|"")
  227.         $command_wget "$configfile_dl_url" -O "$configfile_template"
  228.         if [ -z "$(cat $configfile_template)" ]; then
  229.             echo "FEHLER: Konnte Konfigurationsdatei nicht herunterladen!"
  230.             echo "Bitte überprüfen Sie ihre Netzwerkverbindung und starten Sie das Programm erneut."
  231.             exit 1
  232.         fi
  233.         ;;
  234.     *)
  235.         echo "Dann halt nicht..."
  236.         exit 2
  237.         ;;
  238.     esac
  239. }
  240.  
  241. function cp_def_cfg {
  242.     echo "Soll die Konfigurationsdatei vom Musterprofil kopiert werden? [J|n]"
  243.     read answer
  244.     case $answer in
  245.     j|J|"")
  246.         cp "$configfile_template" "$configfile_full"
  247.         "$editor" "$configfile_full"
  248.         . "$configfile_full"
  249.         ;;
  250.     *)
  251.         echo "Dann halt nicht..."
  252.         exit 2
  253.         ;;
  254.     esac
  255. }
  256.  
  257. function installPkg {
  258.     packages=$*
  259.     if [[ "$(which sudo)" ]]; then
  260.         sudo="sudo"
  261.         suffix=""
  262.     else
  263.         sudo="su -c '"
  264.         suffix="'"
  265.     fi
  266.     if [[ "$(which apt-get)" ]]; then
  267.         # Ubuntu, Mint, Debian, Mac OS X (Fink)
  268.         manager="apt-get install"
  269.     elif [[ "$(which aptitude)" ]]; then
  270.         # Ubuntu, Mint, Debian
  271.         manager="aptitude install"
  272.     else
  273.         echo "Problem: Keine unterstütze Paketverwaltung gefunden."
  274.         echo "Bitte installieren Sie folgende Pakete manuell"
  275.         echo "und starten Sie dieses Programm dann erneut:"
  276.         echo $packages
  277.         if [[ "$(uname)" == *Darwin* ]]; then
  278.             echo ""
  279.             echo "Sie scheinen Mac OS X zu verwenden."
  280.             echo "Daher empfehlen wir Ihnen, MacPorts (http://macports.org) zu installieren."
  281.             echo "MacPorts ist eine Paketverwaltung mit vielen Programmen aus der Linux-Welt."
  282.             echo "Nach der Installation von MacPorts starten Sie dieses Programm einfach neu."
  283.         elif [[ "$(uname)" == *CYGWIN* ]]; then
  284.             echo ""
  285.             echo "Sie scheinen Windows (Cygwin) zu verwenden."
  286.             echo "Daher müssen Sie die oben gezeigten Programme über den Cygwin-Installer selbst installieren."
  287.             echo "Nachdem Sie das getan haben, starten Sie dieses Programm erneut."
  288.         fi
  289.         exit 1
  290.     fi
  291.     $sudo $manager $packages $suffix
  292. }
  293.  
  294. function checkDeps {
  295.     if [[ ! -e "$command_ssh" ]]; then toInst=$toInst" openssh"; fi
  296.     if [[ ! -e "$command_dialog" ]]; then toInst=$toInst" dialog"; fi
  297.     if [[ ! -e "$command_wget" ]]; then toInst=$toInst" wget"; fi
  298.     if [[ ! "$(uname)" == *CYGWIN* ]] && [[ ! -e "$command_sshfs" ]]; then toInst=$toInst" sshfs"; fi
  299.     # if [[ ! -e "$command_vi" ]]; then toInst=$toInst" vi"; fi
  300.     if [[ ! -e "$command_mktemp" ]]; then toInst=$toInst" mktemp"; fi
  301.     if [[ ! "$(uname)" == *CYGWIN* ]] && [[ ! -e "$command_nc" ]]; then toInst=$toInst" netcat-openbsd"; fi
  302.     if [[ ! "$(uname)" == *CYGWIN* ]] && [[ ! -e "$command_knock" ]]; then toInst=$toInst" knockd"; fi
  303.  
  304.     if [[ ! -z $toInst ]]; then
  305.         echo "Folgende Pakete müssen installiert werden, damit das Programm reibungslos funktioniert:"
  306.         echo $toInst
  307.         echo
  308.         echo "Sollen sie installiert werden? [J|n]"
  309.         read answer
  310.         case $answer in
  311.             j|J|'')
  312.                 installPkg $toInst
  313.                 ;;
  314.             *)
  315.                 echo "Dann halt nicht. Wundern Sie sich nicht über Fehler und unnormales Verhalten."
  316.                 echo "Sollten Sie doch zur Vernunft kommen, können Sie das Programm neustarten"
  317.                 echo "und doch die Abhängigkeiten auflösen lassen. :)"
  318.                 echo "Starte trotzdem..."
  319.                 sleep 5
  320.                 ;;
  321.         esac
  322.     fi
  323. }
  324.  
  325. function uploadFiles {
  326.     local skip_elements=0
  327.     local number_of_files=0
  328.     local file_indizes=( )
  329.     local files=""
  330.  
  331.     for i in $(seq 1 $1); do
  332.         if [ $skip_elements -gt 0 ]; then
  333.             let skip_elements--
  334.         elif [ "${param_array[$i]}" == "-p" ] || [ "${param_array[$i]}" == "--profil" ] || [ "${param_array[$i]}" == "--profile" ]; then
  335.             skip_elements=1
  336.         else
  337.             if [ -e "${param_array[$i]}" ]; then
  338.                 let number_of_files++
  339.                 file_indizes=( "${file_indizes[@]}" "$i" )
  340.             fi
  341.         fi
  342.     done
  343.  
  344.     if [ $number_of_files -gt 0 ]; then
  345.         echo "Es wurden $number_of_files gültige Dateipfade als Parameter übergeben."
  346.         echo "Sollen diese Dateien via SCP an den Server geschickt werden? [J|n]"
  347.         read answer
  348.         case $answer in
  349.             j|J|"")
  350.                 # Konfigurationsdatei einbinden
  351.                 . "$configfile_full"
  352.                 for index in ${file_indizes[@]}; do
  353.                     firstbyte=`echo ${param_array[$index]} | cut -b 1`
  354.                     if [ "$firstbyte" == "/" ]; then
  355.                         path=${param_array[$index]}
  356.                     else
  357.                         curworkdir=`pwd`
  358.                         path="$curworkdir/${param_array[$index]}"
  359.                     fi
  360.                     path=${path// /\\\ }
  361.                     files="$files $path"
  362.                 done
  363.                 echo $files
  364.                 knockknock
  365.                 eval scp -P $sshport $files $user@$server:
  366.                 exit 0
  367.                 ;;
  368.             *)
  369.                 ;;
  370.         esac
  371.     fi
  372. }
  373.  
  374. function show_help {
  375.     echo "Aufruf: $(basename $0) [OPTIONEN]   oder   $(basename $0) [DATEI[EN]]"
  376.     echo "Ohne Parameter wird das Programm normal gestartet."
  377.     echo "Werden gültige Dateipfade übergeben, werden die Dateien via SCP an den Server"
  378.     echo "des aktuellen Profils (oder an den des Hauptprofils) gesendet."
  379.     echo
  380.     echo -e "Option\t\tlange Option\t\tBedeutung"
  381.     echo -e "-h\t\t--help\t\t\tZeigt diese Hilfeseite an"
  382.     echo -e "-p <PROFIL>\t--profil[e] <PROFIL>\tGibt ein Profil an und lädt ggbf. eine neue Konfigurationsdatei dafür"
  383.     echo -e "-a [ALT] <NEU>\t--alias[ALT] <NEU>\tLegt eine symbolische Verknüpfung vom alten zum neuen Profil an"
  384.     echo -e "-c [ALT] <NEU>\t--copy [ALT] <NEU>\tKopiert das übergebene oder das Hauptprofil zum Profil <NEU>"
  385.     echo -e "-m <ALT> <NEU>\t--move <ALT> <NEU>\tBenennt das übergebene Profil in <NEU> um"
  386.     echo -e "-d <PROFIL>\t--delete <PROFIL>\tLöscht das übergebene Profil"
  387.     echo -e "-r [PROFIL]\t--reset [PROFIL]\tErsetzt das übergebene oder das Hauptprofil mit einem neuen Blankoprofil"
  388.     echo -e "-u\t\t--update\t\tSucht beim Starten nach einer neuen Version des Skripts"
  389.     echo -e "-ud\t\t--update-only-download\tLädt nur die aktuelle Version des Skripts herunter, ohne das Skript selbst zu updaten"
  390.     echo -e "-k\t\t--knock\t\tNur anklopfen"
  391.     echo -e "-v\t\t--version\t\tZeigt die Versionsnummer und eine Kurzinfo an"
  392. }
  393.  
  394. function change_profile {
  395.     if [ ! -z "$1" ]; then
  396.         configfile_full="$configfile_path/$1.$configfile_ext"
  397.         if [ ! -e "$configfile_path/$1.$configfile_ext" ]; then
  398.             echo "Das angegebene Profil kann nicht gefunden werden."
  399.             echo "Ein neues Profil wird erstellt."
  400.             cp_def_cfg
  401.         fi
  402.     fi
  403. }
  404.  
  405. function list_profiles {
  406.     echo "Folgende Profile sind verfügbar:"
  407.     ls $configfile_path/*.cfg | grep -v $configfile_main | sed -e 's/'$configfile_path_sed'\///' | sed -e 's/.'$configfile_ext'//'
  408.     echo
  409.     echo "Nutzung:"
  410.     echo "$(basename $0) -p PROFILNAME"
  411.     exit 0
  412. }
  413.  
  414. function create_profile_alias {
  415.     if [ ! -z "$1" ] && [ ! -z "$2" ]; then
  416.         if [ ! -e "$configfile_path/$1.$configfile_ext" ]; then
  417.             echo "Das angegebene Profil kann nicht gefunden werden. Beende."
  418.             exit 1
  419.         else
  420.             if [ -e "$configfile_path/$2.$configfile_ext" ]; then
  421.                 echo "Das Zielprofil existiert bereits! Soll es überschrieben werden? [j|N]"
  422.                 read answer
  423.                 case $answer in
  424.                     "j"|"J")
  425.                         rm "$configfile_path/$2.$configfile_ext"
  426.                         ;;
  427.                     "*"|"")
  428.                         echo "Dann halt nicht. Beende."
  429.                         exit 0
  430.                         ;;
  431.                 esac
  432.             fi
  433.             ln -s "$configfile_path/$1.$configfile_ext" "$configfile_path/$2.$configfile_ext"
  434.             configfile_full="$configfile_path/$2.$configfile_ext"
  435.         fi
  436.     fi
  437. }
  438.  
  439. function copy_profile {
  440.     if [ ! -z "$1" ] && [ ! -z "$2" ]; then
  441.         if [ ! -z "$(echo $1 | grep [' '\\/\$])" ] || [ ! -z "$(echo $2 | grep [' '\\/\$])" ]; then
  442.             echo "Der Name beinhaltet verbotene Zeichen. Beende."
  443.             exit 1
  444.         elif [ ! -e "$configfile_path/$1.$configfile_ext" ]; then
  445.             echo "Das angegebene Profil kann nicht gefunden werden. Beende."
  446.             exit 1
  447.         else
  448.             if [ -e "$configfile_path/$2.$configfile_ext" ]; then
  449.                 echo "Das Zielprofil existiert bereits! Soll es überschrieben werden? [j|N]"
  450.                 read answer
  451.                 case $answer in
  452.                     "j"|"J")
  453.                         ;;
  454.                     "*"|"")
  455.                         echo "Dann halt nicht. Beende."
  456.                         exit 0
  457.                         ;;
  458.                 esac
  459.             fi
  460.             cp "$configfile_path/$1.$configfile_ext" "$configfile_path/$2.$configfile_ext"
  461.             configfile_full="$configfile_path/$2.$configfile_ext"
  462.         fi
  463.     fi
  464. }
  465.  
  466. function move_profile {
  467.     if [ ! -z "$1" ] && [ ! -z "$2" ]; then
  468.         if [ ! -z "$(echo $1 | grep [' '\\/\$])" ] || [ ! -z "$(echo $2 | grep [' '\\/\$])" ]; then
  469.             echo "Der Name beinhaltet verbotene Zeichen. Beende."
  470.             exit 1
  471.         elif [ ! -e "$configfile_path/$1.$configfile_ext" ]; then
  472.             echo "Das angegebene Profil kann nicht gefunden werden. Beende."
  473.             exit 1
  474.         else
  475.             if [ -e "$configfile_path/$2.$configfile_ext" ]; then
  476.                 echo "Das Zielprofil existiert bereits! Soll es überschrieben werden? [j|N]"
  477.                 read answer
  478.                 case $answer in
  479.                     "j"|"J")
  480.                         ;;
  481.                     "*"|"")
  482.                         echo "Dann halt nicht. Beende."
  483.                         exit 0
  484.                         ;;
  485.                 esac
  486.             fi
  487.             mv "$configfile_path/$1.$configfile_ext" "$configfile_path/$2.$configfile_ext"
  488.             configfile_full="$configfile_path/$2.$configfile_ext"
  489.         fi
  490.     fi
  491. }
  492.  
  493. function delete_profile {
  494.     if [ ! -z "$1" ]; then
  495.         configfile_full="$configfile_path/$1.cfg"
  496.         if [ ! -e "$configfile_full" ]; then
  497.             echo "Das Profil existiert nicht. Breche ab."
  498.             exit 1
  499.         fi
  500.         if [ ! "$configfile_full" = "$configfile_main" ]; then
  501.             echo "Die zu löschende Konfigurationsdatei ist: $configfile_full"
  502.             echo "Soll die Konfigurationsdatei wirklich gelöscht werden? [j|N]"
  503.             read answer
  504.             case $answer in
  505.                 "j"|"J")
  506.                     rm "$configfile_full"
  507.                     echo "Die Konfigurationsdatei wurde gelöscht. Beende."
  508.                     exit 0
  509.                     ;;
  510.                 ""|"*")
  511.                     echo "Dann halt nicht. Beende."
  512.                     exit 0
  513.                     ;;
  514.             esac
  515.         else
  516.             echo "Das Hauptprofil kann nicht gelöscht werden. Breche ab."
  517.             exit 1
  518.         fi
  519.     fi
  520. }
  521.  
  522. function reset_profile {
  523.     if [ ! -z "$1" ]; then
  524.         configfile_full="$configfile_path/$1.$configfile_ext"
  525.     fi
  526.     if [ ! -e "$configfile_full" ]; then
  527.         echo "Das Profil existiert nicht. Breche ab."
  528.         exit 1
  529.     fi
  530.     echo "Die zuzrückzusetzende Konfigurationsdatei ist: $configfile_full"
  531.     echo "Soll die Konfigurationsdatei wirklich zurückgesetzt werden? [j|N]"
  532.     read answer
  533.     case $answer in
  534.         "j"|"J")
  535.             cp_def_cfg
  536.             ;;
  537.     esac
  538. }
  539.  
  540. function show_version_info {
  541.     echo "Verbindungsskript für SSH und darauf aufbauende (SCP, SFTP, SSHFS, ...)"
  542.     echo "mit Unterstützung für mit Portknocking abgesicherte Server"
  543.     echo "und konfigurierbaren Profilen"
  544.     echo
  545.     echo "Version: $version"
  546.     echo "Authors: Michael Koch, Sebastian Lehne"
  547.     echo "Contact: m<DOT>koch<AT>emkay443<DOT>de"
  548.     echo "License: GNU General Public License v3 (http://www.gnu.de/documents/gpl-3.0.en.html)"
  549.     echo "Source: $github_url"
  550.     exit 0
  551. }
  552.  
  553. function checkForUpdates {
  554.     auto_update=true
  555.     if [[ ! "$(which dos2unix)" ]]; then
  556.         $command_dialog --title "DOS2UNIX" --yesno "DOS2UNIX ist nicht installiert.\nEs wird für die automatische Update-Funktion benötigt, ist aber dennoch optional.\n\nSoll es automatisch installiert werden?" 0 0
  557.         answer=$?
  558.         case $answer in
  559.             0)
  560.                 installPkg " dos2unix"
  561.                 ;;
  562.             *)
  563.                 auto_update=false
  564.                 ;;
  565.         esac
  566.     fi
  567.     tmpfile=$(mktemp) || (echo "Fehler beim anlegen der TEMP-Datei." && exit 1)
  568.     echo "Nach Updates wird gesucht. Bitte warten..."
  569.     $command_wget -O "$tmpfile" "$github_file_url"
  570.     case $? in
  571.         0)
  572.             if $auto_update; then
  573.                 new_version="$(grep -m 1 version= $tmpfile | sed 's/version="//' | sed 's/"//' | dos2unix)"
  574.             else
  575.                 new_version="$(grep -m 1 version= $tmpfile | sed 's/version="//' | sed 's/"//')"
  576.             fi
  577.             if [[ ! "$new_version" == "$version" ]] || [[ $update_only_download ]]; then
  578.                 if [[ "$(which $0)" ]]; then
  579.                     scriptfile="$(which $0)"
  580.                 else
  581.                     scriptfile="$0"
  582.                 fi
  583.                 if [[ ! "$update_only_download" ]]; then
  584.                     if $auto_update; then
  585.                         $command_dialog --title "$title" --yesno "Eine neue Version ist verfügbar: $new_version\nSoll sie automatisch installiert werden?" 0 0
  586.                         answer=$?
  587.                         case $answer in
  588.                             0)
  589.                                 if [ -w "$scriptfile" ]; then
  590.                                     dos2unix -n "$tmpfile" "$scriptfile"
  591.                                     chmod +rx "$scriptfile"
  592.                                 else
  593.                                     if [[ "$(which sudo)" ]]; then
  594.                                         sudo dos2unix -n "$tmpfile" "$scriptfile"
  595.                                         sudo chmod +rx "$scriptfile"
  596.                                     else
  597.                                         su -c "dos2unix -n \"$tmpfile\" \"$scriptfile\""
  598.                                         su -c "chmod +rx \"$scriptfile\""
  599.                                     fi
  600.                                 fi
  601.                                 $command_dialog --title "$title" --msgbox "Das Update war erfolgreich.\nStarten Sie das Skript nun neu." 0 0
  602.                                 clear
  603.                                 exit 0
  604.                                 ;;
  605.                         esac
  606.                     else
  607.                         $command_dialog --title "$title" --msgbox "Es ist ein Update verfügbar: $new_version\n\nLaden Sie und installieren Sie es manuell von folgender Seite:\n$github_file_url" 0 0
  608.                     fi
  609.                 else
  610.                     if [ -w "$scriptfile" ]; then
  611.                         dos2unix -n "$tmpfile" "$scriptfile""_1"
  612.                         chmod +rx "$scriptfile""_1"
  613.                     else
  614.                         if [[ "$(which sudo)" ]]; then
  615.                             sudo dos2unix -n "$tmpfile" "$scriptfile""_1"
  616.                             sudo chmod +rx "$scriptfile""_1"
  617.                         else
  618.                             su -c "dos2unix -n \"$tmpfile\" \"$scriptfile\"\"_1\""
  619.                             su -c "chmod +rx \"$scriptfile\"\"_1\""
  620.                         fi
  621.                     fi
  622.                     $command_dialog --title "$title" --msgbox "Die aktuellste Version des Skripts wurde heruntergeladen.\nSie befindet sich hier: $scriptfile""_1" 0 0
  623.                     clear
  624.                     exit 0
  625.                 fi
  626.             else
  627.                 $command_dialog --title "$title" --msgbox "Es gibt kein Update, Sie verwenden bereits die aktuellste Version." 0 0
  628.             fi
  629.             ;;
  630.         *)
  631.             $command_dialog --title "$title" --msgbox "Es konnte nicht nach Updates gesucht werden.\nÜberprüfen Sie Ihre Internetverbindung\nund versuchen Sie es erneut." 0 0
  632.             exit 0
  633.             ;;
  634.     esac
  635.     rm $tmpfile
  636. }
  637.  
  638. #################
  639. # HAUPTPROGRAMM #
  640. #################
  641.  
  642. # Wenn im Terminal geöffnet...
  643. if [ -t 0 ]; then
  644.     # Nach altem Config-Ordner checken, ggbf. verschieben
  645.     if [ -e "$HOME/.homeconnect" ] || [ -e "$configfile_path/homescripts.cfg" ]; then
  646.         mv "$HOME/.homeconnect" "$configfile_path"
  647.         mv "$configfile_path/homescripts.cfg" "$configfile_main"
  648.         mv "$configfile_path/homescripts.cfg.template" "$configfile_template"
  649.     fi
  650.  
  651.     # Abhängigkeiten auflösen
  652.     clear
  653.     checkDeps
  654.  
  655.     # Temporäre Datei erzeugen
  656.     erg=$(mktemp) || (echo "Fehler beim anlegen der TEMP-Datei." && exit 1)
  657.  
  658.     # Standardeditor einstellen, wird später von Config überschrieben
  659.     if [ -z "$EDITOR" ]; then
  660.         editor="$(which nano)"
  661.         if [ ! -e "$editor" ]; then editor="$(which vi)"; fi
  662.     fi
  663.  
  664.     # Konfigurationsdatei ggbf. herunterladen, falls nicht vorhanden
  665.     if [ ! -e "$configfile_template" ]; then
  666.         dl_def_cfg
  667.     fi
  668.  
  669.     if [ ! -e "$configfile_full" ]; then
  670.         clear
  671.         cp_def_cfg
  672.     fi
  673.  
  674.  
  675.     # Parameter überprüfen, falls Dateien, per SCP hochladen
  676.     if [ $# -gt 0 ]; then
  677.         case $1 in
  678.             "-p"|"--profil"|"--profile")
  679.                 if [ ! -z "$2" ]; then
  680.                     change_profile "$2"
  681.                     uploadFiles $#
  682.                 else
  683.                     list_profiles
  684.                 fi
  685.                 ;;
  686.             "-a"|"--alias")
  687.                 if [ ! -z "$2" ] && [ ! -z "$3" ]; then
  688.                     create_profile_alias "$2" "$3"
  689.                 elif [ ! -z "$2" ]; then
  690.                     create_profile_alias "$configfile_main_name" "$2"
  691.                 else
  692.                     show_help
  693.                     exit 1
  694.                 fi
  695.                 exit 0
  696.                 ;;
  697.             "-c"|"--copy")
  698.                 if [ ! -z "$2" ] && [ ! -z "$3" ]; then
  699.                     copy_profile "$2" "$3"
  700.                 elif [ ! -z "$2" ]; then
  701.                     copy_profile "$configfile_main_name" "$2"
  702.                 else
  703.                     show_help
  704.                     exit 1
  705.                 fi
  706.                 exit 0
  707.                 ;;
  708.             "-m"|"--move")
  709.                 if [ ! -z "$2" ] && [ ! -z "$3" ]; then
  710.                     move_profile "$2" "$3"
  711.                 else
  712.                     show_help
  713.                     exit 1
  714.                 fi
  715.                 exit 0
  716.                 ;;
  717.             "-d"|"--delete")
  718.                 if [ ! -z "$2" ]; then
  719.                     delete_profile "$2"
  720.                 fi
  721.                 exit 0
  722.                 ;;
  723.             "-r"|"--reset")
  724.                 if [ ! -z "$2" ]; then
  725.                     reset_profile "$2"
  726.                 else
  727.                     reset_profile "$configfile_main_name"
  728.                 fi
  729.                 exit 0
  730.                 ;;
  731.             "-k"|"--knock")
  732.                 justknock=true
  733.                 ;;
  734.             "-v"|"--version")
  735.                 show_version_info
  736.                 exit 0
  737.                 ;;
  738.             "-h"|"--help")
  739.                 show_help
  740.                 exit 0
  741.                 ;;
  742.             "-u"|"--update")
  743.                 search_for_updates=true
  744.                 ;;
  745.             "-ud"|"--update-download")
  746.                 search_for_updates=true
  747.                 update_only_download=true
  748.                 ;;
  749.             *)
  750.                 uploadFiles $#
  751.                 echo "Ungültige Option: $1"
  752.                 show_help
  753.                 exit 1
  754.                 ;;
  755.         esac
  756.     fi
  757.  
  758.     if [[ $search_for_updates ]]; then
  759.         clear
  760.         checkForUpdates
  761.     fi
  762.  
  763.     # Konfigurations-Ordner erstellen, falls nicht schon existent
  764.     mkdir -p "$configfile_path"
  765.  
  766.     # Konfigurationsdatei einbinden
  767.     . "$configfile_full"
  768.  
  769.     if [[ $justknock ]]; then
  770.         if [[ $knockd_enable ]]; then
  771.             echo "Klopfe an..."
  772.             knockknock
  773.             exit 0
  774.         else
  775.             echo "Für das Profil ist Port-Knocking nicht aktiviert. Tue nichts."
  776.             exit 0
  777.         fi
  778.     fi
  779.  
  780.     clear
  781.  
  782.     # Endlosschleife
  783.     while $weiter; do
  784.         if $sync_enable; then
  785.             $command_dialog --title "$title" --menu "Hauptmenü\nAktuelles Profil: $(echo $configfile_full | sed -e 's/'$configfile_path_sed'\///' | sed -e 's/.'$configfile_ext'//' | sed -e 's/sshmultitool/Hauptprofil/')" 0 0 0 \
  786.             1 "SSH Verbindung zum Server aufbauen" \
  787.             2 "Dateien via SCP an den Server senden" \
  788.             3 "SFTP Verbindung im Dateimanager öffnen" \
  789.             4 "SSHFS einbinden" \
  790.             5 "SSH Tunnel aufbauen" \
  791.             6 "SSH-Schlüsselgenerator starten" \
  792.             7 "Mit einer anderen SSH-Konfiguration verbinden" \
  793.             8 "Konfigurationsdatei bearbeiten" \
  794.             9 "Profilverwaltung" \
  795.             10 "Synchronisieren über Unison-Profil" \
  796.             \? "Über dieses Programm" \
  797.             0 "Programm beenden" 2> $erg
  798.         else
  799.             $command_dialog --title "$title" --menu "Hauptmenü\nAktuelles Profil: $(echo $configfile_full | sed -e 's/'$configfile_path_sed'\///' | sed -e 's/.'$configfile_ext'//' | sed -e 's/sshmultitool/Hauptprofil/')" 0 0 0 \
  800.             1 "SSH Verbindung zum Server aufbauen" \
  801.             2 "Dateien via SCP an den Server senden" \
  802.             3 "SFTP Verbindung im Dateimanager öffnen" \
  803.             4 "SSHFS einbinden" \
  804.             5 "SSH Tunnel aufbauen" \
  805.             6 "SSH-Schlüsselgenerator starten" \
  806.             7 "Mit einer anderen SSH-Konfiguration verbinden" \
  807.             8 "Konfigurationsdatei bearbeiten" \
  808.             9 "Profilverwaltung" \
  809.             \? "Über dieses Programm" \
  810.             0 "Programm beenden" 2> $erg
  811.         fi 2>/dev/null
  812.         echo
  813.         case "$(cat $erg)" in
  814.             1)
  815.                 # SSH
  816.                 clear
  817.                 ovpn_connect
  818.                 knockknock
  819.                 $command_ssh $sshparms $user@$server -p $sshport
  820.                 # read -n 1 any
  821.                 ovpn_disconnect
  822.                 ;;
  823.             2)
  824.                 # Dateien via SCP übertragen
  825.                 weiter_scp=true
  826.                 while $weiter_scp; do
  827.                     curworkdir=$(pwd)
  828.                     $command_dialog --title "$title" --fselect $(echo "$curworkdir/") 10 70 2> $erg
  829.                     file_scp=$(cat $erg)
  830.                     if [ -z "$file_scp" ]; then
  831.                         weiter_scp=false
  832.                     elif [ ! -e "$file_scp" ]; then
  833.                         $command_dialog --title "$title" --msgbox "Die Datei existiert nicht." 0 0
  834.                     elif [ -d "$file_scp" ]; then
  835.                         $command_dialog --title "$title" --msgbox "Sie können nur Dateien, keine Ordner versenden!" 5 65
  836.                     else
  837.                         $command_dialog --title "$title" --no-cancel --inputbox "Geben Sie den Zielort der Datei auf dem Server an.\nLeer lassen, um in den Benutzerordner hochzuladen" 10 70 2> $erg
  838.                         destpath="$(cat $erg)"
  839.                         clear
  840.                         firstbyte=$(echo $file_scp | cut -b 1)
  841.                         if [ "$firstbyte" == "/" ]; then
  842.                             filepath=$file_scp
  843.                         else
  844.                             curworkdir=$(pwd)
  845.                             filepath="$curworkdir/$file_scp"
  846.                         fi
  847.                         ovpn_connect
  848.                         knockknock
  849.                         $command_scp -P $sshport "$filepath" $user@$server:"$destpath"
  850.                         weiter_scp=false
  851.                         echo "Drücken Sie eine beliebige Taste, um in das Hauptmenü zurückzukehren"
  852.                         read -n 1 any
  853.                         ovpn_disconnect
  854.                     fi
  855.                 done
  856.                 ;;
  857.             3)
  858.                 # SFTP
  859.                 if [[ ! "$(uname)" == *CYGWIN* ]]; then
  860.                     clear
  861.                     ovpn_connect
  862.                     knockknock
  863.                     $filemanager "sftp://$user@$server:$sshport"
  864.                     ovpn_disconnect
  865.                 else
  866.                     $command_dialog --title "$title" --msgbox "Unter Windows ist dies so direkt nicht möglich.\nWir empfehlen daher, \"WinSCP\" dafür zu installieren." 7 65
  867.                 fi
  868.                 ;;
  869.             4)
  870.                 # SSHFS
  871.                 if [[ ! "$(uname)" == *CYGWIN* ]]; then
  872.                     clear
  873.                     break=false
  874.                     $command_dialog --title "$title" --inputbox "Geben Sie den einzubindenden Ordner an" 10 60 "/" 2> $erg
  875.                     sshfsdir=$(cat $erg)
  876.                     if [ ! -z "$sshfsdir" ]; then
  877.                         $command_dialog --title "$title" --inputbox "Geben Sie den anzumeldenden Benutzer an" 10 60 "$user" 2> $erg
  878.                         sshfsuser=$(cat $erg)
  879.                         if [ ! -z "$sshfsuser" ]; then
  880.                             doAgain=true
  881.                             while $doAgain; do
  882.                                 $command_dialog --title "$title" --no-cancel --inputbox "Geben Sie den Mountpunkt an.\nDer Ordner muss für Ihren Benutzer beschreibbar sein!" 10 60 "$HOME/sshfs_auf_$server" 2> $erg
  883.                                 sshfsmnt=$(cat $erg)
  884.                                 if [ ! -z "$sshfsmnt" ]; then
  885.                                     if [ ! -e "$sshfsmnt" ]; then
  886.                                         $command_dialog --title "$title" --yesno "Der Mountpunkt existiert nicht.\nSoll er erstellt werden?" 7 60
  887.                                         answer=$?
  888.                                         case $answer in
  889.                                             0)
  890.                                                 if [ -w "$(dirname $sshfsmnt)" ]; then
  891.                                                     mkdir -p $sshfsmnt
  892.                                                 else
  893.                                                     echo "Sie benötigen erhöhte Schreibrechte, um den Ordner anlegen zu können."
  894.                                                     if [[ "$(which sudo)" ]]; then
  895.                                                         echo "Bitte geben Sie ihr Benutzerpasswort ein, um zu bestätigen."
  896.                                                         sudo mkdir -p "$sshfsmnt"
  897.                                                         sudo chown $USER@$GROUPS "$sshfsmnt"
  898.                                                     else
  899.                                                         echo "Bitte geben Sie ihr Rootpasswort ein, um zu bestätigen."
  900.                                                         su -c "mkdir -p \"$sshfsmnt\""
  901.                                                         su -c "chown $USER@$GROUPS \"$sshfsmnt\""
  902.                                                     fi
  903.                                                 fi
  904.                                                 ;;
  905.                                             1|255)
  906.                                                 $command_dialog --title "$title" --msgbox "Der Mountpunkt wurde nicht erstellt" 5 60
  907.                                                 break=true
  908.                                                 doAgain=false
  909.                                                 ;;
  910.                                         esac
  911.                                     fi
  912.                                     clear
  913.                                     if ! $break; then
  914.                                         if [ -w "$sshfsmnt" ]; then
  915.                                             ovpn_connect
  916.                                             knockknock
  917.                                             echo "Baue Verbindung via SSHFS auf. Um zu beenden, drücken Sie CTRL-C"
  918.                                             $command_sshfs "$sshfsuser@$server:$sshfsdir" "$sshfsmnt" -C -p $sshport -f
  919.                                             ovpn_disconnect
  920.                                             doAgain=false
  921.                                         else
  922.                                             $command_dialog --title "$title" --msgbox "Der Mountpunkt ist NUR mit root-Rechten schreibbar!\nGeben Sie einen Mountpunkt an, auf den Sie auch schreiben dürfen" 7 65
  923.                                         fi
  924.                                     fi
  925.                                 else
  926.                                     doAgain=false
  927.                                 fi
  928.                             done
  929.                             if [ ! -z "$sshfsmnt" ] && ! $break; then
  930.                                 clear
  931.                                 $command_dialog --title "$title" --yesno "Soll der Mountpunkt gelöscht werden?" 5 60
  932.                                 answer=$?
  933.                                 case $answer in
  934.                                     0)
  935.                                         if [ -w "$sshfsmnt" ]; then
  936.                                             rmdir "$sshfsmnt"
  937.                                             $command_dialog --title "$title" --msgbox "Der Mountpunkt wurde erfolgreich gelöscht" 5 60
  938.                                         else
  939.                                             $command_dialog --title "$title" --msgbox "Der Mountpunkt darf nicht gelöscht werden!" 5 60
  940.                                             exit 1
  941.                                         fi
  942.                                         ;;
  943.                                     1|255)
  944.                                         $command_dialog --title "$title" --msgbox "Der Mountpunkt wurde nicht gelöscht" 5 60
  945.                                         ;;
  946.                                 esac
  947.                             fi
  948.                         fi
  949.                     fi
  950.                 else
  951.                     $command_dialog --title "$title" --msgbox "Unter Windows ist dies so direkt nicht möglich.\nWir empfehlen daher, \"Swish\" dafür zu installieren." 7 65
  952.                 fi
  953.                 ;;
  954.             5)
  955.                 # SSH Tunnel
  956.                 clear
  957.                 break=false
  958.                 $command_dialog --title "$title" --inputbox "Geben Sie die Quelladresse an" 0 0 "localhost" 2> $erg
  959.                 if [ -s "$erg" ]; then
  960.                     sourceaddr=$(cat $erg)
  961.                     $command_dialog --title "$title" --menu "Wählen Sie den Quellport aus" 0 0 0 \
  962.                         20 "FTP (Datenübertragung)" \
  963.                         21 "FTP (Anmeldung und Kontrolle)" \
  964.                         22 "SSH" \
  965.                         23 "Telnet" \
  966.                         25 "SMTP" \
  967.                         53 "DNS" \
  968.                         80 "HTTP" \
  969.                         110 "POP3" \
  970.                         113 "IRC Ident" \
  971.                         115 "SFTP" \
  972.                         118 "SQL" \
  973.                         143 "IMAP" \
  974.                         194 "IRC" \
  975.                         220 "IMAP v3" \
  976.                         443 "HTTPS" \
  977.                         445 "Samba" \
  978.                         531 "AOL Instant Messenger, IRC" \
  979.                         587 "SMTP (alternativ)" \
  980.                         631 "IPP" \
  981.                         989 "FTPS (Datenübertragung)" \
  982.                         990 "FTPS (Anmeldung und Kontrolle)" \
  983.                         992 "Telnet via TLS/SSL" \
  984.                         993 "IMAPS" \
  985.                         995 "POP3S" \
  986.                         1080 "SOCKS proxy" \
  987.                         1194 "OpenVPN" \
  988.                         2401 "CVS" \
  989.                         3074 "Xbox LIVE, Games for Windows-Live" \
  990.                         3306 "MySQL" \
  991.                         3389 "RDP" \
  992.                         3724 "World of Warcraft" \
  993.                         5190 "ICQ und AIM" \
  994.                         5500 "VNC (alternativ)" \
  995.                         5800 "VNC über HTTP" \
  996.                         5900 "VNC" \
  997.                         6112 "Battle.net" \
  998.                         8008 "HTTP Alternative" \
  999.                         8080 "HTTP Alternative" \
  1000.                         8767 "TeamSpeak 2" \
  1001.                         9001 "Tor" \
  1002.                         9030 "Tor (alt.)" \
  1003.                         9050 "Tor (alt.)" \
  1004.                         9051 "Tor (alt.)" \
  1005.                         9418 "git" \
  1006.                         9987 "TeamSpeak 3" \
  1007.                         10000 "Webmin" \
  1008.                         11371 "OpenPGP Key Server" \
  1009.                         20000 "Usermin" \
  1010.                         25565 "MySQL, Minecraft" \
  1011.                         X "Port manuell eingeben" \
  1012.                         A "Alle Quellports" \
  1013.                         0 "Programm beenden" 2> $erg
  1014.                     sourceport=$(cat $erg)
  1015.                     case "$sourceport" in
  1016.                         X)
  1017.                             $command_dialog --title "$title" --inputbox "Geben Sie den Quellport an" 0 0 2> $erg
  1018.                             if [ -s "$erg" ]; then
  1019.                                 sourceport=$(cat $erg)
  1020.                                 $command_dialog --title "$title" --inputbox "Geben Sie den Zielport an" 0 0 2> $erg
  1021.                                 if [ -s "$erg" ]; then
  1022.                                     destport=$(cat $erg)
  1023.                                 else
  1024.                                     break=true
  1025.                                 fi
  1026.                             else
  1027.                                 break=true
  1028.                             fi
  1029.                             ;;
  1030.                         A)
  1031.                             $command_dialog --title "$title" --inputbox "Geben Sie den Zielport an" 0 0 2> $erg
  1032.                             if [ -s "$erg" ]; then
  1033.                                 destport=$(cat $erg)
  1034.                                 ovpn_connect
  1035.                                 knockknock
  1036.                                 echo "Geben Sie 'localhost:$destport' als SOCKS-Proxy in Ihrem Browser ein."
  1037.                                 echo "Um zu beenden, drücken Sie CTRL-C"
  1038.                                 $command_ssh -C -N -L -D $destport $user@$server -p $sshport
  1039.                                 ovpn_disconnect
  1040.                             fi
  1041.                             break=true
  1042.                             ;;
  1043.                         0|"")
  1044.                             echo "Dann halt nicht..."
  1045.                             break=true
  1046.                             ;;
  1047.                         *)
  1048.                             $command_dialog --title "$title" --inputbox "Geben Sie den Zielport an" 0 0 2> $erg
  1049.                             if [ -s "$erg" ]; then
  1050.                                 destport=$(cat $erg)
  1051.                             else
  1052.                                 break=true
  1053.                             fi
  1054.                             ;;
  1055.                     esac
  1056.                     if ! $break; then
  1057.                         ovpn_connect
  1058.                         knockknock
  1059.                         echo "Lassen Sie die Verbindung zum Server so lange bestehen, wie der Tunnel aktiv sein soll."
  1060.                         echo "Um zu beenden, drücken Sie CTRL-C"
  1061.                         if [ $destport -lt 1024 ]; then
  1062.                             echo "Sie haben einen Port kleiner als 1024 gewählt. Das erfordert root-Rechte."
  1063.                             if [[ "$(which sudo)" ]]; then
  1064.                                 sudo $command_ssh -C -N -L localhost:$destport:$sourceaddr:$sourceport $user@$server -p $sshport
  1065.                             else
  1066.                                 su -c "$command_ssh -C -N -L localhost:$destport:$sourceaddr:$sourceport $user@$server -p $sshport"
  1067.                             fi
  1068.                         else
  1069.                             $command_ssh -C -N -L localhost:$destport:$sourceaddr:$sourceport $user@$server -p $sshport
  1070.                         fi
  1071.                         ovpn_disconnect
  1072.                     fi
  1073.                 fi
  1074.                 ;;
  1075.             6)
  1076.                 weiter_kg=true
  1077.                 while $weiter_kg; do
  1078.                     clear
  1079.                     $command_dialog --title "$title" --no-cancel --inputbox "Geben Sie die Parameter für den Schlüsselgenerator an (optional)\nLeer lassen, wenn Sie damit nicht vertraut sind\nGeben Sie 'man' ein, wenn Sie die Man-Page sehen\noder 'exit', wenn Sie zurück ins Hauptmenü möchten" 10 70 2> $erg
  1080.                     keygenparms=$(cat $erg)
  1081.                     clear
  1082.                     if [ "$keygenparms" = "man" ]; then
  1083.                         man ssh-keygen
  1084.                     elif [ "$keygenparms" = "exit" ]; then
  1085.                         weiter_kg=false
  1086.                     else
  1087.                         $command_ssh_keygen $keygenparms
  1088.                         weiter_kg=false
  1089.                         echo "Beliebige Taste drücken, um zum Hauptmenü zurückzukehren"
  1090.                         read -n 1 any
  1091.                     fi
  1092.                 done
  1093.                 ;;
  1094.             7)
  1095.                 clear
  1096.                 $command_dialog --title "$title" --inputbox "Geben Sie die Serveradresse an" 0 0 2> $erg
  1097.                 if [ -s "$erg" ]; then
  1098.                     tmpserver=$(cat $erg)
  1099.                     $command_dialog --title "$title" --inputbox "Geben Sie den Benutzernamen an" 0 0 2> $erg
  1100.                     if [ -s "$erg" ]; then
  1101.                         tmpuser=$(cat $erg)
  1102.                         $command_dialog --title "$title" --no-cancel --inputbox "Geben Sie die SSH-Parameter an" 0 0 "-X -C" 2> $erg
  1103.                         tmpparms=$(cat $erg)
  1104.                         $command_ssh $tmpparms $tmpuser@$tmpserver -p $sshport
  1105.                     fi
  1106.                 fi
  1107.                 ;;
  1108.             8)
  1109.                 clear
  1110.                 # Die Konfiguration bearbeiten
  1111.                 if [ ! -e "$(which $editor)" ]; then editor="/usr/bin/nano"; fi
  1112.                 if [ ! -e "$(which $editor)" ]; then editor="/usr/bin/vi"; fi
  1113.                 "$editor" "$configfile_full"
  1114.                 # Konfigurationsdatei neu einlesen
  1115.                 . "$configfile_full"
  1116.                 ;;
  1117.             9)
  1118.                 profiles_arr=($(ls $configfile_path/*.cfg | grep -v $configfile_main | sed -e 's/'$configfile_path_sed'\///' | sed -e 's/.'$configfile_ext'//'))
  1119.                 profiles_str="0 Hauptprofil"
  1120.                 counter=1
  1121.                 for profile in "${profiles_arr[@]}"; do
  1122.                     profiles_str="$profiles_str $counter $profile"
  1123.                     let counter++
  1124.                 done
  1125.                 profiles_str="$profiles_str n Neues_Profil_erstellen"
  1126.                 profiles_str="$profiles_str c Aktuelles_Profil_kopieren"
  1127.                 if [ ! "$configfile_full" = "$configfile_main" ]; then
  1128.                     profiles_str="$profiles_str d Aktuelles_Profil_löschen"
  1129.                 fi
  1130.                 $command_dialog --title "$title" --menu "Profilauswahl\nAktuelles Profil: $(echo $configfile_full | sed -e 's/'$configfile_path_sed'\///' | sed -e 's/.'$configfile_ext'//' | sed -e 's/sshmultitool/Hauptprofil/')" 0 60 0 $profiles_str 2> $erg
  1131.                 if [ -s "$erg" ]; then
  1132.                     clear
  1133.                     profile_index="$(cat $erg)"
  1134.                     case "$(cat $erg)" in
  1135.                         0)
  1136.                             configfile_full="$configfile_main"
  1137.                             . "$configfile_full"
  1138.                             ;;
  1139.                         "n")
  1140.                             weiter_np=true
  1141.                             skip=false
  1142.                             while $weiter_np; do
  1143.                                 $command_dialog --title "$title" --inputbox "Geben Sie den Namen des neuen Profils ein\nVerbotene Zeichen sind: \$, /, \\ und das Leerzeichen" 10 60 "profilNeu" 2> $erg
  1144.                                 profil_name=$(cat $erg)
  1145.                                 if [ ! -z "$profil_name" ]; then
  1146.                                     if [ ! -z "$(echo $profil_name | grep [' '\\/\$])" ]; then
  1147.                                         $command_dialog --title "$title" --msgbox "Der Name beinhaltet verbotene Zeichen.\nBitte wählen Sie einen Namen ohne /, \\, \$ und Leerzeichen" 7 70
  1148.                                     elif [ ! -e "$configfile_path/$profil_name.$configfile_ext" ]; then
  1149.                                         clear
  1150.                                         configfile_full="$configfile_path/$profil_name.$configfile_ext"
  1151.                                         cp_def_cfg
  1152.                                         weiter_np=false
  1153.                                         $command_dialog --title "$title" --msgbox "Das Profil wurde erfolgreich erzeugt." 5 60
  1154.                                     else
  1155.                                         $command_dialog --title "$title" --msgbox "Ein Profil mit diesem Namen existiert bereits!\nBitte wählen Sie einen neuen Namen für das Profil" 7 60
  1156.                                     fi
  1157.                                 else
  1158.                                     weiter_np=false
  1159.                                 fi
  1160.                             done
  1161.                             ;;
  1162.                         "d")
  1163.                             if [ ! "$configfile_full" = "$configfile_main" ]; then
  1164.                                 clear
  1165.                                 $command_dialog --title "$title" --yesno "Wollen Sie das aktuelle Profil wirklich löschen?" 5 60
  1166.                                 answer=$?
  1167.                                 case $answer in
  1168.                                     0)
  1169.                                         rm "$configfile_full"
  1170.                                         configfile_full="$configfile_main"
  1171.                                         $command_dialog --title "$title" --msgbox "Das Profil wurde erfolgreich gelöscht" 5 60
  1172.                                         ;;
  1173.                                     1|255)
  1174.                                         $command_dialog --title "$title" --msgbox "Das Profil wurde nicht gelöscht" 5 60
  1175.                                         ;;
  1176.                                 esac
  1177.                             else
  1178.                                 $command_dialog --title "$title" --msgbox "Das Hauptprofil kann nicht gelöscht werden" 5 60
  1179.                             fi
  1180.                             ;;
  1181.                         "c")
  1182.                             weiter_cp=true
  1183.                             while $weiter_cp; do
  1184.                                 $command_dialog --title "$title" --inputbox "Geben Sie den Namen des neuen Profils ein\nVerbotene Zeichen sind: \$, /, \\ und das Leerzeichen" 10 60 "profilNeu" 2> $erg
  1185.                                 profil_name="$(cat $erg)"
  1186.                                 if [ ! -z "$profil_name" ]; then
  1187.                                         if [ ! -z "$(echo $profil_name | grep [' '\\/\$])" ]; then
  1188.                                             $command_dialog --title "$title" --msgbox "Der Name beinhaltet verbotene Zeichen.\nBitte wählen Sie einen Namen ohne /, \\, \$ und Leerzeichen" 7 70
  1189.                                         elif [ ! -e "$configfile_path/$profil_name.$configfile_ext" ]; then
  1190.                                             clear
  1191.                                             cp "$configfile_full" "$configfile_path/$profil_name.$configfile_ext"
  1192.                                             configfile_full="$configfile_path/$profil_name.$configfile_ext"
  1193.                                             weiter_cp=false
  1194.                                             $command_dialog --title "$title" --msgbox "Das Profil wurde erfolgreich kopiert.\nDrücken Sie auf OK, um ins Hauptmenü zurückzugelangen" 10 60
  1195.                                         else
  1196.                                             $command_dialog --title "$title" --msgbox "Ein Profil mit diesem Namen existiert bereits!\nBitte wählen Sie einen neuen Namen für das Profil" 10 60
  1197.                                         fi
  1198.                                 else
  1199.                                     weiter_cp=false
  1200.                                 fi
  1201.                             done
  1202.                             ;;
  1203.                         *)
  1204.                             let profile_index--
  1205.                             counter=0
  1206.                             while [ $counter -lt "${#profiles_arr[*]}" ]; do
  1207.                                 if [ $counter -eq $profile_index ]; then
  1208.                                     configfile_full="$configfile_path/${profiles_arr[$counter]}.$configfile_ext"
  1209.                                     . "$configfile_full"
  1210.                                 fi
  1211.                                 let counter++
  1212.                             done
  1213.                             ;;
  1214.                     esac
  1215.                 fi
  1216.                 ;;
  1217.             10)
  1218.                 clear
  1219.                 synchronise
  1220.                 ;;
  1221.             "?")
  1222.                 show_version_info | $command_dialog --progressbox "Über dieses Programm (Zurück: Beliebige Taste drücken)" 13 80
  1223.                 read -n 1 any
  1224.                 ;;
  1225.             0|"")
  1226.                 # Ende
  1227.                 weiter=false
  1228.                 ;;
  1229.             esac
  1230.  
  1231.     done
  1232.     rm "$erg"
  1233.     clear
  1234. else
  1235.     # ... sonst in Terminal öffnen
  1236.     . "$configfile_full"
  1237.     if [[ ! "$(which $terminal)" ]]; then
  1238.         terminal="$command_term"
  1239.     fi
  1240.     "$terminal" -e "$0"
  1241. fi
  1242.  
  1243. exit 0
  1244.  
  1245. ########### Changelog ##########
  1246. # Version: 2015-12-20   Michael Koch
  1247. # * Projekt von Pastebin zu Github verschoben, Update-Funktion angepasst
  1248. # * "homescripts", "homeconnect" und "home" in "sshmultitool" umbenannt
  1249. # + Funktion eingebaut, die entsprechend die alten Verzeichnisse verschiebt
  1250. #
  1251. # Version: 2015-12-19_1 Michael Koch
  1252. # * Code aufgeräumt. Erhebe keinen Anspruch auf Vollständigkeit.
  1253. # P (planned) Umzug auf git{hub,lab,(.*)}
  1254. #
  1255. # Version: 2015-12-19   Michael Koch
  1256. # + "Nur anklopfen" Funktion hinzugefügt, nur in der Kommandozeile (z.B. um ssh-copy-id oder andere Befehle zu benutzen, die nicht direkt unterstützt werden)
  1257. #
  1258. # Version: 2014-08-22   Michael Koch
  1259. # * OpenVPN-Unterstützung verbessert, (hoffentlich) gefixt. Funktioniert jetzt in der GUI etwas besser (nicht-grafisch läuft immer noch über screen).
  1260. # * #0001 ist nicht mehr "unfortunately unfixable"
  1261. #
  1262. # Version: 2014-07-16a  Michael Koch
  1263. # + Unterstützung für SSH über OpenVPN: Optionen "ovpn_enable" (true/false) und "ovpn_optionfile" (String) in Konfigurationsdatei (noch experimentell!!)
  1264. #
  1265. # Version: 2013-10-23   Michael Koch
  1266. # * Verwirrung um VNC-Ports behoben
  1267. #
  1268. # Version: 2013-09-16_1 Michael Koch
  1269. # * Skript aufgeräumt, die Pfade zu den benutzten Programmen in Variablen ausgelegt
  1270. #
  1271. # Version: 2013-09-16   Sebastian Lehne
  1272. # * Fixed usage of $knockd_sleep. Die Variable war scheinbar beim Einbau von knock quasi wirkungslos geworden, weil knock gleich alle Ports als Parameter bekommen hat.
  1273. #
  1274. # Version: 2013-09-14_1 Michael Koch
  1275. # * Update-Funktion: Nutzer bekommt jetzt auch Leserechte (chmod +rx statt nur +x) auf die Datei
  1276. #
  1277. # Version: 2013-09-14   Michael Koch
  1278. # + Möglichkeit hinzugefügt, nur die aktuellste Version herunterzuladen, ohne das eigentliche Skript zu überschreiben (Option -ud)
  1279. # * Bugs in der Profilverwaltung via Kommandozeilenoptionen behoben
  1280. # * Der Profilordner wird jetzt mit -p angelegt, die "Fehlermeldung" von mkdir könnte sonst verwirren
  1281. # * Bugs #0005 und #0006 behoben
  1282. #
  1283. # Version: 2013-09-13_2 Michael Koch
  1284. # * Einige Anzeige-Bugs (u.a. zu kleines Textfeld bei "Über dieses Programm") behoben
  1285. #
  1286. # Version: 2013-09-13_1 Sebastian Lehne
  1287. # * Temp-File für Update-Funktion wird nun per mktemp angelegt.
  1288. # * Pastebin-URL nun über Variablen zusammensteckbar.
  1289. # * Pastebin-URL wird in Versions-Info mit angezeigt.
  1290. # * Automatische Installation von dos2unix funktionierte nicht. Bug fixed.
  1291. #
  1292. # Version: 2013-09-13   Michael Koch
  1293. # + Update-Funktionalität hinzugefügt. Mit Parameter -u bzw. --update aufrufen, um nach Updates zu suchen.
  1294. #
  1295. # Version: 2013-09-11   Sebastian Lehne, Michael Koch
  1296. # * Bug mit SSH-Tunnel (endgültig) gefixt (hoffentlich?)
  1297. #
  1298. # Version: 2013-07-03   Sebastian Lehne
  1299. # * Bug beim aufbauen eines SSH-Tunnels gefixt
  1300. #
  1301. # Version: 2013-06-06   Sebastian Lehne
  1302. # * Tippfehler in knockknock beseitigt
  1303. #
  1304. # Version: 2013-06-01_2 Michael Koch
  1305. # + Unterstützung für Microsoft Windows (via Cygwin) hinzugefügt
  1306. #    Benötigt die Installation folgende Pakete in Cygwin:
  1307. #    openssh, dialog, wget, nano/vi/vim, termcap, ncurses
  1308. #
  1309. # Version: 2013-06-01_1 Sebastian Lehen
  1310. # * Bug #0004 gefixt, es lassen sich nun mehrere Dateien in einem Rutsch per SCP (im CLI) übertragen.
  1311. #
  1312. # Version: 2013-06-01   Sebastian Lehne
  1313. # + globalen Array $param_array eingeführt, der alle Parameter mit passenden Leerzeichen enthält.
  1314. # * Bug #0002 gefixt, es lassen sich nun beliebig viele Dateien auch an Profile senden. Außerdem kommt es nicht mehr zu Falschmeldungen über hoch zu ladende Dateien, wenn man das Programm mit einem Profil aufruft.
  1315. #
  1316. # Version: 2013-05-27_1 Sebastian Lehne
  1317. # + Ist der Wartezeit-Parameter fürs Synchronisieren negativ, bleibt der Output von Unison so lange stehen, bis man eine Taste drückt.
  1318. #
  1319. # Version: 2013-05-27   Sebastian Lehne
  1320. # * Auflisten der Profile mit Parameter "-p" ohne Angabe eines Profils funktioniert wieder
  1321. # * Hardcoded Haupt-Profilnamen "homescripts" in einigen Funktionsaufrufen durch Variabel "$configfile_main_name" ersetzt.
  1322. #
  1323. # Version: 2013-05-26_1 Michael Koch
  1324. # + Ein "Über dieses Programm" hinzugefügt
  1325. # * Ein Paar Texte zum besseren Verständnis geändert
  1326. # * Den Titel des "Auswahlmenü" zu "Hauptmenü" geändert
  1327. #
  1328. # Version: 2013-05-26   Michael Koch
  1329. # * In dem SSH-Tunnel-Eintrag eine weitere Abfrage (if [ -s "$erg" ]; then) hinzugefügt
  1330. # * Das "--no-cancel" aus der o.g. Funktion entfernt, kann nun also auch abgebrochen werden, wodurch "$erg" leer wäre, s.o.
  1331. # * Die gesamte Profilverwaltung leer- und sonderzeichensicher gemacht (Profile mit '/', '\', '$' und ' ' im Namen können nicht erstellt werden)
  1332. # * Manche Ja/Nein Dialoge, die mit "echo ... [J|n]" gemacht wurden, durch entsprechende Aufrufe von "dialog --yesno" ersetzt
  1333. # * Name von "Heimverbindunsskript" zu "SSH Multitool" geändert. Klingt besser.
  1334. #
  1335. # Version: 2013-05-25   Sebastian Lehne
  1336. # * Profil-Wechsel bei Angabe von Parameter "-p" in Funktion ausgelagert.
  1337. # * Auflisten von Profilen bei Angabe von Parameter "-p" ohne Profilnamen in Funktion ausgelagert.
  1338. # * Anlegen von Profil-Aliasen mit Parameter "-a" in Funktion ausgelagert.
  1339. # * Profil kopieren mit Parameter "-c" in Funktion ausgelagert.
  1340. # * Profil verschieben mit Parameter "-m" in Funktion ausgelagert.
  1341. # * löschen von Profilen mit Parameter "-d" in Funktion ausgelagert.
  1342. # * Profil zurücksetzten mit Parameter "-r" in Funktion ausgelagert.
  1343. # * Anzeige von Versions-Info in Funktion ausgelagert.
  1344. # * diverse Rückgabewerte angepasst.
  1345. # * Beim kopieren von Dateien via SCP wird nun das aktuelle Verzeichniss statt /home/ aufgerufen. (fixes Bug #0003)
  1346. #
  1347. # Version: 2013-05-24_2 Michael Koch
  1348. # * Weitere Rückgabewerte gefixt (Wusste nicht, dass die Zahl hinter "exit" ein Rückgabewert ist. Dachte, das wäre ein internes "sleep"...)
  1349. # * Kleinere Bugfixes, Unschönheiten ausgemerzt
  1350. #
  1351. # Version: 2013-05-24_1 Sebastian Lehne
  1352. # + Liste mit known Bugs angefügt
  1353. # * Rückgabewert in Funktionen "dl_def_cfg" und "installPkg" im Fehlerfall auf 1 gesetzt (war 0, und 0 heißt "Alle OK", is aber n Fehler und eben nicht OK)
  1354. # * Kommentar in Funktion "installPkg" angepasst. Aptitude gibts nicht nur für Debian, sondern auch für Ubuntu und Mint.
  1355. # * URL für Download der Config-Datei in Variable ausgelagert
  1356. # * Rückgabewert in Funktion "uploadFiles" von 2 auf 0 geändert. Wenn er da raus geht, hat ja schließlich alles geklappt.
  1357. # * Redundante Befehle bei Profil-Überprüfung vereinfacht
  1358. # * Rückgabewert bei Alias-Erzeugung, Delete und Reset mit nicht existenter Config-File von 0 auf 1 gesetzt
  1359. #
  1360. # Version: 2013-05-24   Michael Koch
  1361. # + Erzeugen, kopierung und löschen von Profilen aus dem Hauptmenü heraus möglich
  1362. # + Angabe des Zielordners in der SCP-Upload-Funktion des Hauptmenüs möglich
  1363. # * Der SCP-Upload nutzt jetzt den Dateiwähler von dialog
  1364. # * Fehlerbehandlung im SCP-Upload: Ordner statt Datei gewählt
  1365. #
  1366. # Version: 2013-05-23   Michael Koch
  1367. # + Der SSH-Schlüsselgenerator kann vom Hauptmenü aufgerufen werden
  1368. # + Profilwechsel ist jetzt auch aus dem Hauptmenü heraus möglich
  1369. # + Zusätzlich zu -p und --profil kann nun auch --profile benutzt werden
  1370. # + Profile können mit -p (--profil | --profile) ohne weitere Argumente aufgelistet werden
  1371. # + Profile können mit -c (--copy) kopiert,
  1372. # + ... mit -m (--move) verschoben (umbenannt)
  1373. # + ... und mit -a (--alias) in ein neues Profil verlinkt werden
  1374. # * Konfiguration des Skripts an den Anfang verschoben
  1375. # * Fehler in Uplaod-Funktion behoben
  1376. # * Fehler in Profilverwaltung behoben: Wollte Dateien hochladen, die nicht angegeben wurden
  1377. # * Weitere Unschönheiten und Bugs behoben
  1378. #
  1379. # Version: 2013-05-22   Michael Koch
  1380. # * Upload in eigene Funktion ausgelagert
  1381. # + Upload-Funktion auf die Profile ausgeweitet (erstmal nur Einzeldateien möglich)
  1382. #
  1383. # Version: 2013-05-17   Sebastian Lehne
  1384. # + Synchronisation über Unison ermöglicht
  1385. #
  1386. # Version: 2013-03-15_1 Michael Koch
  1387. # * Erstellung der temporären Datei erst _nach_ Auflösen der Abhängigkeiten (ansonsten wäre Eintrag in Abhängigkeitsprüfung obsolet)
  1388. #
  1389. # Version: 2013-03-15   Sebastian Lehne
  1390. # + Überprüfung auf installation von mktemp eingebaut. Müsste eigentlich überall vorhanden sein, da Teil der CoreUtils.
  1391. # * Temp-Datei hat keinen festen Namen mehr, sondern wird über mktemp angelegt. Somit ignoriert sie nichtmehr die Systemvorgabe.
  1392. #
  1393. # Version: 2013-01-23   Michael Koch
  1394. # + Unterstützung für verschiede Linux-Distributionen und sogar Mac OS X (über Macports)
  1395. # + Überprüfung und Installation der Abhängigkeiten (u.a. dialog, wget, openssh, sshfs, vi)
  1396. # + Überprüfung, ob das Programm im Terminal ausgeführt wird (und ggbf. im Terminal starten)
  1397. #
  1398. # Version: 2013-01-02   Michael Koch
  1399. # + Unterstützung für Profile
  1400. # + Kommandozeilenoptionen für Profilmanagement hinzugefügt
  1401. #
  1402. # Version: 2012-12-21   Sebastian Lehne
  1403. # + Portliste für SSH-Tunnel um Ports für SSH und SMTP ergänzt
  1404. # - Verzeichniswechsel zu Beginn des Scripts entfernt
  1405. # * Speichern der heruntergeladenen Config-File mit vorbestimmtem Namen (bisher einfach in aktuellem Verzeichnis)
  1406. # * Adresse des Configfiles beim editieren von selbigem nun aus Variable ausgelesen (bisher Hardcoded)
  1407. # * Senden von Files mittels scp funktioniert nun sowohl mit absoluten als auch relativen Pfadangaben
  1408. # * Portknocking in Funktion "knockknock" ausgelagert (nur "knock" wird als Befehl interpretiert)
  1409.  
  1410. ########## Known Bugs ##########
  1411. # - #0001 Microsoft has a majority market share (confirmed, critical)
  1412. # X #0002 Wurde ein Profil über den parameter -p angegeben, lässt sich nur eine Datei per scp übertragen. (confirmed, uncritical, fixed)
  1413. # X #0003 Das Kopieren von Dateien über den SCP-Eintrag im Menü funktioniert nicht, da die Auswahl auf /home/ verweist, worin sich in der Regel nur Ordner befinden, die aber nach Aussage des Scripts nicht kopiert werden können. Betreten kann man diese auch nicht. Lösungsvorschlag: Warum auf /home/ verweisen? Das aktuelle Verzeichnis wäre doch sinnvoller. (fixed)
  1414. # X #0004 Schickt man mehrere Dateien an ein und das selbe Ziel, muss man für jede Datei das SSH-Passwort, bzw das PW für den RSA-Key eingeben. (fixed)
  1415. # X #0005 Leerzeichen im Pfad der Config-Datei führen zu einem nicht einlesen der Config-Datei.
  1416. # X #0006 Anlegen von Verzeichnissen als SFTP-Mountpoint außerhalb des Home-Verzeichnisses wird hardcoded mit "sudo" gemacht. (fixed)
  1417. # - #0007 Die Versionskontrolle kontrolliert nur, ob die Version bei Pastebin eine andere ist, nicht ob es auch eine neuere ist. Man bekommt also auch ein "Downgrade" als Update angeboten.
  1418. # - #0008 Das Installieren von noch fehlenden Paketen funktioniert nur wirklich zuverlässig mit Ubuntu und Debian; andere Paketnamen bei anderen Distros werden nicht berücksichtigt, daher ist u.U. manuelles Installieren von Abhängigkeiten nötig.
  1419. #
  1420. ################################
Advertisement
Add Comment
Please, Sign In to add comment