Re: rsync ssh und Passwort Eingabe
Verfasst: Donnerstag 24. März 2011, 20:09
@feldmaus: Sieht so aus als wenn man nur bei `pexpect.spawn()` die Argumente als Liste übergeben kann aber nicht bei `pexpect.run()`. Das ist doof.
Seit 2002 Diskussionen rund um die Programmiersprache Python
https://www.python-forum.de/
Code: Alles auswählen
if antwort2 == ('s' or 'S') :
Code: Alles auswählen
In [1]: 's' or 'S'
Out[1]: 's'
In [2]: acceptable = 's' or 'S'
In [3]: answer = 's'
In [4]: answer == acceptable
Out[4]: True
In [5]: answer = 'S'
In [6]: answer == acceptable
Out[6]: False
Code: Alles auswählen
In [7]: acceptable = ('s', 'S')
In [8]: answer in acceptable
Out[8]: True
In [9]: answer = 's'
In [10]: answer in acceptable
Out[10]: True
In [11]: acceptable = 'sS'
In [12]: answer in acceptable
Out[12]: True
In [13]: answer = 'S'
In [14]: answer in acceptable
Out[14]: True
Also in der Doku steht ein Beispiel:BlackJack hat geschrieben:@feldmaus: Sieht so aus als wenn man nur bei `pexpect.spawn()` die Argumente als Liste übergeben kann aber nicht bei `pexpect.run()`. Das ist doof.
Code: Alles auswählen
child = pexpect.spawn ('ls', ['-latr', '/tmp'])
Code: Alles auswählen
rsync version 3.0.7 protocol version 30
Copyright (C) 1996-2009 by Andrew Tridgell, Wayne Davison, and others.
Web site: http://rsync.samba.org/
Capabilities:
64-bit files, 64-bit inums, 32-bit timestamps, 64-bit long ints,
socketpairs, hardlinks, symlinks, IPv6, batchfiles, inplace,
append, ACLs, xattrs, iconv, symtimes
Code: Alles auswählen
rsync: --exclude : unknown option
Code: Alles auswählen
building file list ...
rsync: link_stat "/home/markus/bin/__ThereIsNothingToExcludeInThisSourceButINeedAnEmptyExclude__ " failed: No such file or directory (2)
rsync: link_stat "/home/markus/bin/ " failed: No such file or directory (2)
0 files to consider
Code: Alles auswählen
bj@s8n:~$ rsync '--exclude'
rsync: --exclude: missing argument
rsync error: syntax or usage error (code 1) at main.c(1443) [client=3.0.7]
bj@s8n:~$ rsync '--exclude '
rsync: --exclude : unknown option
rsync error: syntax or usage error (code 1) at main.c(1443) [client=3.0.7]
Mich mögen die Leerzeichen halt besonders gerneBlackJack hat geschrieben:@feldmaus: Du solltest Dich wirklich ganz dringend endlich mal damit beschäftigen wie die Übergabe von Argumenten funktioniert. Auf C-Ebene. Und was zum Beispiel eine Shell alles macht um von einer Zeile in der Shell auf eine Argumentliste auf C-Ebene zu bekommen. Genau da machst Du nämlich schon wieder Fehler.
Code: Alles auswählen
PASSWORT=raw_input('Bitte Passwort fuer '+BENUTZER+' eingeben:')
benutzer_passwoerter[BENUTZER]=PASSWORT
child=rsync()
child.logfile = sys.stdout
child.expect('password:', timeout=3)
child.logfile = sys.stdout
child.sendline(PASSWORT)
child.logfile = sys.stdout
while not child.expect(pexpect.EOF):
PASSWORT=raw_input('Falsches Passwort!\nBitte Passwort fuer '+BENUTZER+' eingeben:')
benutzer_passwoerter[BENUTZER]=PASSWORT
child.expect('password:', timeout=3)
child.sendline(PASSWORT)
Code: Alles auswählen
for eintrag in katalog:
for BENUTZER in katalog[eintrag]['Benutzer']:
antwort2=raw_input('Sichern/Zurueckspielen/Nichts'+katalog[eintrag]['Frage'][0]+BENUTZER+katalog[eintrag]['Frage'][1])
PASSWORT=benutzer_passwoerter.get(BENUTZER, '')
if antwort2 in 'sSzZ' and antwort2 not in '':
child=rsync()
child.logfile_read = sys.stdout
if child.expect([' password:', pexpect.EOF], timeout=3) in [0]:
child.sendline(PASSWORT)
while child.expect([' password:', pexpect.EOF], timeout=3) in [0]:
PASSWORT=sys.stdin.readline()
benutzer_passwoerter[BENUTZER]=PASSWORT
child.sendline(PASSWORT))
Deine Idee mit dem Iterator-Objekt finde ich interessant, doch jedesmal wenn ich drüber nachdenke wie man damit meinen Code vereinfachen/lesbarer machen kann habe ich eher das Gefühl es wird nur schlimmer. Ein Iterator-Objekt hat zu wenig Methoden. Mit next() kann ich nicht alles erschlagen was ich brauche. Und zudem kommt noch, das ich die Ausnahme von dem Iterator behandeln muss(wenn das Ende des iterator erreicht ist), was Zusatz-Code verursacht. Kann man beim Iterator das derzeitige Element ausgeben? Ansonsten müsste ich viel mit Zuweisungen arbeiten und die verlängern meinen Code.BlackJack hat geschrieben:@feldmaus: `eintrag` wird einzig und allein dafür verwendet um aus `katalog` den dazugehörigen Wert zu holen. Da Du aber sowieso über alle Werte aus `katalog` iterierst, ist dieser Umweg über den Schlüssel unnötig. Du kannst auch gleich über `katalog.itervalues()` iterieren.
Weil ich nur Daten eingeben will und keine zusätzliche Ausgabe benötige, dass macht das Child schon für mich. Ich hatte eine Fehlermeldung bei raw_input(). Die genaue Fehlermeldung weiß ich nicht mehr, wahrscheinlich hat sich bei den Ausgaben irgendwas gebissen. Ich weiß es nicht mehr :K . Das mit dem Modul getpass finde ich gut und wollte ich eigentlich später ansprechen, aber egalBlackJack hat geschrieben:Warum wird für die Passworteingabe `sys.stdin.readline()` anstelle von `raw_input()` verwendet? Sicherer wäre die Eingabe über das `getpass`-Modul. Dann kann niemand die eingegebenen Passwörter am Bildschirm mitlesen.
Code: Alles auswählen
for eintrag in katalog:
for benutzer in katalog[eintrag]['Benutzer']:
wasWillstDu=raw_input('Sichern/Zurueckspielen/Nichts'+katalog[eintrag]['Frage'][0]+benutzer+katalog[eintrag]['Frage'][1])
passwort=benutzer_passwoerter.get(benutzer, '')
if wasWillstDu in 'sSzZ' and wasWillstDu not in '':
child=rsync()
child.logfile_read = sys.stdout
while child.isalive():
statusChild=child.expect([' password:', 'denied', pexpect.TIMEOUT, pexpect.EOF], timeout=-1)
if statusChild == 0:
child.sendline(passwort)
elif statusChild == 1:
passwort=sys.stdin.readline()
benutzer_passwoerter[benutzer]=passwort
child.sendline(passwort)
Ich werde mal ein wenig konkreter, aber nicht zu viel. Hier der CodeBlackJack hat geschrieben:@feldmaus: Mit dem Iterator solltest Du selbst überhaupt nichts machen ausser darüber iterieren -- mit einer ``for``-Schleife und nicht "zu Fuss".
Code: Alles auswählen
iterEintraege=katalog.itervalues()
for benutzer in iterEintraege.next()['Benutzer']:
wasWillstDu=raw_input('Sichern/Zurueckspielen/Nichts'+katalog[eintrag]['Frage'][0]+benutzer+katalog[eintrag]['Frage'][1])
passwort=benutzer_passwoerter.get(benutzer, '')
if wasWillstDu in 'sSzZ' and wasWillstDu not in '':
child=rsync()
child.logfile_read = sys.stdout
while child.isalive():
statusChild=child.expect([' password:', 'denied', pexpect.TIMEOUT, pexpect.EOF], timeout=-1)
if statusChild == 0:
child.sendline(passwort)
elif statusChild == 1:
passwort=sys.stdin.readline()
benutzer_passwoerter[benutzer]=passwort
child.sendline(passwort)
Code: Alles auswählen
for benutzer in eintrag=iterEintraege.next()['Benutzer']:
Code: Alles auswählen
for eintrag in katalog.itervalues():
for benutzer in eintrag['Benutzer']:
wasWillstDu=raw_input('(S)ichern/(Z)urueckspielen/(N)ichts/(A)bbrechen'+eintrag['Frage'][0]+benutzer+eintrag['Frage'][1]+' ? (s/z/n/a) ')
passwort=benutzer_passwoerter.get(benutzer, '')
if wasWillstDu in 'sSzZ' and wasWillstDu not in '':
child=rsync()
child.logfile_read = sys.stdout
while child.isalive():
statusChild=child.expect([' password:', 'denied', pexpect.TIMEOUT, pexpect.EOF], timeout=-1)
if statusChild == 0:
child.sendline(passwort)
elif statusChild == 1:
passwort=getpass.getpass('')
# passwort=sys.stdin.readline()
benutzer_passwoerter[benutzer]=passwort
child.sendline(passwort)
elif wasWillstDu in 'aAqQ' and wasWillstDu not in '':
sys.exit(0)
Code: Alles auswählen
for eintrag in katalog.values():
benutzer = eintrag['Benutzer']
[...]
Habs ausprobiert, kann ich nicht nachvollziehen. Bei mir funktionierts wie erwartet.feldmaus hat geschrieben:Das getpass Modul macht nicht das was es soll. Das eingegebene Passwort wird jedes mal an die Variable <passwort> angehängt. Also z.b. gebe ich zu erst 943jfn ein dann sj38sks und dann dk32k5, dann würde beim dritten Durchgang die Variable passwort wie folgt lauten 943jfnsj38sksdk32k5