os.system vs. os.popen

28/08/2009 - 18:12 von pastaman | Report spam
Hi Leute,

habe hier folgende Aufrufe:
os.popen("pwgen -N1").read().strip()
liefert [a-z]
os.system("pwgen -N1")
liefert [a-zA-Z0-9]

Was macht popen anders?

(pwgen 2.06 gibt's z.B. unter Debian, Redhat; '-N1' erzeugt genau ein
8stelliges Pwd)

Vielen Dank im Voraus!
- Enrico
 

Lesen sie die antworten

#1 Tobias Klausmann
28/08/2009 - 18:26 | Warnen spam
pastaman wrote:
Hi Leute,

habe hier folgende Aufrufe:
os.popen("pwgen -N1").read().strip()
liefert [a-z]
os.system("pwgen -N1")
liefert [a-zA-Z0-9]

Was macht popen anders?



Es gibt pwgen kein Terminal. Kann man auch so nachvollziehen:

$ pwgen -N1
aex6up0G
$ pwgen -N1|cat
iekichoo

Der relevante syscall, den pwgen benutzt sieht so aus:

ioctl(1, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon
echo ...}) = 0

ioctl(1, SNDCTL_TMR_TIMEBASE or TCGETS, 0x7fff8d56f6a0) = -1
EINVAL (Invalid argument)

(sieht man im strace, der erste Fall ist mit tty, der zweite
ohne)


Gruss & HTH,
Tobias

PS: *Warum* pwgen das macht, weiss ich nicht.

/* After several hours of tedious analysis, the following hash
* function won. Do not mess with it... -DaveM
*/
linux-2.2.16/fs/buffer.c

Ähnliche fragen