OSError: [Errno 25] Inappropriate ioc

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
R00TKiD
User
Beiträge: 6
Registriert: Dienstag 13. März 2007, 09:43

Hallo zusammen,

ich habe ein recht dringendes Problem und bin an einer Stelle angekommen, an der ich nicht weiter weiß.

Darum geht es:
Ich habe ein Python-Programm geschrieben, das Accountdaten aus einer MySQL-Tabelle nimmt und aus diesen dann über den Aufruf eines Programms account über die Shell einen eMailAccount erstellt.

Problem:
Rufe ich das Programm über die Shell auf, läuft es durch, wie es soll. Wird es jedoch durch einen CronJob aufgerufen, verursacht das Programm account den OSError: [Errno 25] Inappropriate ioc. Das passiert ebenso, wenn ich das Programm mit nohup python programm.py & in den Hintergrund schiebe.

Konkret:

Code: Alles auswählen

Traceback (most recent call last):
  File "/root/scripts/account.py", line 190, in ?
    main()
  File "/root/scripts/account.py", line 25, in main
    check_login(options.login)
  File "/root/scripts/account.py", line 92, in check_login
    username = get_system_userdata()[0] 
  File "/root/scripts/account.py", line 162, in get_system_userdata
    username = os.getlogin()
OSError: [Errno 25] Inappropriate ioctl for device
Über das Programm:
stderr und stdout werden in Datein umgeleitet. Der Aufruf von account geschieht über subprocess.call, wobei shell=True gesetzt wird und stderr sowie stdout auf sys.stderr bzw. sys.stdout (in Datei umgeleitet) gesetzt werden (wegen Lesbarkeit umgebrochen):

Code: Alles auswählen

out = subprocess.call("/usr/local/bin/account mailbox add -l"
+ mailusr +" -d/home/rootkid/Mail/" + mailusr +" -p"
+ self._word_convert_4shell(word=acc['passwd']),
shell=True,stdout=sys.stdout,stderr=sys.stderr)
Umleitung der Ausgaben:

Code: Alles auswählen

saveout=sys.stdout
saveerr=sys.stderr
log_stdout=open("/home/kounity/applogs/stdout.log","w")
log_stderr=open("/home/kounity/applogs/stderr.log","w")
sys.stdout=log_stdout
sys.stderr=log_stderr
usw...

Bin für jeden Tipp sehr dankbar! :)

LG,
Pascal
BlackJack

Da scheint es Probleme mit dem Benutzer bzw. den Rechten zu geben. Beim Aufruf über `cron` wird das doch sowieso immer der selbe sein, dann brauchst Du ihn doch nicht zwingend dynamisch abfragen!?

Andere Anmerkung: Wo kommen `mailusr` und `acc['passwd']` her? Beides stellt ein Sicherheitsrisiko dar -- Stichwort "shell injection". Das Passwort scheinst Du ja mit einer selbst geschriebenen Funktion zu entschärfen, aber bist Du sicher, dass Du da auch wirklich *alles* berücksichtigst? Für alle möglichen Shells, die das eventuell mal zu Gesicht bekommen? Sicherer, und auch einfacher denke ich, wäre es auf die Shell zu verzichten.
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Bei "Inappropriate ioctl" wuerde ich eher vermuten, dass das Programm Probleme mit stderr/stdout/stdin hat. Da das Problem bei cron und nohup auftaucht: Vlt. versucht das Programm von stdin zu lesen, was man bei cron und nohup ja wahrscheinlich nicht zur Verfuegung hat (woher auch)? Du koenntest beim Aufruf noch explizit ein stdin zur Verfuegung stellen (wenn eigentlich gar keine Eingaben mehr gemacht werden muessen, reicht vlt. eine leere Datei?)
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
R00TKiD
User
Beiträge: 6
Registriert: Dienstag 13. März 2007, 09:43

Danke für die Antworten :)
Leider besteht das Problem weiterhin.

@Rebecca:
account liest nicht von stdin. Ich habe trotzdem mal stdin in subprocess.call auf eine leere Datei gesetzt (ähnlich wie mit stdout und stderr). Es hat leider nichts geholfen. Da er bei os.getlogin abbricht nehme ich an, dass es an der Funktion liegt :?:

@BlackJack:
Auf der Maschine laufen mehrere User. account schaut, dass man nur FTP/Mailaccounts für sich erstellen kann. account ersetzt bei uns quasi Oberflächen wie squirrelmail. Nun habe ich aber ein Portal, in das ich ein Webinterface für die eMail-Konfiguration einbauen möchte. Die eMail-Adressen werden automatisch aus dem Usernamen generiert. Die Daten landen dann vorübergehend in einer MySQL-Datenbank und werden von dort vom Python-Skript ausgelesen. Sicherlich ist sind Shell-Injections ein RIsiko. Soweit wird aber alles maskiert. Die Benutzer sind Vereinsleute... Die versuchen das hoffentlich nicht zu umgehen. ;) Ich schaue mal, ob ich ohne die Shell zurecht komme...
Zu den Rechten: Ich habe über whoami geschaut, ob das Programm als der User läuft, als der es laufen soll. Das ist der Fall. Also müsste account doch dann auch diese Rechte erben :?:
Antworten