Seite 1 von 1
Aufrufen externer Programme
Verfasst: Montag 4. November 2002, 12:29
von steinkeg
Kann man unter Python auf externe Programme zugreifen, diese ausführen, und die Ergebnisse wieder mit Python verarbeiten?
Ich arbeite auf einem UNIX-System und würde gerne auf bestehende Programme (z.Bsp hbplus) zugreifen, die einen anderen Sorcecode besitzen bzw. in anderen Scriptsprachen geschrieben wurden, und in Python einbinden.
Verfasst: Montag 4. November 2002, 14:23
von hans
Nichts leichter als ein anderes programm zu starten. Module os bietet mehrere Möglichkeiten, z. b.
Code: Alles auswählen
_stdin, _stdout, _stderr = fopen("/usr/bin/irgendetws param1 param2 ........")
for _s in _stdout.readLines():
print _s.strip()
_stderr.close()
_stdout.close()
_stdin.clode()
es gibt da noch einige Artverwande befehle in dem Modul.
Hans
Verfasst: Montag 4. November 2002, 16:14
von ASCII158
meinst du nicht os.popen?
fopen kennt mein python nämlich nicht...
Verfasst: Montag 4. November 2002, 16:27
von hans
schäm
meine natürlich
Code: Alles auswählen
_stdin, _stdout, _stderr = os.popen3("/usr/bin/irgendetws param1 param2 ........")
os.popen() sollte aber auch gehen.
Hans
Verfasst: Montag 4. November 2002, 17:03
von ASCII158
Dann hab ich mal eine weiterführende Frage:
wie kann ich den Linux Befehl 'su' damit nutzen?
Code: Alles auswählen
#!/usr/bin/python
import os
_stdin, _stdout, _stderr = os.popen3("su -c ./hello")
_stdin.write('xXxXxXx')
_stdin.flush()
for _s in _stdout.readlines():
print '%s'%_s.strip()
_stderr.close()
_stdout.close()
_stdin.close()
(./hello ist ein programm das einfach nur "Hallo Welt" ausgibt)
passiert garnichts (d.h. er führt das programm aus aber es tut sich nix!)
Verfasst: Montag 4. November 2002, 21:35
von hans
Mal abgeändert. Und was sehen wir jetz?
Code: Alles auswählen
#!/usr/bin/python
import os
_stdin, _stdout, _stderr = os.popen3("su -c ./hello")
_stdin.write('xXxXxXx')
_stdin.flush()
for _s in _stdout.readlines():
print '%s'%_s.strip()
for _s in _stderr.readlines():
print '%s'%_s.strip()
_stderr.close()
_stdout.close()
_stdin.close()
Wenn's eine gibt, dann gibt das Prog auch eine Fehlermeldung aus.
Ich wieß nicht ob es möglich ist, mit einem shellscript in Dialog zu treten. Vielleicht wissen aber andere mehr zu dem Thema.
Ich würde so vorgehen, das das Shellscipt den I/O Dialog selbst verwaltet, oder das Script so gestalten, dass es komplett mit Parametern / Umgebungsvariablen gefüttert wird. Für ereignisgesteuerte Programme eignen sich die GUI Programme wie QT, KDE, TK, etc. bestens. damit bekommt man dann auch komplexe Abläufe in den Griff.
Kannst ja mal auf mein HP stöbern. Da hat sich in den letzten Wochen schon einiges angesammelt, wo man das ein oder andere sehen kann. (Länger kenne ich Python auch noch nicht.)
Hans
Verfasst: Montag 4. November 2002, 21:59
von hans
:?Boah ey, deine Version geht ja doch
bin wie folgt darauf gekommen:
- Fehlerausgabe aktiviert (_stderr)
- "su -c ./hello" durch "./hello" ersetzt.
- hello.py gibt jetzt Fehlermeldung /bin/sh: line 1: ./hello: Keine Berechtigung aus.
- chmod 755 ./hello
- hello.py gibt Hello World aus
- "su -c ./hello" wieder eingesetzt. Und jetzt funzt es auch mit der Nach.................
....und ich habe dabei auch noch was gelernt (_stdin)
Hans
Verfasst: Dienstag 5. November 2002, 14:13
von ASCII158
Interessant!
bei mir gibt nämlich der text:
Code: Alles auswählen
#!/usr/bin/python
import os
_stdin, _stdout, _stderr = os.popen3("su -c ./hello")
_stdin.write('xXxXx')
_stdin.flush()
for _s in _stderr.readlines():
print '%s'%_s.strip()
_stderr.close()
_stdout.close()
_stdin.close()
... das aus:
su: must be run from a terminal
und ./hello hat 755!
Verfasst: Dienstag 5. November 2002, 14:24
von hans
Tja, dass sind dir Feinheiten. Ich hatte mein Prog wie üblich aus einem Terminal heraus gestartet. Mache ich während der Entwicklung permanent. Schneller wie jede Maus!
Sag mal, mußt du mit su arbeiten? Geht alternativ nicht auch login? Dann gibt's da noch kdesu. Da habe ich aber gar keine Ahnung von.
Hans
Verfasst: Dienstag 5. November 2002, 14:46
von ASCII158
hans hat geschrieben:Tja, dass sind dir Feinheiten. Ich hatte mein Prog wie üblich aus einem Terminal heraus gestartet.
Ich auch! Über Telnet von einem Windoof-Rechner. Aber auch wenn ich die zwei schritte nach links gehe, also direkt an den Linux-Rechner, ändert sich nix!
hans hat geschrieben:
Mache ich während der Entwicklung permanent. Schneller wie jede Maus!
Bei mir wäre die alternative Windows...
hans hat geschrieben:
Sag mal, mußt du mit su arbeiten? Geht alternativ nicht auch login? Dann gibt's da noch kdesu. Da habe ich aber gar keine Ahnung von.
kdesu ist in cgi-Scripten (das ist nämlich das Ziel) nicht wirklich sinnvoll anzuwenden...
Und das hier:
Code: Alles auswählen
#!/usr/bin/python
import os
_stdin, _stdout, _stderr = os.popen3("login root")
_stdin.write('xXx')
_stdin.flush()
for _s in _stderr.readlines():
print 'Err: %s'%_s.strip()
for _s in _stdout.readlines():
print 'Out: %s'%_s.strip()
print os.environ
_stderr.close()
_stdout.close()
_stdin.close()
gibt mir nur die os.environ, und nach der ist er nicht als root angemeldet...
Verfasst: Dienstag 5. November 2002, 17:56
von hans
Und wenn du ein anderes Login nimmst.
Solltest due ein SuSE irgendwas haben, dann kann es sein, dass root Zugriffe von externen Systemen auf dein System nicht erlaubt sind. Farg mich bitte nicht nach dem Parameter.
Wie wärs denn mit login -p username oder login -p -h hostname -f username?
Hans
Verfasst: Mittwoch 6. November 2002, 14:03
von ASCII158
[b|login -p root[/b] gibt wieder nix,
login -p -h linux486 -f root gibt:
_stderr: login: permission denied
das muss doch irgendwie gehen oda?
Verfasst: Donnerstag 14. November 2002, 00:37
von hans
Funktioniert dass denn mit einem anderen User als root? Es kann sein, dass ein root Zugriff von Remoter Seite aus verweigert wird. Das kann man einstellen.
Hans
Verfasst: Donnerstag 14. November 2002, 15:44
von ASCII158
Öööhm, ich hab jetzt ne andere Löscung gefunden.
Eine Konsultation unseres Schulpsychologen (ein Linux-Freak) hat mir sehr geholfen!
Es gibt ein Programm 'sudo' mit dem man für bestimmte User bestimmte Aktionen erlauben kann. Damit habe ich jetzt vor zu arbeiten.
Aber trotzdem Danke an deine Bemühungen!
Verfasst: Sonntag 17. November 2002, 14:35
von ASCII158
Die Story ist leider immer noch nicht zu Ende.
Wenn ich aus meinem Python-Script 'sudo' wie folgt ausführe:
Dann gibt sudo nicht, wie ich gehofft hatte, seine Passwortabfrage über stdout aus, sondern direkt an die Konsole - also im Falle des Webservers in irgend ein 'Dämon-Nirvana'.
Weiss irgendwer wie ich das irgendwie lösen kann?
Danke!
Verfasst: Sonntag 17. November 2002, 14:58
von hans
Ich kapier's immer noch nicht
In fünfzehn Jahren UNIX habe ich noch nicht einmal sudo benötigt. Entweder ich prüfe vorher die Rechte ab, bzw setze die Rechte so, das Otto Normalo das Programm auch ausführen kann oder ich mache es selbst (als Supervisor). Sollte bei Linux nicht anders sein.
sudo sollte zwar funktionieren, aber warum sollte ich einem User root - Rechte verpassen? Außerdem muß sudo entsprechend konfiguriert werden. Geht das kommando
denn aus der Shell heraus? Aber Vorsicht, die Shellvariablen der Konsole müssen nicht identischen Inhalts mit deiner Programmumgebung sein.
Also mal ohne sudo: Da gibt's soviel ich weiß standardmäßig eine Gruppe
users oder ezeug eine Gruppe
normalo und ordne jedem User der das Programm ausführen soll der/den Gruppen zu. Gruppen / User kann man in Suse 8.1 mit
Yast2 Module / Sicherheit und Benutzer berabeiten und anlegen.
Dann machst du noch
und das sollte es dann der ganze Zauber gewesen sein.
äääähhhhhhhh..
Wieso eigentlich Webserver? Soll das Script etwa als cgi-Script laufen oder als "normales" shellscript?
Hans
Verfasst: Sonntag 17. November 2002, 15:16
von ASCII158
Gehen wir das ganze mal anders an:
Was ich vorhabe ist für einen (noch-)nicht-Linux-Freak, der unbedingt einen Linux-Domain-Server haben will (verständlich), ein einfaches Cgi-Script zu schreiben, mit dem er User und Freigaben zumindest bis ers mit den .conf files kann hinzufügen, löschen und ändern kann.
D.h. dieses Script muss folgendes können:
- den Befehl adduser,
- den Befehl deluser und
- den Befehl moduser ausführen und ausserdem
- die Datei /etc/samba/smb.conf schreiben können.
Da ich den Webserver nicht unbedingt als root laufen lassen will, möchte ich, das das Script mit einem Passwort, das es vom User bekommt, sich die nötigen Rechte holt und dann loslegt.
Ich weiss nicht ob das möglich ist, aber ich fände schön wenn man das hinbekommen könnte.