SSH Connection GUI

Shellscript  (17.04.2010 15:40) Ein kleines Script was auf dem ncurses Kit »dialog« und dem Terminal Emulator urxvt mit Tabs basiert. Es bietet eine Oberfläche zum auswählen einer SSH Verbindung. Drückt man Enter, öffnet sich die jeweilige Verbindung mit Hilfe von xdotool in einem neuen Tab.

Demo: http://www.youtube.com/watch?v=XIQ2lXlgAMk
Abhängigkeiten: urxvt mit Tabs, ssh, xdotool, dialog, vim
Letztes Update: 29.09.2010 21:05

Die Verbindungsdaten werden aus einer Textdatei gelesen. Diese muss im Hauptscript in der Variable $CONNECTION_FILE angegeben werden.
Das Script befindet sich noch in der Entwicklung, weswegen keine Funktionsfähigkeit garantiert werden kann!

Quellcode (ausblenden | aufklappen)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
#~ Textdatei remotegui.accounts ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
# Definition der Verbindungen fuer die SSH Connection GUI
#
# Schema:
# name ; beschreibung ; ssh root@local -p 1234 -i keyfile
# Der Name muss einzigartig sein! Ueber diesen wird der passende Befehl gesucht.
#
# Leerzeile:
# --
#
# ========================================================================================================
 
# SSH Accounts
root@dev.local      ; Entwickler VM @VirtualBox ; ssh root@dev.local
www-data@dev.local  ; Entwickler VM @VirtualBox ; ssh www-data@dev.local
 
--
 
# htop Systemmonitor
htop local               ; htop on »localhost«                 ; htop
htop dev.local           ; htop on »dev.local«                 ; ssh -t root@dev.local htop
 
#~ Hauptscript ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
#!/bin/bash
#------------------------------------------------------------------------------------------------
# Hauptscript fuer die SSH Connection GUI
# (c) 2010 by Christian Blechert (www.blechert.name)
# Veroeffentlicht unter der Creative Commons License (www.creativecommons.org/)
 
#- Konfiguration---------------------------------------------------------------------------------
 
#--> Temp Datei welche in neuem Tab gestartet wird
_exectemp="/tmp/ssh_remote_gui_exec.$$"
#--> Datei mit den Eintraegen des Hauptmenues
CONNECTION_FILE="$HOME/.scripts/remotegui/remotegui.accounts"
#--> Ausgabe vor Ausfuehrung des Befehls
HEADER="echo -e '\033[1;33mBaue Verbindung zu \033[0;31m-host- \033[1;33mauf... \n\033[1;33mBefehl: \033[0;31m-command-\033[1;33m ...\033[0m';echo;"
#--> Ausgabe nach Ausfuehrung des Befehls
FOOTER="echo; echo -e '\033[1;33mBeendet. \033[0m';"
 
#--> Abmessungen des Hauptmenues
if [ "$1" == "child" ]; then
   WIDTH=100
   HEIGHT=30
 
#--> Abmessungen des Urxvt Fensters
else
   WIDTH=182
   HEIGHT=200
fi
 
#------------------------------------------------------------------------------------------------
 
 
#- Funktionen------------------------------------------------------------------------------------
 
# Ueberprueft alle Abhaengigkeiten
# @param $1 Programmname
#
BINARYS="1"
checkbinary() {
 
   if `which $1 &> /dev/null`; then
      echo -e "$1: [\033[1;32mgefunden\033[0m]";
   else
      echo -e "$1: [\033[0;31mnicht gefunden\033[0m]";
      BINARYS="0"
   fi
 
}
 
 
# Oeffnet einen Befehl in einem neuen Fenster
# @param $1 Name/Beschreibung des Befehls
# @param $2 Der Befehl
#
exec_command() {
 
   TEMP="$(echo $HEADER | sed "s#-host-#$1#g" | sed "s#-command-#$2#g") time $2; $FOOTER"
   echo "#!/bin/bash" > $_exectemp
   echo "clear" >> $_exectemp
   echo $TEMP >> $_exectemp
   echo "sleep 3" >> $_exectemp
   chmod u+x $_exectemp
 
#echo $_exectemp
#sleep 10
 
   xdotool key Shift_L+Down
   sleep 1;
   #xdotool type --delay 0 $_exectemp ";" "exit"
   xdotool type $_exectemp ";" "exit"
   xdotool key Return
 
}
 
# Zeigt eine Fehlermeldung
# @param $1 Die Fehlermeldung
#
msg_error() {
   dialog --title "Fehler" --msgbox "\n $1" 10 80;
}
 
# Zeigt eine Information
# @param $1 Die Information
#
msg_info() {
   dialog --title "Information" --msgbox "\n $1" 10 80
}
 
# Generiert das Hauptmenu
#
mainmenu() {
 
   #--> Menueintraege auslesen
   DIALOG_MENU=""
   while read LINE; do
      LINE=$(echo $LINE | awk '{gsub(/^ +| +$/,"")}1')
      if [ ! "${LINE:0:1}" == "#" ] && [ ! "$LINE" == "" ]; then
 
         #--> Einen Eintrag hinzufuegen
         if [ "$(echo $LINE | grep -o ";" | wc -l)" -gt 1 ]; then
            while IFS=";" read -ra ADDR; do 
               name=$(echo ${ADDR[0]} | awk '{gsub(/^ +| +$/,"")}1')
               desc=$(echo ${ADDR[1]} | awk '{gsub(/^ +| +$/,"")}1')
               DIALOG_MENU="${DIALOG_MENU} \"$name\" \"$desc\""
            done <<< "$LINE"
 
        #--> Eine Leerzeile einfuegen
        elif [ "$LINE" == "--" ]; then
            DIALOG_MENU="${DIALOG_MENU} \"\" \"\""
 
        fi
      fi
   done < $CONNECTION_FILE
 
   #--> Hauptmenu anzeigen
   eval input=\`dialog --stdout --backtitle "\"SSH Server Connection GUI\"" --title "\" Verfuegbare Zugaenge \"" --cancel-label "\"Beenden\"" --help-button --help-label "\"Bearbeiten\"" --extra-button --extra-label "\"Neu laden\"" --menu "\"SSH Account auswaehlen und [Enter] druecken\"" $HEIGHT $WIDTH $HEIGHT $DIALOG_MENU\`
 
   #--> Status - Eintrag? Bearbeiten? Neu laden? Beenden?
   status="$?"
 
   #--> Befehl in neuem Tab oeffnen
   if [ "$status" == 0 ] && [ ! "$input" == ""  ]; then
 
      COMMAND=$(cat $CONNECTION_FILE | awk '{gsub(/^ +| +$/,"")}1' | grep -E "^$input[ ]*;" | cut -d ";" -f 3 | awk '{gsub(/^ +| +$/,"")}1')
 
      if [ ! "$COMMAND" == "" ]; then
         exec_command "$input" "$COMMAND"
      else
         msg_error "Befehl nicht in Liste gefunden!"
      fi
 
   #--> Eintraege mit vim bearbeiten
   elif [ "$status" == 2 ]; then
 
vim $CONNECTION_FILE
      exec_command "" "dialog --title \"Information\" --msgbox \"\n Die Eintraege werden mit Vim bearbeitet.\n Eine Anleitung zu Vim gibt es mit dem Befehl »man vim«.\" 10 80; vim $CONNECTION_FILE; clear"
      msg_info "Falls Aenderungen vorgenommen wurden, werden diese jetzt geladen!"
 
   #--> Eintraege neu laden
   elif [ "$status" == 3 ]; then
      
      msg_info "Lade Eintraege neu..." &
      sleep 1;
      xdotool key Return;
 
   #--> GUI Beenden
   elif [ "$status" == 1 ]; then
      exit 0;
 
   #--> Fehlerhafte Abfrage
   elif [ ! "$input" == "" ]; then
      msg_error "Ungueltige Option! (Falsch konfiguriert?)"
   fi
 
}
 
 
 
#- Programmablauf--------------------------------------------------------------------------------
 
#--> Hauptmenu aufrufen
if [ "$1" == "child" ]; then
  
   echo;
   sleep 1
   while true; do
      mainmenu;
   done
 
#--> Script starten, Abhaengigkeiten pruefen
else
 
   clear
 
   echo
   echo -e "\033[0;35mWillkommen zur SSH Connection GUI! \033[0m"
   echo -e "\033[0;35m(c) 2010 by Christian Blechert (www.blechert.name) \033[0m"
   echo -e "\033[0;35mVeroeffentlicht unter der Creative Commons License (www.creativecommons.org/)\033[0m"
   echo
   echo -e "\033[1;33mUeberpruefe ob alle benoetigten Programme vorhanden sind...\033[0m"
 
   #--> Abhaengigkeiten
   checkbinary urxvt
   checkbinary dialog
   checkbinary ssh
   checkbinary vim
   checkbinary xdotool
 
   if [ "$BINARYS" == "0" ]; then
      echo
      echo -e "\033[0;31mEinige Programme wurden nicht gefunden!\033[0m"
      exit 1;
   fi
 
   echo
   echo -e "\033[1;33mStarte urxvt... \033[0m"
 
   #--> Urxvt starten
   /bin/bash -c "urxvt -title \"SSH Connection GUI\" -geometry ${WIDTH}x${HEIGHT}+1000+500 -tint black -sh 1 -pe tabbed -e bash -c \"$0 child\""
 
fi