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?
pcAlko
Passwort-Eingabe
Das geht über die Terminaloptionen.
und du siehst nicht mehr, was in der Shell getippt wird.
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
Code: Select all
$ stty -F /proc/$$/fd/0 -echo
Code: Select all
$ stty -F /proc/$$/fd/0 echo
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.
Ich mag die Schreie.
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.
da man dieses bei
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
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.
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
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: Select all
myapp <passwort>
Code: Select all
ps -ef | grep myapp
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: Select all
myapp < Datei
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.
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
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
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.
Ich mag die Schreie.
-
- Posts: 35
- Joined: 17. Apr 2007 16:55
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
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