www.mikrocontroller.net

Forum: PC Hard- und Software Shell Skript User Input an Programm übergeben


Autor: funky (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich möchte per Shell Script ein Passwort mit passwd setzen.

Habe deshalb
passwd <<END
root
root
END

verwendet, aber das funktioniert nicht. Ich vermute mal, die Eingabe 
wird irgednwie zu schnell gemacht und es wird angemeckert das die 
Passwörter nicht identisch seien?!

Kann man zwischen den Eingaben eine kleine Pause einfügen? Oder wie 
könnte man das Problem sonst lösen?

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nein, da brauchst du keine Pause, das würde nichts ändern.

Eigentlich sollte es so gehen.

Ich habe es in der Kommandozeile probiert (als root):
root@i4a:/etc # passwd <<EOF
> ganzneu
> ganzneu
> EOF
Geben Sie ein neues UNIX-Passwort ein: Geben Sie das neue UNIX-Passwort erneut ein: passwd: Passwort erfolgreich geändert
Das hat geklappt, das PW wurde geändert.

Als Skript funktioniert es auch:
#!/bin/bash
#
# Time-stamp: "15.09.10 11:12 testpw root?wachtler.de"

passwd <<EOF
neu
neu
EOF

Du bist dir bewusst, daß du mit passwd ohne Parameter das PW des gerade 
aktuellen Benutzers änderst?
Ansonsten könntest du als root aufrufen: passwd benutzername
Dann wird das PW dieses Benutzers geändert.

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> root@i4a:/etc # passwd <<EOF
----------------^

Du hast es als root probiert (Du hast Dich ja sicher extra für die 
Antwort hier als root eingeloggt, denn dauernd als root eingeloggt zu 
sein ist bekanntlich böse).

Als Nicht-root wird zunächst das derzeitige Passwort abgefragt.  Zwei 
Zeilen als Antwort reichen dann nicht (drei werden benötigt) und das 
Skript muss deshalb in der normalen Anwendung scheitern.  Denn wer 
ändert schon das root-Passwort per Skript.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hc Zimmerer schrieb:
> Du hast es als root probiert (Du hast Dich ja sicher extra für die
> Antwort hier als root eingeloggt, denn dauernd als root eingeloggt zu
> sein ist bekanntlich böse).

Für so etwas habe ich ein xterm mit su - als root laufen.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Meiner Erinnerung nach liest passwd nicht von stdin, sondern direkt
von /dev/tty.  Kannst ja mal im Sourcecode nachgucken.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
und was ist /dev/tty ?
Wenn ich jeweils "abc", "def" und ^D eingebe, bekomme ich:
klaus@i4a:~ > cat
abc
abc
def
def
klaus@i4a:~ > cat </dev/tty
abc
abc
def
def

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jörg Wunsch schrieb:
> Meiner Erinnerung nach liest passwd nicht von stdin, sondern direkt
> von /dev/tty.  Kannst ja mal im Sourcecode nachgucken.

Das hatte ich auch so in Erinnerung und habe das sicherheitshalber vor 
meinem Posting überprüft.  Bei einem aktuellen Linux (Debian, Ubuntu) 
ist es nicht (mehr?) so:

passwd <<EOF
meinAktuelles
dasNeue
dasNeue
EOF

funktioniert.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klaus Wachtler schrieb:
> und was ist /dev/tty ?

Das "controlling terminal" des Prozesses.

man 4 tty

Habe mal versucht, das im FreeBSD-Sourcecode zu finden, ist mir
aber nicht gelungen.  Das geht mittlerweile über PAM derart
verschlungene Pfade, dass ich da nicht durchgeblickt habe...

Hmm, nö, ich hab's mal durch ktrace geschickt, das geht mittlerweile
in der Tat von stdin.  War wohl in einem früheren Leben ;), dass da
direkt von /dev/tty gelesen wurde.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hc Zimmerer schrieb:
> Das hatte ich auch so in Erinnerung

Dann sind wir zumindest zwei. :-)

Scheint durch PAM halt alles ganz anders geworden zu sein.

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oha, eben auf diesem System (das dritte) nochmal probiert.  Da kommt 
„passwd: Authentication token manipulation error“.  Erklärung dafür habe 
ich keine.  Ich nehme also sicherheitshalber alles zurück.

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jörg Wunsch schrieb:
> Klaus Wachtler schrieb:
>> und was ist /dev/tty ?
>
> Das "controlling terminal" des Prozesses.

Du kannst /dev/tty z.B. dazu verwenden, um bei einem Skript oder 
Programm, dessen stdin und/oder stdout, stderr umgeleitet ist, doch noch 
an die Tastatur und Schirm ranzukommen.

Autor: funky (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hmm,

> Denn wer ändert schon das root-Passwort per Skript.
also nur als Hintergrund: das ist für ein Embedded System und zu Anfang 
ist da Standardmässig kein root-PW gesetzt, was ich dann eben mit einem 
Installskript nachholen will.

Das Skript wird als root ausgeführt, und so wie ich es gemacht habe 
funktionierte es eben leider nicht.
Muss dann wohl nochmal rumprobieren...hatte schon öfters das Problem das 
einige der Tools sich etwas anders verhalten haben, als z.b. bei einer 
richtigen Debianinstallation...was weiss ich was für Sourcen die da 
teilweise verwendet haben :(

aber vielleicht ändert es etwas wenn ich passwd explizit für root 
aufrufe per Parameter...muss ich nochmal probieren

Autor: funky (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

passwd root <<END
> root
> root
> END
Enter new UNIX password: Retype new UNIX password: Sorry, passwords do not match
passwd: Authentication information cannot be recovered
passwd: password unchanged

das meldet mir passwd

Autor: funky (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
achso, rufe ich passwd ganz normal auf und mache selber die Eingabe, 
dann klappt das Passwort ändern problemlos

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
funky schrieb:
> also nur als Hintergrund: das ist für ein Embedded System und zu Anfang
> ist da Standardmässig kein root-PW gesetzt, was ich dann eben mit einem
> Installskript nachholen will.

Dann wäre usermod -p möglicherweise das Tool der Wahl.  Das ist für die 
Verwendung in solchen Skripten gedacht.  Es benötigt allerdings das 
fertig verschlüsselte statt des Klartextpassworts.  Entweder Du besorgst 
Dir dieses aus einer vorhandenen Installation oder bastelst was mit 
crypt(3) drumherum.

Eine andere Möglichkeit, um Userinput vorzugaukeln, ist expect (Teil von 
Tcl).

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hc Zimmerer schrieb:
> Entweder Du besorgst
> Dir dieses aus einer vorhandenen Installation oder bastelst was mit
> crypt(3) drumherum.

perl -e 'sub salt {@x=("a".."z","A".."Z","0".."9");\
 return $x[int(rand(62))]}\
 print crypt($ARGV[0], salt().salt()) . "\n"' hi

"hi" ist dabei das Passwort.

Autor: funky (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hmm...ich habe mir jetzt einfach mal den Hash aus der "/etc/passwd" 
kopiert und testweise mit "usermod" gesetzt...danach konnte ich mich 
auch noch einloggen und es scheint zu funktionieren


mich wundert nur etwas, das "passwd" mir für das gleiche Passwort 
jedesmal einen anderen Hash produziert?! Dachte zu jedem Passwort gibt 
es nur einen einzigen Hash...raff gerade nicht wie das ganze dann 
überhaupt funktioniert

mal sehen ob das ganze auch noch funktioniert, wenn ich den Hash auf 
einem anderen Rechner mit "usermod" setze

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Google mal nach „Salt“ im Zusammenhang mit passwd oder crypt (oder schau 
Dir einfach an, wie Jörgs Perlskript den Salt generiert und verwendet).

Autor: A. B. (funky)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
salt ist mir schon ein Begriff...aber mir schwant, das dieser Salt dann 
Rechnerspezifisch ist...würde sonst ja nicht so viel Sinn machen. Und 
das würde bedeuten, das die Hashs nicht einfach austauschbar wären

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Salt ist nicht rechnerspezifisch.  Er ist rein zufällig (na ja, so 
rein zufällig halt, wie der Rechner Zufall erzeugen kann).  Er soll die 
Suppe einfach so versalzen, dass gleicher Ursprung nicht mehr erkennbar 
und zurück-berechenbar ist.  Man muss den Ursprung schon kennen und 
genau gleich versalzen, um dasselbe Ergebnis zu erzielen.

Autor: A. B. (funky)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
oh...ok ich seh gerade das ich mir das doch nochmal genauer durchlesen 
muss

Autor: A. B. (funky)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
achso ok, hab jetzt gerade gelesen, das der Salt in der /etc/passwd 
selber mitgespeichert wird. Dann raff ich es doch :)

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die wesentliche Idee hinter dem Salt ist, dass man nicht einfach
durch das Ansehen der gecrypteten Passwörter bereits feststellen
kann, dass zwei Nutzer das gleiche Passwort haben.  Das rührt vor
allem noch aus der Zeit, da jeder Nutzer die verschlüsselten
Passwörter der anderen Nutzer beliebig einsehen konnte (wie es ja
bei "plain NIS" immer noch der Fall ist).

Autor: olibert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

fuer sowas verwendet man normalerweiser einen expect script. Dieser 
wartet auf ein bestimmtes Token (wie "password:") und fuehrt dann das 
Passwort zu.

Siehe man expect (falls schon installiert). Damit kann man auch 
schwierige Faelle, wie ein SSH-Passwort zufuehren.

Bei aktuellen Linux-Installationen wird mit MD5 verschluesselt und nicht 
mehr mit DES. Also nichts mehr mit dem Basteln mit Salt.

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dafür führen die Passwörter dann aber ein Schattendasein in der 
shadow-Datei, wohingegen in der /etc/passwd nichts mehr steht.

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
olibert schrieb:
> Bei aktuellen Linux-Installationen wird mit MD5 verschluesselt und nicht
> mehr mit DES. Also nichts mehr mit dem Basteln mit Salt.

Salt und MD5 sind keine Widersprüche.  Das oben genannte crypt(3) in 
allen modernen Unixen (incl. Linux) vereint beides, und zwar nicht 
trotz, sondern mit und in Abhängigkeit vom Salt.  Das Salt ist nach wie 
vor fester Bestandteil.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hc Zimmerer schrieb:
> Das oben genannte crypt(3) in
> allen modernen Unixen (incl. Linux) vereint beides

Man muss dann nur im Salt bereits andeuten, dass man die MD5-
Variante haben will:

perl -e 'sub salt {@x=("a".."z","A".."Z","0".."9");\
 return $x[int(rand(62))]}\
 print crypt($ARGV[0], "\$1\$".salt().salt()) . "\n"' hi

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, genau.  Deshalb das „in Abhängigkeit vom Salt“.  SHA kommt ja auch 
noch hinzu (zumindest bei den meisten).  Alle Methoden haben aber den 
Salt gemeinsam, somit kein

> Also nichts mehr mit dem Basteln mit Salt.

sondern ein „Doch“.  So war's gemeint.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.