除了更新日期的最重要部分外,我终于可以使用我的python pexpect脚本了!我可以在框中进行SSH,但第二条命令无法正确执行。我一直在想办法找出原因。我已经检查了字符串的输出,它应该根据编码进行工作。我在python或pexpect方面不是专家,因此我需要一些帮助来弄清楚为什么我的时间没有更新。
我的原始代码 :
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)s@%(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()
新代码 :
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()
我得到的新错误 :
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().
错误解决方案
我想出了解决我得到的错误的方法。由于一个已知的错误,我不得不在usr / lib / python.2.6 / dist-packages / pxssh.py中添加以下行:
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