#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>)
большое спасибо!