2013-04-09 12 views
5

Sonunda, python pexpect betiğimin tarihini güncellemenin en önemli kısmı dışında çalışmasına son verdim! Kutudaki SSH'yi kullanabiliyorum ama ikinci komutum düzgün çalışmıyor. Kafamı neden anlamaya çalıştığını anladım. Sokmanın çıktısını kontrol ettim ve kodlanmış olana göre çalışmalı. Python veya pexpect konusunda uzman değilim, bu yüzden zamanımın neden güncellenmediğini anlamak için biraz yardıma ihtiyacım var.python pexhon: SSHing, ardından tarihi güncellemek

benim orijinal kod:

list = ["089"] 
sn = 0 

ssh_new_conn = 'Are you sure you want to continue connecting' 

class ThreadClass(threading.Thread): 
def __init__(self, index): 
super(ThreadClass, self).__init__() 
self.index = index 
def run(self): 

sn = storelist[self.index] 


#easterndate = (currenttime + datetime.timedelta(0, 3600)) 
#easterndate = easterndate 

est = timezone('US/Eastern') 
cst = timezone('US/Central') 
#currenttime = (datetime.now()) 
currenttime = cst.localize(datetime.now()) 
#easterndate = (currenttime + timedelta(0, 3600)) 
#easterndate = easterndate.strftime("%a %b %d %H:%M:%S %Z %Y") 
easterndate = currenttime.astimezone(est).strftime("%a %b %d %H:%M:%S %Z %Y") 
command1 = "/usr/bin/ssh %(username)[email protected]%(hostname)s" % locals() 
command2 = " sudo date -s\"%(easterndate)s\"" % locals() 
command3 = " sudo date -s\"%(currenttime)s\"" % locals() 
now = datetime.now() 

#central 
if sn == "073" or sn == "066" or sn == "016": #or sn == "022": 
    p = pexpect.spawn((command1 + command3), timeout=360) 


#eastern 
else: 
    print(command1 + command2) 
    p = pexpect.spawn((command1 + command2), timeout=360) 


# Handles the 3 possible connection outcomes: 
# a) Ssh to the remote host for the first time, triggering 'Are you sure you want to continue connecting' 
# b) ask you for password 
# c) No password is needed at all, because you already have the key. 
i = p.expect([ssh_new_conn,'[pP]assword:',pexpect.EOF]) 
print ' Initial pexpect command output: ', i 
if i == 0: 
    # send 'yes' 
    p.sendline('yes') 
    i = p.expect(['[pP]assword:',pexpect.EOF]) 
    print 'sent yes. pexpect command output', i 
    if i == 0: 
     # send the password 
     print "logging into box %(sn)s" % locals() 
     p.sendline(password) 
     print "login successful" 
     print "Setting the time..." 

elif i == 1: 
    # send the password 
    print "logging into box %(sn)s" % locals() 
    p.sendline(password) 
    print "login successful" 
    print "Setting the time..." 
    p.close() 

elif i == 2: 
    print "pexpect faced key or connection timeout" 
    pass 

print p.before 

for i in range(len(list)): 
    t = ThreadClass(i) 
    t.start() 

Yeni Kod: Ben alıyorum

class ThreadClass(threading.Thread): 
def __init__(self, index): 
    super(ThreadClass, self).__init__() 
    self.index = index 
def run(self): 

    try: 
     sn = storelist[self.index] 
     username = raw_input('username: ') 
     password = raw_input('password: ') 
     hostname = "[hostname]" 
     est = timezone('US/Eastern') 
     cst = timezone('US/Central') 
     #currenttime = (datetime.now()) 
     currenttime = cst.localize(datetime.now()) 
     #easterndate = (currenttime + timedelta(0, 3600)) 
     #easterndate = easterndate.strftime("%a %b %d %H:%M:%S %Z %Y") 
     easterndate = currenttime.astimezone(est).strftime("%a %b %d %H:%M:%S %Z %Y") 
     ssh = pxssh.pxssh() 

     print(hostname + " " + username + " " + password) 
     ssh.login(hostname, username, password) 

     if sn == "073" or sn == "066" or sn == "016": #or sn == "022": 
      ssh.sendline ('date')  # run a command 
      ssh.prompt()    # match the prompt 
      print(s.before)   # print everything before the prompt. 
      ssh.sendline ('sudo date -s\"%(currenttime)s\"' % locals()) # run a command 
      ssh.expect('(?i)password.*:') # match password prompt for sudo 
      ssh.sendline(password) 
      ssh.prompt() 
      print(s.before) 
      ssh.logout() 
     else: 
      ssh.sendline ('date')  # run a command 
      ssh.prompt()    # match the prompt 
      print(s.before)   # print everything before the prompt. 
      ssh.sendline ('sudo date -s\"%(easterndate)s\"' % locals()) # run a command 
      ssh.expect('(?i)password.*:') # match password prompt for sudo 
      ssh.sendline(password) 
      ssh.prompt() 
      print(s.before) 
      ssh.logout() 

    except pxssh.ExceptionPxssh as e: 
     print(e) 


for i in range(len(storelist)): 
    t = ThreadClass(i) 
    t.start() 

Yeni Hata:

Traceback (most recent call last): 
    File "./sshtest.py", line 8, in <module> 
    s.login (hostname, username, password) 
    File "/usr/lib/python2.6/dist-packages/pxssh.py", line 243, in login 
    if not self.synch_original_prompt(): 
    File "/usr/lib/python2.6/dist-packages/pxssh.py", line 134, in synch_original_prompt 
    self.read_nonblocking(size=10000,timeout=1) # GAS: Clear out the cache before getting the prompt 
    File "/usr/lib/python2.6/dist-packages/pexpect.py", line 824, in read_nonblocking 
    raise TIMEOUT ('Timeout exceeded in read_nonblocking().') 
pexpect.TIMEOUT: Timeout exceeded in read_nonblocking(). 

HATA ÇÖZÜMÜ ERİŞİM

Aldığım hatanın çözümünü çözdüm.

self.sendline()  #line 134 
time.sleep(0.5)  #line 135 
self.read_nonblocking(size=10000,timeout=1) # GAS: Clear out the cache before getting the prompt 
+0

güncelleme pexpect versiyonu örneğin,: nedeniyle bilinen bir hatadan ben usr/lib/python.2.6/dist-paketler/pxssh.py aşağıdaki satırları eklemek zorunda , çalıştırın: 'pip install --user pexpect'. Zaman aşımı, pexpect'in kendisi tarafından ele alınmalıdır. – jfs

+0

@Sebastian tarafından 'pip' python-pip 'demek istiyor musunuz? – WorkerBee

+1

evet, ['pip'] (http://www.pip-installer.org/). – jfs

cevap

1

ÇÖZÜM

hatasına İşte

pexpect docs dayanan bir örnek

Aldığım hatanın çözümünü çözdüm. ~/.local` `yüklemek için

self.sendline()  #line 134 
time.sleep(0.5)  #line 135 
self.read_nonblocking(size=10000,timeout=1) # GAS: Clear out the cache before getting the prompt 
+0

Bana göre, bu satır sadece ssh girişinin yaydığı her şeyden arabelleği temizlemek için kullanılır. Bundan sonra, başka bir komut istemi oluşturmak için boş komutlar gönderirler. Bu yüzden, girişte hiç bir şey kalmadığında satırın görmezden gelmesi için satırın basitçe "try-except-pass" içine sarılabileceğine inanıyorum. – ony

1

Muhtemelen sudo şifre istemini (+ -t ssh seçeneği işlemesi gereken: nedeniyle bilinen bir hatadan ben usr/lib/python.2.6/dist-paketler/pxssh.py aşağıdaki satırları eklemek zorunda bir tty olsun) ve 'u p.close()'dan önce kullanarak çocuk sürecini zamanından önce öldürmekten kaçının.

import pxssh 
try: 
    s = pxssh.pxssh() 
    s.login (hostname, username, password) 
    s.sendline ('date')  # run a command 
    s.prompt()    # match the prompt 
    print(s.before)   # print everything before the prompt. 
    s.sendline ('sudo date') # run a command 
    s.expect('(?i)password.*:') # match password prompt for sudo 
    s.sendline(password) 
    s.prompt() 
    print(s.before) 
    s.logout() 
except pxssh.ExceptionPxssh as e: 
    print(e) 

Ayrıca fabric deneyebilirsiniz:

# fabfile.py 
from fabric.api import run, sudo 

def date(): 
    run('date') 
    sudo('date') 

Kullanımı:

$ fab -H localhost,[email protected] date 
+0

@Sebastian Ne koyduğunuzu denedim ama s.login (hostname, kullanıcı adı, şifre) 'ile ilgili bir sorun yaşamaya devam ediyorum. Bu işleve aktardığım değerleri iki kez kontrol ettim ve her şey doğru görünüyor. Hatta kullandığınız bağlantıdan örnek kodu çalıştırmayı ve aynı satırda kod hatalarını çıkarmayı denedim. – WorkerBee

+0

@Sebastian yeni güncellenmiş kodum için lütfen orijinal yazımı kontrol edin – WorkerBee

+0

@WorkerBee: Aldığınız hatayı gönderin. – jfs