2013-07-26 18 views
6

próbuję uruchomić kod w interakcji z SSH Poprzez Pexpect i Brute wymuszanie haseł SSH z Pxssh sekcje z rozdziałem 2 Violent Python. Przy użyciu zarówno child.expect() jak i pxssh otrzymuję podobne błędy EOF.EOF podczas korzystania pexpect i pxssh

Running tych poleceń z konsoli Pythona:

import pexpect 
connStr = "ssh [email protected]" 
child = pexpect.spawn(connStr) 
ret = child.expect([pexpect.TIMEOUT, ssh_newkey, "[P|p]assword:"]) 

uzyskać ten wynik:

Traceback (most recent call last): 
    File "<input>", line 1, in <module> 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pexpect.py", li 
ne 1316, in expect 
    return self.expect_list(compiled_pattern_list, timeout, searchwindowsize) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pexpect.py", li 
ne 1330, in expect_list 
    return self.expect_loop(searcher_re(pattern_list), timeout, searchwindowsize) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pexpect.py", li 
ne 1401, in expect_loop 
    raise EOF (str(e) + '\n' + str(self)) 
EOF: End Of File (EOF) in read_nonblocking(). Empty string style platform. 
<pexpect.spawn object at 0x10180c550> 
version: 2.4 ($Revision: 516 $) 
command: /usr/bin/ssh 
args: ['/usr/bin/ssh', '[email protected]'] 
searcher: searcher_re: 
    0: TIMEOUT 
    1: re.compile("Are you sure you want to continue connecting") 
    2: re.compile("[P|p]assword:") 
buffer (last 100 chars): 
before (last 100 chars): 
after: <class 'pexpect.EOF'> 
match: None 
match_index: None 
exitstatus: 255 
flag_eof: True 
pid: 12122 
child_fd: 4 
closed: False 
timeout: 30 
delimiter: <class 'pexpect.EOF'> 
logfile: None 
logfile_read: None 
logfile_send: None 
maxread: 2000 
ignorecase: False 
searchwindowsize: None 
delaybeforesend: 0.05 
delayafterclose: 0.1 
delayafterterminate: 0.1 

i prowadzeniu tych poleceń, używając pxssh:

import pxssh 
s = pxssh.pxssh() 
s.login("127.0.0.1", "root", "1234") 

otrzymuję ten wyjścia :

Traceback (most recent call last): 
    File "<input>", line 1, in <module> 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pxssh.py", line 
196, in login 
    i = self.expect(["(?i)are you sure you want to continue connecting", original_prompt, "(?i)(?:pas 
sword)|(?:passphrase for key)", "(?i)permission denied", "(?i)terminal type", TIMEOUT, "(?i)connectio 
n closed by remote host"], timeout=login_timeout) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pexpect.py", li 
ne 1316, in expect 
    return self.expect_list(compiled_pattern_list, timeout, searchwindowsize) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pexpect.py", li 
ne 1330, in expect_list 
    return self.expect_loop(searcher_re(pattern_list), timeout, searchwindowsize) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pexpect.py", li 
ne 1401, in expect_loop 
    raise EOF (str(e) + '\n' + str(self)) 
EOF: End Of File (EOF) in read_nonblocking(). Empty string style platform. 
<pxssh.pxssh object at 0x1016bff90> 
version: 2.4 ($Revision: 516 $) 
command: /usr/bin/ssh 
args: ['/usr/bin/ssh', '-q', '-l', 'root', '127.0.0.1'] 
searcher: searcher_re: 
    0: re.compile("(?i)are you sure you want to continue connecting") 
    1: re.compile("[#$]") 
    2: re.compile("(?i)(?:password)|(?:passphrase for key)") 
    3: re.compile("(?i)permission denied") 
    4: re.compile("(?i)terminal type") 
    5: TIMEOUT 
    6: re.compile("(?i)connection closed by remote host") 
buffer (last 100 chars): 
before (last 100 chars): 
after: <class 'pexpect.EOF'> 
match: None 
match_index: None 
exitstatus: None 
flag_eof: True 
pid: 12136 
child_fd: 3 
closed: False 
timeout: 30 
delimiter: <class 'pexpect.EOF'> 
logfile: None 
logfile_read: None 
logfile_send: None 
maxread: 2000 
ignorecase: False 
searchwindowsize: None 
delaybeforesend: 0.05 
delayafterclose: 0.1 
delayafterterminate: 0.1 

Otrzymuję podobne wyniki, gdy zastępuję 127.0.0.1 z innymi hostami i próbuję różnych kombinacji nazwy użytkownika i hasła.

Sugeruje użycie przy użyciu expect(pexpect.EOF), aby uniknąć generowania wyjątku EOF. Rzeczywiście, gdy wykonuję następujące czynności:

connStr = "ssh [email protected]" 
child = pexpect.spawn(connStr) 
print child.expect(pexpect.EOF) 

Wynikiem jest 0.

Ale następujące pytania pozostają:

  1. Jestem zdezorientowany przez składni książki: child.expect([pexpect.TIMEOUT, ssh_newkey, "[P|p]assword:"]). Dlaczego przekazujemy listę do expect()? Co ma zawierać ta lista?
  2. Jak korzystać z expect(pexpect.EOF), zgodnie z instrukcją, podczas korzystania z pxssh?
  3. Dlaczego kod w książce nie działa poprawnie? Czy coś zmieniło się w bibliotece pexpect od czasu publikacji książki? Czy to dlatego, że jestem na OS X?

Mam Python 2.7 i pexpect 2.4 działa na Mac OS X 10.8.4.

+0

Być może dodano publiczny klucz ssh na komputerze, który próbuje się połączyć z hostem. Czy jesteś pewien, że przy próbie połączenia pojawia się pytanie o hasło? – orezvani

+0

Mam także do czynienia z tym samym problemem. Czy jest na to jakieś rozwiązanie ? – Nikole

Odpowiedz

5

Odnośnie # 2: Oczekiwanie EOF jest tutaj czerwonym śledziem. Nie oczekujesz EOF przy logowaniu, oczekujesz podania hasła przy logowaniu. pxssh wykopuje ten błąd, gdy odzyskuje EOF podczas logowania z ssh bez otrzymania hasła. Może się tak zdarzyć, ponieważ używasz ssh -q, aby nie otrzymywać ostrzeżeń, a otrzymujesz ostrzeżenie od ssh. Weź opcje ssh to korzysta i uruchomić je samodzielnie bez Q:

/usr/bin/ssh -l korzeń 127.0.0.1

W moim przypadku mogę dostać ten komunikat o błędzie, gdy ssh jest kopanie się znane naruszenie hostów spowodowane przez maszynę, z którą łączę się w celu zmiany jej tożsamości.

1

Miałem ten sam błąd podczas próby użycia self.expect() w pxssh. Zmiana opcji ssh poprzez usunięcie "-q" nie działała dla mnie.

Postępowałem zgodnie z instrukcjami na tej stronie, dodając pexpect.EOF jako jedno z wejść do self.expect().Spowoduje to, że jest odbierany czekać skrypt do całego łańcucha przed wyjściem po otrzymaniu EOF:

http://pexpect.readthedocs.org/en/stable/overview.html

i = self.expect(["(?i)are you sure you want to continue connecting", original_prompt, "(?i)(?:password.*)|(?:passphrase for key)", "(?i)permission denied", "(?i)terminal type", pexpect.EOF, TIMEOUT, "(?i)connection closed by remote host"], timeout=login_timeout) 

Z tym, że działa dobrze!

Powiązane problemy