Passwort-Eingabe

Antworten
Nachricht
Autor
pcAlko
Beiträge: 70
Registriert: 14. Mai 2007 19:27

Passwort-Eingabe

#1 Beitrag von pcAlko » 12. Feb 2009 20:07

Hallo Leute!

habe das Problem dass ich von meinem Programm aus ein Passwort abfragen will
welches der User eingeben soll.
Jedoch wird das Passwort am screen ausgegeben, was ich nicht möchte.

Habe es mit getchar(), getc(), getline(), scanf() versucht
aber immer wird das Zeichen am Bildschirm ausgegeben.

wie kann ich jetzt das stdout im programm umleiten ins nirvana?

8) pcAlko

Benutzeravatar
Janka
Beiträge: 3581
Registriert: 11. Feb 2006 19:10

#2 Beitrag von Janka » 12. Feb 2009 21:43

Das geht über die Terminaloptionen.

Code: Alles auswählen

$ stty -F /proc/$$/fd/0 -echo
und du siehst nicht mehr, was in der Shell getippt wird.

Code: Alles auswählen

$ stty -F /proc/$$/fd/0 echo
Damit geht das Echo wieder an. /proc/$$/fd/0 löst auf die von der aktuellen Shell verwendete Standardeingabe auf, das ist üblicherweise /dev/pts/1234 oder sowas (im Framebuffer ist es /dev/tty0 oder so).
In einem C-Programm kannst du das Echo mit termios einstellen. man termios.
Oder du nimmst ncurses, da kann man mit noecho das Echo abstellen. man noecho.

Janka
Ich vertonne Spam immer in /dev/dsp statt /dev/null.
Ich mag die Schreie.

pcAlko
Beiträge: 70
Registriert: 14. Mai 2007 19:27

#3 Beitrag von pcAlko » 13. Feb 2009 19:37

Hallo Janka!

Danke, hat super funktioniert,
ich hab mich für termios entschieden.

Aber nun gleich zur nächsten Frage.
die ich zwar schon selbst gelöst habe, aber mir nicht klar ist ob diese Lösung auch sauber ist.


ich möchte natürlich nicht dass man das Passwort in der command line eingeben kann
zb.

Code: Alles auswählen

myapp <passwort>
da man dieses bei

Code: Alles auswählen

ps -ef | grep myapp
ja dann sieht.

Um, das ganze jetzt aber doch automatisieren zu können,
zb. durch ein script
schreibe ich das pwd in eine Datei und mach sie mit chmod nur für die uid in dem das script läuft lesend.

somit kann ich schreiben

Code: Alles auswählen

myapp < Datei
wenn ich nun beim ersten tcgetattr() einen Fehler bekomme
setze ich mit tcsetattr() gar nicht mehr das c_lflag auf ~ECHO

funktioniert super
jedoch ist das sauber? oder gibt es da eine bessere Lösung?
mir ist nicht klar ob ich nur in diesem Fall, wenn ich eine Umleitung mache, eben bei tcgetattr() einen Fehler bekomme.

8) pcAlko

[edit]
ok, jetzt hab ich auch noch eine abfrage beim Fehler hinzugefügt dass er mir
dieses Vorgehen nur macht wenn errno 25 ist (Inappropriate ioctl for device)
hoffe das ist ok so

Benutzeravatar
Janka
Beiträge: 3581
Registriert: 11. Feb 2006 19:10

#4 Beitrag von Janka » 15. Feb 2009 22:59

Deine Lösung mit der Pipe ist natürlich so ok, und ja, einfach den Fehler -ENOTTY zu ignorieren ist in dem Fall auch ok.

Die Frage ist, warum du für deine Applikation überhaupt einen solchen Passwort-Mechanismus einbauen willst. Willst du su oder sudo nachprogrammieren?

Janka
Ich vertonne Spam immer in /dev/dsp statt /dev/null.
Ich mag die Schreie.

pcAlko
Beiträge: 70
Registriert: 14. Mai 2007 19:27

#5 Beitrag von pcAlko » 22. Feb 2009 19:30

Nein möchte ich eigentlich nicht!

Wenn Du Dich errinnern kannst -> Ich bin der, der Dich mit dem DS2408 lange Zeit genervt hat. :)
Naja, jetzt hat mein Server mit der Zeit auch schon einen Zugangs-Berechtigung
und eben dafür brauche ich dieses Vorgehen.

Danke für Deine Antwort
8) pcAlko

pferdefreund
Beiträge: 35
Registriert: 17. Apr 2007 16:55

#6 Beitrag von pferdefreund » 17. Apr 2009 10:43

Ein Trick, den ich auch schon probiert habe und der auch funktioniert,

programm password kann man aufrufen und muß dann im Programm gleich
am Anfang argv[] in der Laenge des Passwords auf Space setzen. Dann erscheint es
nicht mehr in ps und Konsorten - ist sicherlich nicht die feine pferdige Art - aber bei
meiner Anwendung funktionierts prima. Man sollte nur nicht über die
Länge des PW spacen

Antworten