staging.inyokaproject.org

SSH - Keygen & RSA-Authentication Script

Status: Ungelöst | Ubuntu-Version: Ubuntu 10.04 (Lucid Lynx)
Antworten |

Metal-Warrior

Anmeldungsdatum:
29. November 2010

Beiträge: Zähle...

Hallo Leute!

Als ich mich vor ein paar Monaten in die Sache eingewurstelt hab, fand ich das ziemlich komplex für einen Frischling. Und nachdem ich es jetzt öfter machen muss, hab ich mir in guter alter Linux-Manier ein Script dafür geschrieben. Offenbar hat da noch niemand dran gedacht gehabt. Außerdem will ich der Community auch was zurückgeben, wenn ich schon ein kostenloses OS verwenden darf ☺

Was tut das Ding?

  • Nach den wichtigsten Optionen für ssh-keygen fragen und diese übergeben

  • Auf Wunsch zu einem Server Kontakt aufnehmen und ~/.ssh/authorized_keys schreiben

  • Eigene ~/.ssh/config anlegen und die Verbindung konfigurieren

  • Für die Interaktion mit dem User wird Zenity verwendet

Lest es bitte mal Korrektur (meine Tests waren alle erfolgreich - ihr seid dran 😉). Ach, und falls jemand noch Wünsche hat, sagt mir das bitte. Ich will ja auch was lernen dabei ☺

So, reden kann jeder, hier der Code:

  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
#!/bin/sh

# ===================== SSH Keygen & RSA-Authentication ======================

# Grapical frontend for SSH key generation and sharing (configuring
# server and client to use RSA-authentication)

# --------------------- Prelude ----------------------------------------------

echo "======================= SSH Keygen & RSA-Authentication =======================\n"
# Please update the version number in what you feel a useful manner if you
# improve this script
echo "Version: 0.9 (Beta)"

# Please add your information if you contributed to this work and wish to be
# named
echo "Author:"
echo "    Metal_Warrior (http://ubuntuusers.de/user/Metal-Warrior/)"
echo "\nIf you find bugs or something missing, feel free to edit and or contact me :)"

# I felt it a good idea to publish it under a CC BY-SA license, but we may
# argue about that
echo "\nPublished under CC BY-SA\nhttp://creativecommons.org/licenses/by-sa/3.0/"

# --------------------- Text -------------------------------------------------
KeyGen="Schlüsselpaar-Optionen"
KeyAlg="Algorithmus wählen"
KeyBit="Bitlänge des Schlüssels auswählen"
KeyFil="Gewünschten Namen der Schlüsseldatei eingeben:"
KeySha="Key-Sharing-Optionen"
KeySh1="Soll der Schlüssel für den Login\nan einem Server verwendet werden?"
KeyShH="Hostnamen oder IP-Adresse eingeben:"
KeyShU="Usernamen für den Host eingeben:"
KeyShN="Name für die Verbindung:"
KeyShF="Muss der Ordner ~/.ssh auf dem Host angelegt werden?"
KeyFin="Der Schlüssel wurde unter ~/.ssh abgelegt"
KeyCa1="Abbruch gewählt"
KeyCa2="Soll Schlüsselerstellung abgebrochen werden?"
KeyErr="Ein Fehler ist bei der Schlüsselerstellung aufgetreten!"
KeyShC="Hinzufügen der Verbindung zu ~/.ssh/config fehlgeschlagen"
KeyShE="Ein Fehler ist bei der Kommunikation\nmit dem Host aufgetreten!"
KeyShS="Der Keyaustausch war erfolgreich"

# --------------------- Functions --------------------------------------------

# Asks for Algorithm to use
FunAlg ()
{
KAlg=$(zenity --title="$KeyGen" \
    --list --radiolist --text="$KeyAlg" \
    --column="" --column="Algorithmus" \
    TRUE "rsa" \
    FALSE "rsa1" \
    FALSE "dsa")
KRet=$?
return
}

# Asks for key length
FunBit ()
{
if [ "$KAlg" != "dsa" ]
 then KBit=$(zenity --title="$KeyGen" \
    --list --radiolist --text="$KeyBit" \
    --column="" --column="Bitlänge" \
    FALSE "768" \
    FALSE "1024" \
    TRUE "2048" \
    FALSE "4096")
 KRet=$?
elif [ "$KAlg" = "dsa" ]
 then KBit="1024"
 KRet="0"
fi
return
}

# Asks for name of key file
FunFil ()
{
if [ "$KAlg" = "dsa" ]
 then while [ "$KFil" = "" -a "$KRet" = "0" ]
  do
   KFil=$(zenity --entry --title="$KeyGen" --text="$KeyFil" \
     --entry-text="id_dsa")
   KRet=$?
  done
elif [ "$KAlg" = "rsa" -o "$KAlg" = "rsa1" ]
 then while [ "$KFil" = "" -a "$KRet" = "0" ]
  do
   KFil=$(zenity --entry --title="$KeyGen" --text="$KeyFil" \
     --entry-text="id_rsa") 
   KRet=$?
  done
fi
return
}

# Asks for Host information
FunSh1 ()
{
zenity --question --title="$KeySha" --text="$KeySh1"
KRet=$?
while [ "$KRet" = "0" -a "$KShU" = "" ]
 do 
  KShH=$(zenity --entry --title="$KeySha" --text="$KeyShH")
  if [ "$KShH" != "" ] 
   then KShU=$(zenity --entry --title="$KeySha" --text="$KeyShU")
   KRet=$?
  fi
 done
return
}

# Writes the local ~/.ssh/config
FunSh2 ()
{
while [ "$KShN" = "" -a "$KRet" = "0" ]
do
KShN=$(zenity --entry --title="$KeySha" --text="$KeyShN")
KRet=$?
done
if [ "$KRet" = "0" ]
 then echo "
# Script generated login keybind
Host $KShN
	HostName $KShH
	User $KShU
	IdentityFile ~/.ssh/$KFil" >> config
 KRet=$?
 if [ "$KRet" = "1" ]
  then zenity --info --title="$KeySha" --text="$KeyShC"
 fi
fi
return
}

# Shares the public key with the server (authorized_keys file)
FunSh3 ()
{
KRet="0"
KShL="$KShU@$KShH"
zenity --question --title="$KeySha" --text="$KeyShF"
KShF=$?
if [ "$KShF" = "0" ]
 then ssh $KShL mkdir -p .ssh
 KRet=$?
fi
if [ "$KRet" = "0" ]
 then cat $KFil.pub | ssh $KShL 'cat >> .ssh/authorized_keys'
 KRet=$?
fi
if [ "$KRet" = "0" ]
 then zenity --info --title="$KeySha" --text="$KeyShS"
else
 zenity --warning --title="$KeySha" --text="$KeyShE"
 KRet="1"
fi
return
}

# Asks if user wants to quit
FunRet ()
{
KRun="0"
if [ "$KRet" = "1" ]
 then zenity --question --title="$KeyCa1" --text="$KeyCa2"
  if [ "$?" = "0" ]
   then exit
  fi
  KRun="1"
  KRet="0"
fi
return
}

# --------------------- Body -------------------------------------------------

# Asking for keygen settings
KRun="1"
while [ "$KRun" = "1" ]
do
FunAlg
FunRet
done
KRun="1"
while [ "$KRun" = "1" ]
do
FunBit
FunRet
done
KRun="1"
while [ "$KRun" = "1" ]
do
FunFil
FunRet
done

# Generating key
cd ~/.ssh/
ssh-keygen -q -b $KBit -t $KAlg -f $KFil
KRet=$?
if [ "$KRet" = "1" ]
 then zenity --warning --title="$KeyGen" --text="$KeyErr"
 exit
else zenity --info --title="$KeyGen" --text="$KeyFin"
fi

# Sharing key and configuring RSA-Authentication
FunSh1
if [ "$KRet" = "0" ]
 then FunSh2
 FunSh3
fi

Ich glaube, man erkennt ein bisschen C und Pascal - das bisschen, was ich mal hatte 😀

Grüße Metal_Warrior

P.S.: Eigentlich ist es ein Spinoff eines derzeit laufenden größeren Projekts... ein Post-Installer. Mir geht nämlich die Nachkonfiguration auch schon auf den Sack 😀 DAS Script ist aber noch weit von Beta entfernt...

Keba Team-Icon

Ehemalige
Avatar von Keba

Anmeldungsdatum:
24. Juli 2007

Beiträge: 3802

Hallo,

Ich werd das Programm wohl nicht nutzen, aber es könnte wohl für den ein oder anderen brauchbar sein. Das Skript hab ich mir trotzdem mal angesehen, da:

Metal-Warrior schrieb:

Ich will ja auch was lernen dabei ☺

So, reden kann jeder, hier der Code:

1
2
3
# Please update the version number in what you feel a useful manner if you
# improve this script
echo "Version: 0.9 (Beta)"

Da musste ich schon schmunzeln ☺

1
2
3
# I felt it a good idea to publish it under a CC BY-SA license, but we may
# argue about that
echo "\nPublished under CC BY-SA\nhttp://creativecommons.org/licenses/by-sa/3.0/"

Ich behaupte mal, dass die CC-Lizenzen nicht für Code gemacht sind. Der CC BY-SA kommt wohl am ehesten die GPL nah.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# Asks for Algorithm to use
FunAlg ()
{
KAlg=$(zenity --title="$KeyGen" \
    --list --radiolist --text="$KeyAlg" \
    --column="" --column="Algorithmus" \
    TRUE "rsa" \
    FALSE "rsa1" \
    FALSE "dsa")
KRet=$?
return
}

Kann man sich drüber streiten, aber ich finde die öffnende geschweifte Klammer gehört nach die (). Außerdem würd ich alles einrücken, dann erkennt man optisch besser wo eine Funktion ist. Ich mag es auch nicht, ein Skript zu starten, und dann graphisch über Zenity gefragt zu werden, das kann man natürlich auch Geschmackssache nennen. Außerdem ist Zenity soweit ich weiß unter Kubuntu nicht vorinstalliert.

1
2
if [ "$KAlg" != "dsa" ]
 then 

Auch mehr ne Stilfrage, aber ich finde, dass if-Abfragen ihr then noch in der ersten Zeile haben sollten: if foo; then. Gleiches gilt für Schleifen. Ist so aber natürlich nicht falsch.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
# Asking for keygen settings
KRun="1"
while [ "$KRun" = "1" ]
do
FunAlg
FunRet
done
KRun="1"
while [ "$KRun" = "1" ]
do
FunBit
FunRet
done
KRun="1"
while [ "$KRun" = "1" ]
do
FunFil
FunRet
done

Mit Einrückungen könnte man diesen Code auch gut lesen… Einrückungen solltest du generell einheitlich machen, finde ich.

Ich glaube, man erkennt ein bisschen C und Pascal - das bisschen, was ich mal hatte 😀

Keine Ahnung, nie C und Pascal geschrieben.

Allgemein mag ich CamelCase nicht, vor allem Funktionen und Variablen, die mit einem Großbuchstaben anfangen, sind doch eher selten.

P.S.: Eigentlich ist es ein Spinoff eines derzeit laufenden größeren Projekts... ein Post-Installer. Mir geht nämlich die Nachkonfiguration auch schon auf den Sack 😀 DAS Script ist aber noch weit von Beta entfernt...

Da dürfen wir ja mal gespannt sein.

Grüße, Keba.

Metal-Warrior

(Themenstarter)

Anmeldungsdatum:
29. November 2010

Beiträge: 18

Keba schrieb:

Hallo,

Ich werd das Programm wohl nicht nutzen, aber es könnte wohl für den ein oder anderen brauchbar sein. Das Skript hab ich mir trotzdem mal angesehen, da:

Das war auch der Hintergrund 😉

Da musste ich schon schmunzeln ☺

Lass mich mitlachen. Weil es noch Beta ist oder weil ich das als echo raushau? ☺

Ich behaupte mal, dass die CC-Lizenzen nicht für Code gemacht sind. Der CC BY-SA kommt wohl am ehesten die GPL nah.

AFAIK war es ziemlich wurst, was unter CC veröffentlicht wird. Hintergedanke war eigentlich, dass der Code frei bleibt. Aber vielleicht bin ich da auch etwas übervorsichtig - IANAL.

Kann man sich drüber streiten,

Also eher stilistische Veränderungen. Gut, mach ich das nächste Mal (wobei ich es persönlich leserlicher finde, wenn das then in der nächsten Zeile ist).

Stimmt, zenity ist nicht standardmäßig vorinstalliert. Ist aber dem SpinOff-Charakter zuschulden: Das Postinstall-Script fragt am Anfang mit ner Zenity-Radiolist nach der Sprache (da brauch ich dann Leute, dir mir das Französisch und Spanisch korrigieren können) und mit ner Checkliste nach den durchzuführenden Aktionen. Da gab es keine mir bekannte Alternative zu Zenity.

Mit Einrückungen könnte man diesen Code auch gut lesen… Einrückungen solltest du generell einheitlich machen, finde ich.

Stimmt, da hab ich zuletzt nicht mehr so drauf geachtet. Bei der Überarbeitung dann.

Allgemein mag ich CamelCase nicht, vor allem Funktionen und Variablen, die mit einem Großbuchstaben anfangen, sind doch eher selten.

Hat logische Gründe - wenn du dir die Variablen und Funktionen mal ansiehst, sind das fast immer zusammengesetzte Kürzel, die alle halbwegs was miteinander zu tun haben. Zum Beispiel wird "Key" vor jeden Textbaustein gesetzt, der mit dem SSH-Key in irgendeiner Form zu tun hat, "K" ist dann die Auswertung dieses Textbausteins. Und das Durcheinander von Groß und Klein ist auch logisch durchdacht:

KShH = Key Sharing Host

Ich tu mir leichter mit Variablen, wenn ich ihnen sinnvolle Bezeichnungen zuordnen kann 😉

Da dürfen wir ja mal gespannt sein.

Ich werd mir alle Mühe geben ☺

Thx fürs Feedback! Metal_Warrior

P.S.: Soll ich den Thread evl. ins Wiki verlinken? Vielleicht hilfts jemandem...

Keba Team-Icon

Ehemalige
Avatar von Keba

Anmeldungsdatum:
24. Juli 2007

Beiträge: 3802

Hallo,

Metal-Warrior schrieb:

Lass mich mitlachen. Weil es noch Beta ist oder weil ich das als echo raushau? ☺

Bezog sich auf diesen Kommentar:

1
2
# Please update the version number in what you feel a useful manner if you
# improve this script

Ich behaupte mal, dass die CC-Lizenzen nicht für Code gemacht sind. Der CC BY-SA kommt wohl am ehesten die GPL nah.

AFAIK war es ziemlich wurst, was unter CC veröffentlicht wird. Hintergedanke war eigentlich, dass der Code frei bleibt. Aber vielleicht bin ich da auch etwas übervorsichtig - IANAL.

An sich kannst du alles unter die CC stellen ja, für Code ist sie dennoch nicht wirklich geeignet, darauf sind andere Lizenzen (am prominentesten die BSD-Lizenz und die (L)GPL) eher spezialisiert. Einfach gesagt: Macht damit was du willst, nimmst du BSD, willst du zumindest noch, dass das abgewandelte Werk auch frei ist, nimm GPL. Natürlich ist das bei so einem Skript egal.

Und das Durcheinander von Groß und Klein ist auch logisch durchdacht:

KShH = Key Sharing Host

Natürlich steckt da ein System hinter, keine Frage. Eine Variable key_sharing_host wäre auch etwas lang. Trotzdem fangen Variabeln eigentlich nie mit einem Großbuchstaben an, was würde denn gegen kShH sprechen?

Grüße, Keba.

cornix Team-Icon

Avatar von cornix

Anmeldungsdatum:
9. März 2007

Beiträge: 4763

Keba schrieb:

Trotzdem fangen Variabeln eigentlich nie mit einem Großbuchstaben an

Da guck dir mal deine Umgebung mittels env an. 😉

Keba Team-Icon

Ehemalige
Avatar von Keba

Anmeldungsdatum:
24. Juli 2007

Beiträge: 3802

cornix schrieb:

Keba schrieb:

Trotzdem fangen Variabeln eigentlich nie mit einem Großbuchstaben an

Da guck dir mal deine Umgebung mittels env an. 😉

Gut, entweder ist ALLESGROSS oder es fängt mit einem Kleinbuschstaben an, hast ja recht 😉

Grüße, Keba.

Antworten |