SniperRifle
02.09.04, 21:59
Hallo zusammen,
ich habe ein Skript, welches mehrere passwortfreie SSH-Logins benötigt. Das Skript laufe z.B. als "userA" auf "rechnerA". Dieser userA braucht passwortfreies SSH zu "userB" auf "rechnerB". Und dieser userB braucht passwortfreies SSH zu "userC" auf "rechnerC".
Zusammengefasst:
userA@rechnerA ---> userB@rechnerB ---> userC@rechnerC
Das ganze mache ich mit public-Key-Austausch und ist auch überhaupt nicht problematisch.
Das eigentliche Problem ist folgendes:
Meine Skripte arbeiten mit sehr vielen Rechnern, d.h. es müssen jede Menge Keys ausgetauscht werden. Um das wenigstens etwas zu vereinfachen, wollte ich mir ein Skript schreiben, dem ich als Parameter userB, rechnerB, userC, rechnerC übergebe, das mich nur noch einmal nach den Passwörtern fragt und damit die Keys austauscht (und gleichzeitig noch ein anderes Skript auf die Rechner kopiert und ausführt). Außerdem fragt es ggf. ob Keypaare erzeugt werden sollen, falls diese noch nicht existieren.
Der erste Keytausch ist kein Problem:
cat $HOME/.ssh/identity.pub | ssh -1 -l$1 $2 '[ -r .ssh/ ] || { mkdir .ssh; chmod 700 .ssh; }; cat >> .ssh/authorized_keys'
wobei $1 == userB und $2 == rechnerB
Beim zweiten wirds schwieriger:
Das Skript, was auf rechnerA läuft, muss den Public-Key von rechnerB nach rechnerC bringen. Bisher hab ich das so:
ssh -1 -l$1 $2 cat \$HOME/.ssh/identity.pub | ssh -1 -l$1 $2 "ssh -1 -l$3 $4 '[ -r .ssh/ ] || { mkdir .ssh; chmod 700 .ssh; }; cat >> .ssh/authorized_keys' "
Das funktioniert, solange die Host-Key von rechnerC auf rechnerB schon verifiziert wurde. Dann werde ich nach einem PW gefragt und der Public-Key wird einwandfrei von B nach C übertragen.
Ist der Host-Key allerdings noch nicht verifiziert, bekomme ich keine Frage danach, auf die ich mit "yes" antworten könnte, sondern nur die Meldung "Host key verification failed" und das wars.
Ich vermute mal, dass das daran liegt, dass ssh bei Kommandoübergabe eine nichtinteraktive Shell verwendet, bin aber nicht ganz sicher. Und eine Lösung dafür fällt mir auch nicht ein. Deshalb frage ich nun euch :) Hoffe ihr könnt mir dabei helfen.
Gruß
Christian
PS: "ssh-copy-id" bringt genau das gleiche Ergebnis.
ich habe ein Skript, welches mehrere passwortfreie SSH-Logins benötigt. Das Skript laufe z.B. als "userA" auf "rechnerA". Dieser userA braucht passwortfreies SSH zu "userB" auf "rechnerB". Und dieser userB braucht passwortfreies SSH zu "userC" auf "rechnerC".
Zusammengefasst:
userA@rechnerA ---> userB@rechnerB ---> userC@rechnerC
Das ganze mache ich mit public-Key-Austausch und ist auch überhaupt nicht problematisch.
Das eigentliche Problem ist folgendes:
Meine Skripte arbeiten mit sehr vielen Rechnern, d.h. es müssen jede Menge Keys ausgetauscht werden. Um das wenigstens etwas zu vereinfachen, wollte ich mir ein Skript schreiben, dem ich als Parameter userB, rechnerB, userC, rechnerC übergebe, das mich nur noch einmal nach den Passwörtern fragt und damit die Keys austauscht (und gleichzeitig noch ein anderes Skript auf die Rechner kopiert und ausführt). Außerdem fragt es ggf. ob Keypaare erzeugt werden sollen, falls diese noch nicht existieren.
Der erste Keytausch ist kein Problem:
cat $HOME/.ssh/identity.pub | ssh -1 -l$1 $2 '[ -r .ssh/ ] || { mkdir .ssh; chmod 700 .ssh; }; cat >> .ssh/authorized_keys'
wobei $1 == userB und $2 == rechnerB
Beim zweiten wirds schwieriger:
Das Skript, was auf rechnerA läuft, muss den Public-Key von rechnerB nach rechnerC bringen. Bisher hab ich das so:
ssh -1 -l$1 $2 cat \$HOME/.ssh/identity.pub | ssh -1 -l$1 $2 "ssh -1 -l$3 $4 '[ -r .ssh/ ] || { mkdir .ssh; chmod 700 .ssh; }; cat >> .ssh/authorized_keys' "
Das funktioniert, solange die Host-Key von rechnerC auf rechnerB schon verifiziert wurde. Dann werde ich nach einem PW gefragt und der Public-Key wird einwandfrei von B nach C übertragen.
Ist der Host-Key allerdings noch nicht verifiziert, bekomme ich keine Frage danach, auf die ich mit "yes" antworten könnte, sondern nur die Meldung "Host key verification failed" und das wars.
Ich vermute mal, dass das daran liegt, dass ssh bei Kommandoübergabe eine nichtinteraktive Shell verwendet, bin aber nicht ganz sicher. Und eine Lösung dafür fällt mir auch nicht ein. Deshalb frage ich nun euch :) Hoffe ihr könnt mir dabei helfen.
Gruß
Christian
PS: "ssh-copy-id" bringt genau das gleiche Ergebnis.