Aufrufen externer Programme

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
steinkeg
User
Beiträge: 1
Registriert: Montag 4. November 2002, 12:19

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.
hans
User
Beiträge: 728
Registriert: Sonntag 22. September 2002, 08:32
Wohnort: Sauerland
Kontaktdaten:

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
ASCII158
User
Beiträge: 80
Registriert: Samstag 28. September 2002, 15:40
Wohnort: München

meinst du nicht os.popen?

fopen kennt mein python nämlich nicht...
mfg,

10011110
hans
User
Beiträge: 728
Registriert: Sonntag 22. September 2002, 08:32
Wohnort: Sauerland
Kontaktdaten:

:oops: schäm :oops:

meine natürlich

Code: Alles auswählen

_stdin, _stdout, _stderr = os.popen3("/usr/bin/irgendetws param1 param2 ........") 
os.popen() sollte aber auch gehen.

Hans
ASCII158
User
Beiträge: 80
Registriert: Samstag 28. September 2002, 15:40
Wohnort: München

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!)
mfg,

10011110
hans
User
Beiträge: 728
Registriert: Sonntag 22. September 2002, 08:32
Wohnort: Sauerland
Kontaktdaten:

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
hans
User
Beiträge: 728
Registriert: Sonntag 22. September 2002, 08:32
Wohnort: Sauerland
Kontaktdaten:

:?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
ASCII158
User
Beiträge: 80
Registriert: Samstag 28. September 2002, 15:40
Wohnort: München

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!
mfg,

10011110
hans
User
Beiträge: 728
Registriert: Sonntag 22. September 2002, 08:32
Wohnort: Sauerland
Kontaktdaten:

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
ASCII158
User
Beiträge: 80
Registriert: Samstag 28. September 2002, 15:40
Wohnort: München

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...
mfg,

10011110
hans
User
Beiträge: 728
Registriert: Sonntag 22. September 2002, 08:32
Wohnort: Sauerland
Kontaktdaten:

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
ASCII158
User
Beiträge: 80
Registriert: Samstag 28. September 2002, 15:40
Wohnort: München

[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?
mfg,

10011110
hans
User
Beiträge: 728
Registriert: Sonntag 22. September 2002, 08:32
Wohnort: Sauerland
Kontaktdaten:

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
ASCII158
User
Beiträge: 80
Registriert: Samstag 28. September 2002, 15:40
Wohnort: München

Öööhm, ich hab jetzt ne andere Löscung gefunden.

Eine Konsultation unseres Schulpsychologen (ein Linux-Freak) hat mir sehr geholfen! :D

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!
mfg,

10011110
ASCII158
User
Beiträge: 80
Registriert: Samstag 28. September 2002, 15:40
Wohnort: München

Die Story ist leider immer noch nicht zu Ende. :oops:

Wenn ich aus meinem Python-Script 'sudo' wie folgt ausführe:

Code: Alles auswählen

_stdin, _stdout, _stderr  = os.popen3("sudo ./hello")
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!
mfg,

10011110
hans
User
Beiträge: 728
Registriert: Sonntag 22. September 2002, 08:32
Wohnort: Sauerland
Kontaktdaten:

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

Code: Alles auswählen

sudo hello
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

Code: Alles auswählen

chgrp users hello
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
ASCII158
User
Beiträge: 80
Registriert: Samstag 28. September 2002, 15:40
Wohnort: München

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.
mfg,

10011110
Antworten