Команды в блоке Paramiko из-за времени выполнения скрипта

#python #session #ssh #paramiko

#python #сессия #ssh #paramiko

Вопрос:

привет, ребята, у меня есть три сервера, и я управляю ими по SSH, поэтому я создал этот скрипт для запуска моего сценария регистрации «Register.py «итак, каждый день я включаю режим регистрации, поэтому проблема в том, как я могу войти в несколько SSH-соединений, не закрывая другое

 import paramiko
import os
ZI1={"ip":"192.168.1.2","pass":"Administrator"}
ZI2={"ip":"192.168.1.3","pass":"AdminTeachers"}
ZI3={"ip":"192.168.1.4","pass":"AdminStudents"}
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
for F1 in ZI1:
    ssh.connect(ZI1["ip"],username='root', password=ZI1["pass"])
    ssh.exec_command('./register.py -time 6') #6 hour so the script still working for 6 hours
    ssh.close()
for F2 in ZI2:
    ssh.connect(ZI2["ip"],username='root', password=ZI2["pass"])
    ssh.exec_command('./register.py -time 6')
    ssh.close()
for F3 in ZI3:
    ssh.connect(ZI2["ip"],username='root', password=ZI2["pass"])
    ssh.exec_command('./register.py -time 6')
    ssh.close()
  

итак, что я должен сделать, чтобы открыть 3 сеанса без остановки скрипта!!

Комментарии:

1. Вы пробовали создать 3 экземпляра paramiko. SSHClient() и размещение их в потоках-разделителях?

2. @Johnsyweb, он задает другой вопрос о том же скрипте. Для меня это не похоже на дублирование

3. @Mike Pennington, @jack-X: Я сижу исправленный, с извинениями.

Ответ №1:

Я бы посоветовал взглянуть на Fabric. Это может помочь вам в работе с SSH-соединениями.

Ответ №2:

То, как вы сейчас это делаете, блокируется, потому что вы не выходите из хостов в течение шести часов.

Многопроцессорность:

Если вам нужно увидеть коды возврата из скрипта, вы должны открыть свои соединения с каждым хостом, используя многопроцессорный модуль Python.

nohup:

Другой метод (который не позволит вам увидеть возвращаемое значение скрипта через paramiko ) заключается в использовании nohup для отделения скрипта от оболочки. Это переведет его в фоновый режим и позволит вам выйти из системы. Для этого используйте…

     ssh.exec_command('nohup ./register.py -time 6 amp;') 
  

Опечатки:

Кстати, у вас были опечатки в последнем цикле … ZI2 должны быть ZI3 в последнем цикле … более того, for циклы не нужны… Я исправил вашу самую последнюю итерацию… Спасибо @johnsyweb за обнаружение большего количества опечаток в OP, чем я…

 ssh.connect(ZI3["ip"],username='root', password=ZI3["pass"])
ssh.exec_command('./register.py -time 6')   # <------------- missing s in ssh
ssh.close()
  

Комментарии:

1. Вверх!!! пожалуйста, помогите мне, я получил ошибку (<class 'socket.error'>, error(10061, 'No connection could be made because the t arget machine actively refused it'), <traceback object at 0x0290BDC8>)

2. Это не единственная ошибка в этом последнем цикле for, она также ссылается ZI2 , предположительно, на ошибку копирования и вставки из предыдущего блока. Более уместно: почему вы используете for цикл здесь? Нет никакой итерации, кроме выполнения всего дважды (потому что в этом есть два элемента dict ). Я утверждаю, что cron это лучший подход здесь.

3. @Johnsyweb, я согласен с тем, что вы сказали… Я написал это, когда этим утром готовился выйти за дверь на работу; Я должен был заметить проблемы с for циклом. Что касается cron , возможно, это правда, но если это домашнее задание, на него могут надеть наручники paramiko … Я оставлю это для комментариев OP.

4. Хе-хе. Я знаю, на что это похоже. Я допустил аналогичную ошибку, пометив это как дубликат, когда спешил сделать что-то еще.

Ответ №3:

Другой способ — использовать Thread, если вам нужно выполнить какое-либо действие, основанное на возврате Register.py

Смотрите пример:

 import paramiko
import os
import sys
from threading import Thread

SERVER_LIST = [{"ip":"192.168.1.2","pass":"Administrator"},{"ip":"192.168.1.4","pass":"AdminStudents"},{"ip":"192.168.1.3","pass":"AdminTeachers"}]



class ExecuteRegister(Thread):
    def __init__ (self,options):
        Thread.__init__(self)
        self.options = options       
        self.ssh = paramiko.SSHClient()
        self.ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())



    def run(self):
        try:
           self.ssh.connect(self.options['ip'],username='root', password=self.options["pass"])
           self.ssh.exec_command('./register.py -time 6') #6 hour so the script still working for 6 hours
           self.ssh.close()
        except:
           print sys.exc_info()



for server in SERVER_LIST:
    Register = ExecuteRegister(server)
    Register.start()
  

Комментарии:

1. mr.olarva ваш код заставляет скрипт продолжать работать, не закрывая его? (сеанс все еще открыт?) также я получил эту ошибку! (<class 'socket.er onnected party did onnection failed b ct at 0x02888D78>) большое спасибо!