@deets
Das heißt subprocess.communicate versucht nicht den Kind-Prozess zu kontaktieren? Kann man den Kind-Prozess irgendwie raus bekommen und dann doch noch kontaktieren, oder wäre der Aufwand zu groß?
rsync ssh und Passwort Eingabe
*seufz*. Nein, das heisst es nicht. Subprocess communicate arbeitet ueber STDIN und STDOUT des Kind-Prozesses. Aber SSH arbeitet direkt mit dem *TERMINAL* in dem du dich befindest. Deshalb bekommst du die Passworteingabeaufforderung ueberhaupt zu sehen.
Und pexpect ist dafuer gemacht, genau so ein Terminal zu emulieren, und SSH "auszutricksen".
Hast du dir ueberhaupt mal die Muehe gemacht, das mal googeln, warum es das gibt?
http://lmgtfy.com/?q=python+pexpect
Das erste Resultat sagt alles.
Und zum wiederholten male (ich glaube, ich sehe schon ein bisschen aus wie eine Gebetsmuehle): wenn du SSH-key-authorization verwendest, dann hast du das Problem nicht. Falls das noch nicht klargeworden sein sollte. Ich hab' da mal ein kleines Programm geschrieben, das du bitte laufen laesst, bis es "klick" macht:
Abbrechen mit Control-C wenn ein lautes "klick" im Kopf ertoent.
Und pexpect ist dafuer gemacht, genau so ein Terminal zu emulieren, und SSH "auszutricksen".
Hast du dir ueberhaupt mal die Muehe gemacht, das mal googeln, warum es das gibt?
http://lmgtfy.com/?q=python+pexpect
Das erste Resultat sagt alles.
Und zum wiederholten male (ich glaube, ich sehe schon ein bisschen aus wie eine Gebetsmuehle): wenn du SSH-key-authorization verwendest, dann hast du das Problem nicht. Falls das noch nicht klargeworden sein sollte. Ich hab' da mal ein kleines Programm geschrieben, das du bitte laufen laesst, bis es "klick" macht:
Code: Alles auswählen
while True:
print "Wenn Public/Private-Key-Authorization benutzt wird, muss man keine Passwoerter eingeben"
print "Wenn man das aus esoterischen Gruenden nicht moechte, sollte man auf den Rat weiser alter Maenner wie Leonidas & deets hoeren & pexpect verwenden"
@feldmaus: Nein. ``ssh`` schaut ob es die Eingaben von einem *Terminal* bekommt, also ob da ein *Benutzer* sitzt und die tatsächlich eintippt. Das tut es um zu verhindern dass Programme das Passwort "eingeben" können. Weil das eben gewisse Sicherheitsrisiken birgt. Also muss man versuchen ``ssh`` vorzuspielen, dass das Programm kein Programm sondern ein Benutzer an einem Terminal ist. Das macht `pexpect`.
Wieviele Varianten von "geht das?" - "nein, das geht nicht!" moechtest du noch durchexerzieren? Die Deutsche Sprache ist reich an Worten und Zeiten, da verballern wir locker noch ein paar Monate mit dem formulieren der immer selben Fragen und Anworten.feldmaus hat geschrieben:@deets
Bei subprocess kann man doch auch die Option shell=True nutzen, dann wäre das auch möglich?
Also zur Abwechslung mal ein paar Fragen, die mich wirklich brennend interessieren:
Warum fragst du denn eigentlich hier, wenn du die Antwort nicht hoeren moechtest? Warum liest du nicht, was man dir zu lesen gibt?
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Hallo feldmaus,
Ich habe eine Frage: was hast du denn gegen die "richtige" Lösung und zwar SSH Public-Keys? Ich sehe dass du versuchst mit Gewalt da irgendwas dummes durchzusetzen, aber welchen Sinn und Zweck verfolgt das, wenn man das "richtige" einfacher und sicherer hinbekommt?
Ich habe eine Frage: was hast du denn gegen die "richtige" Lösung und zwar SSH Public-Keys? Ich sehe dass du versuchst mit Gewalt da irgendwas dummes durchzusetzen, aber welchen Sinn und Zweck verfolgt das, wenn man das "richtige" einfacher und sicherer hinbekommt?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
@feldmaus: Shell != Terminal 
Eine Shell bildet die Kommandozeile, die innerhalb deines Terminals läuft. Dem Programm, welches Benutzereingaben von Stdin haben möchte, ist es ziemlich egal, ob es über eine dazwischen geschaltete Shell oder direkt über den `exec*()`-Call aufgerufen wird. Es möchte sich nämlich mit einem *Terminal* unterhalten. Dieses Terminal kannst du entweder nach dem Aneignen des nötigen Hintergrundwissens mit einigen Zeilen an zusätzlichem Code selbst emulieren (Pythons Stdlib bietet alle nötigen Funktionen) oder du verwendest eben Pexpect.

Eine Shell bildet die Kommandozeile, die innerhalb deines Terminals läuft. Dem Programm, welches Benutzereingaben von Stdin haben möchte, ist es ziemlich egal, ob es über eine dazwischen geschaltete Shell oder direkt über den `exec*()`-Call aufgerufen wird. Es möchte sich nämlich mit einem *Terminal* unterhalten. Dieses Terminal kannst du entweder nach dem Aneignen des nötigen Hintergrundwissens mit einigen Zeilen an zusätzlichem Code selbst emulieren (Pythons Stdlib bietet alle nötigen Funktionen) oder du verwendest eben Pexpect.
Und damit das nochmal ganz deutlich wird fuer unseren wissbegierigen Nager: diese wenigen Zeilen zusaetzlicher Code sind eben genau das, was in pexpect passiert. Und nicht irgendein magisches Argument an subprocess.snafu hat geschrieben: Dieses Terminal kannst du entweder nach dem Aneignen des nötigen Hintergrundwissens mit einigen Zeilen an zusätzlichem Code selbst emulieren (Pythons Stdlib bietet alle nötigen Funktionen) oder du verwendest eben Pexpect.
Ich bin der Auffassung, dass dies nicht immer sicherer ist. Ich weiß nicht was es alles für Möglichkeiten gibt so wie Alle hier und daher verfolge ich die Strategie, möglichst wenig Angriffsmöglichkeit zu bieten. Ein Angriffs-Beispiel mit Java nannte ich ja schon, auch Office Dokumente mit Makros wären eine Angriffsmöglichkeit. Wahrscheinlich gibt es noch mehr Möglichkeiten, mir reichen die Beiden jedenfalls schon.Leonidas hat geschrieben:Hallo feldmaus,
Ich habe eine Frage: was hast du denn gegen die "richtige" Lösung und zwar SSH Public-Keys? Ich sehe dass du versuchst mit Gewalt da irgendwas dummes durchzusetzen, aber welchen Sinn und Zweck verfolgt das, wenn man das "richtige" einfacher und sicherer hinbekommt?
Hier der funktionsfähige Code:
Code: Alles auswählen
try:
source=BENUTZER+katalog[eintrag]['Server'][0]+BENUTZER+katalog[eintrag]['Server'][1]+' '
target=katalog[eintrag]['Client'][0]+BENUTZER+katalog[eintrag]['Client'][1]+' '
(command_output, exitstatus)=pexpect.run('rsync --rsh=\'ssh -l '+BENUTZER+'\' -a --delete-after --stats --progress '+
exclude_pre+exclude_post+source+target,
withexitstatus=1, events={'(?i)password':benutzer_passwoerter[BENUTZER]+'\n'})
print command_output
except Exception, e:
print 'Fehler: '+str(e)
@BlackJack
Seit der Fukushima-Katastrophe wird Ignoranz in feldmaus gemessen. Die uebliche Hintergrundignoranz liegt bei wenigen milli-feldmaus. Doch das Vollpfostometer zeigt in diesem Thread Werte von bis zu einem feldmaus! Das sind Bereiche, die bis dato nur am grossen Retardotron im Hirnforschungszentrum Juelich gemessen wurden. Vielleicht sollte man mal die Wissenschaftler hierauf aufmerksam machen...
Seit der Fukushima-Katastrophe wird Ignoranz in feldmaus gemessen. Die uebliche Hintergrundignoranz liegt bei wenigen milli-feldmaus. Doch das Vollpfostometer zeigt in diesem Thread Werte von bis zu einem feldmaus! Das sind Bereiche, die bis dato nur am grossen Retardotron im Hirnforschungszentrum Juelich gemessen wurden. Vielleicht sollte man mal die Wissenschaftler hierauf aufmerksam machen...
You made my Daydeets hat geschrieben:
Seit der Fukushima-Katastrophe wird Ignoranz in feldmaus gemessen. Die uebliche Hintergrundignoranz liegt bei wenigen milli-feldmaus. Doch das Vollpfostometer zeigt in diesem Thread Werte von bis zu einem feldmaus! Das sind Bereiche, die bis dato nur am grossen Retardotron im Hirnforschungszentrum Juelich gemessen wurden. Vielleicht sollte man mal die Wissenschaftler hierauf aufmerksam machen...

Gruß...busfahrer
Alles wird gut ;-)
Mit Verlaub, ich finde diesen Beitrag entwürdigend.deets hat geschrieben:@BlackJack
Seit der Fukushima-Katastrophe wird Ignoranz in feldmaus gemessen. Die uebliche Hintergrundignoranz liegt bei wenigen milli-feldmaus. Doch das Vollpfostometer zeigt in diesem Thread Werte von bis zu einem feldmaus! Das sind Bereiche, die bis dato nur am grossen Retardotron im Hirnforschungszentrum Juelich gemessen wurden. Vielleicht sollte man mal die Wissenschaftler hierauf aufmerksam machen...

- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Also ich finde ein allein stehender Satz a la "Ignoranz wird in 'feldmaus' gemessen" wäre schon lustig gewesen. Aber die Verknüpfung mit einer Katastrophe, die Menschenleben massiv negativ beinflusst hat und noch beeinflussen wird, sowie die Benutzung von Schimpförtern entwerten die Prise Humor und verkehrt diese imho auch ins Gegenteil.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
@deets
Also ich habe kein Problem damit, aber mach dich drauf gefasst das Du von mir dann auch mal ein Konter bekommst, nicht das Du nachher heulst.
Außerdem frage ich mich schon die ganze Zeit warum Du mich für ignorant hältst? Ich bin nicht ignorant, sondern ich verstehe halt einiges nicht so gut wie BlackJack oder Leonidas. Ich habe alles was BlackJack vorgeschlagen hatte umgesetzt, sind ja auch gute Ideen. Ich verstehe Ihn halt nicht immer auf Anhieb. Die Jungs hier wandern nun mal in anderen Spheren.
Und deine Idee mit pexpect habe ich auch eingebaut, nur wollte ich einiges geklärt haben.
Grüße Markus
Also ich habe kein Problem damit, aber mach dich drauf gefasst das Du von mir dann auch mal ein Konter bekommst, nicht das Du nachher heulst.


Grüße Markus
@feldmaus
Ueber meinen Traenenfluss reden wir dann, wenn's so weit ist. Da bin ich recht entspannt.
Die Ignoranz zeigt sich in so diversen Dingen:
- der Tatsache, dass du pexpect empfohlen bekamst, aber dauerhaft ignoriert hast, bis es gar nicht mehr anders ging.
- dass du selbst zugibst, keine Ahnung von Sicherheit zu haben, aber im gleichen Atemzug behauptest, die *sichereren* Alternativen zu einem im Skript gespeicherten Klartextpasswort waeren *unsicherer*.
- das du in aehnlich langwierigen Diskussionen in einem anderen Thread davon ueberzeugt worden bist, dass es besser ist, commandos mit einer Liste statt einem muehselig escapeden String aufzurufen - nur, um dann wieder mit pexpect bei Null anzufangen.
In der Summe also das bitten um Rat, aber ignorieren desselben. Das ist in meinem Buch unter 'Ignoranz' vermerkt.
Ueber meinen Traenenfluss reden wir dann, wenn's so weit ist. Da bin ich recht entspannt.
Die Ignoranz zeigt sich in so diversen Dingen:
- der Tatsache, dass du pexpect empfohlen bekamst, aber dauerhaft ignoriert hast, bis es gar nicht mehr anders ging.
- dass du selbst zugibst, keine Ahnung von Sicherheit zu haben, aber im gleichen Atemzug behauptest, die *sichereren* Alternativen zu einem im Skript gespeicherten Klartextpasswort waeren *unsicherer*.
- das du in aehnlich langwierigen Diskussionen in einem anderen Thread davon ueberzeugt worden bist, dass es besser ist, commandos mit einer Liste statt einem muehselig escapeden String aufzurufen - nur, um dann wieder mit pexpect bei Null anzufangen.
In der Summe also das bitten um Rat, aber ignorieren desselben. Das ist in meinem Buch unter 'Ignoranz' vermerkt.
Also ich habe gerade das Problem das irgendwo in meiner Zeichenkette ein Fehler steckt. Hier der Code:
Als Fehlermeldung bekomme ich bei einem Kommando mit vorhandem exclude:
Ohne Exclude bekomme ich z.b.:
Hat Jemand eine Idee?
Grüße Markus
Code: Alles auswählen
def rsync ():
exclude_pre=katalog[eintrag]['Exclude'][0]+' '
exclude_post=katalog[eintrag]['Exclude'][1]+' '
if antwort2 == ('s' or 'S') :
try:
source=katalog[eintrag]['Client'][0]+BENUTZER+katalog[eintrag]['Client'][1]+' '
target=BENUTZER+katalog[eintrag]['Server'][0]+BENUTZER+katalog[eintrag]['Server'][1]
print 'source ist: '+source
print 'target ist: '+target
(command_output, exitstatus)=pexpect.run(['rsync ',
'-e ',
'\"ssh -l '+BENUTZER+'\" ',
'-a ',
'--delete-after ',
'--stats ',
'--progress ',
exclude_pre+exclude_post,
source,
target],
withexitstatus=1, events={'(?i)password':benutzer_passwoerter[BENUTZER]+'\n'})
print command_output
except Exception, e:
print 'Fehler: '+str(e)
Code: Alles auswählen
Fehler: The command was not found or was not executable: rsync -e "ssh -l markus" -a --delete-after --stats --progress --exclude Machines/Standard/Snapshots/* /home/markus/.VirtualBox/ markus@feld-server:/home/markus/VirtualBox@feld-bertlap/.
Code: Alles auswählen
Fehler: The command was not found or was not executable: rsync -e "ssh -l markus" -a --delete-after --stats --progress .
Grüße Markus