rsync ssh und Passwort Eingabe

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.
feldmaus
User
Beiträge: 287
Registriert: Donnerstag 12. Oktober 2006, 16:48

@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ß?
deets

*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:

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"
Abbrechen mit Control-C wenn ein lautes "klick" im Kopf ertoent.
feldmaus
User
Beiträge: 287
Registriert: Donnerstag 12. Oktober 2006, 16:48

@deets
Bei subprocess kann man doch auch die Option shell=True nutzen, dann wäre das auch möglich?

Grüße Markus
BlackJack

@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`.
deets

feldmaus hat geschrieben:@deets
Bei subprocess kann man doch auch die Option shell=True nutzen, dann wäre das auch möglich?
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.

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?
Leonidas
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?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
snafu
User
Beiträge: 6854
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@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.
deets

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.
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.
feldmaus
User
Beiträge: 287
Registriert: Donnerstag 12. Oktober 2006, 16:48

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?
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.

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)
Grüße Markus
BlackJack

@feldmaus: Jetzt bastelst Du ja schon wieder eine Zeichenkette zusammen… :roll:
feldmaus
User
Beiträge: 287
Registriert: Donnerstag 12. Oktober 2006, 16:48

Beim Befehl pexpect wird 1 Zeichenkette erwartet. :mrgreen:
BlackJack

@feldmaus: Nein, das ist nur eine Möglichkeit.
deets

@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...
busfahrer
User
Beiträge: 111
Registriert: Donnerstag 9. Oktober 2008, 17:42

deets 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...
You made my Day :lol:

Gruß...busfahrer
Alles wird gut ;-)
lunar

@deets: Dieser Beitrag war jetzt nicht unbedingt nötig ... :roll:
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

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...
Mit Verlaub, ich finde diesen Beitrag entwürdigend. :roll:
Benutzeravatar
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
feldmaus
User
Beiträge: 287
Registriert: Donnerstag 12. Oktober 2006, 16:48

@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. :lol: 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. :mrgreen: Und deine Idee mit pexpect habe ich auch eingebaut, nur wollte ich einiges geklärt haben.

Grüße Markus
deets

@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.
feldmaus
User
Beiträge: 287
Registriert: Donnerstag 12. Oktober 2006, 16:48

Also ich habe gerade das Problem das irgendwo in meiner Zeichenkette ein Fehler steckt. Hier der Code:

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)
Als Fehlermeldung bekomme ich bei einem Kommando mit vorhandem exclude:

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/.
Ohne Exclude bekomme ich z.b.:

Code: Alles auswählen

Fehler: The command was not found or was not executable: rsync -e "ssh -l markus" -a --delete-after --stats --progress .
Hat Jemand eine Idee?

Grüße Markus
Antworten