Nano Hash - криптовалюты, майнинг, программирование

python pexpect: SSHing, а затем обновление даты

У меня наконец-то работает скрипт pexpect на python, за исключением самой важной части, обновляющей дату! Я могу использовать 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
09.04.2013

  • Обновите версию pexpect, например, чтобы установить ее на ~/.local, запустите: pip install --user pexpect. Тайм-аут должен обрабатываться самим pexpect. 19.04.2013
  • @Sebastian под pip ты имеешь в виду python-pip? 19.04.2013
  • да, pip. 20.04.2013

Ответы:


1

РЕШЕНИЕ ОШИБКИ

Я понял решение ошибки, которую я получал. Из-за известной ошибки мне пришлось добавить следующие строки в 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
24.02.2014
  • Что касается меня, эта строка использовалась только для очистки буфера от всего, что выдает ssh login. После этого они отправляют пустую команду, чтобы вызвать еще один быстрый вывод. Таким образом, я считаю, что эту строку можно просто завернуть в try-except-pass, чтобы игнорировать случай, когда на входе ничего не осталось. 14.07.2014

  • 2

    Вероятно, вам следует обработать запрос пароля sudo (+ опция -t ssh для получения tty) и использовать p.expect(EOF) перед p.close(), чтобы избежать преждевременного завершения дочернего процесса.

    Вот пример, основанный на документах pexpect:

    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)
    

    Вы также можете попробовать fabric:

    # fabfile.py
    from fabric.api import run, sudo
    
    def date():
        run('date')
        sudo('date')
    

    Использование:

    $ fab -H localhost,user@host date
    
    09.04.2013
  • @ Себастьян, я пробовал то, что вы поставили, но у меня по-прежнему возникают проблемы с s.login(hostname, username, password). Я дважды проверил значения, которые я передаю этой функции, и все выглядит правильно. Я даже пытался запустить пример кода по предоставленной вами ссылке, и ошибки кода выводятся в той же строке. 17.04.2013
  • @Sebastian, пожалуйста, проверьте мой исходный пост для моего недавно обновленного кода 17.04.2013
  • @Sebastian, пожалуйста, проверьте мой исходный пост на наличие ошибки, которую я получаю 18.04.2013
  • @Sebastian, я нашел решение ошибки, которую получал. Я собираюсь запустить быстрый тест, чтобы убедиться, что все остальное работает правильно. Если все работает, я отмечу ваш ответ как правильный сегодня. 22.04.2013

  • 3

    Любым другим бедолагам, таким как я, застрявшим на python 2.6 в 2019 году и не желающим взламывать их сайт-пакеты, я смог решить эту проблему, установив для maxread значение 1 в конструкторе.

    pxssh.pxssh(maxread=1)

    01.03.2019
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..