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
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
@Sebastian tarafından 'pip' python-pip 'demek istiyor musunuz? – WorkerBee
evet, ['pip'] (http://www.pip-installer.org/). – jfs