Python, имеющий дело с SSH [много клиентов]

1

i mange 3 server [Linux], и я должен включать скрипты на этих серверах каждые 6 часов

поэтому для каждого входа требуется бит времени бит, поэтому я сделал этот код

import paramiko
import os
ZI1={"ip":"192.168.1.2","pass":"server-1"}
ZI2={"ip":"192.168.1.3","pass":"Server-2"}
ZI3={"ip":"192.168.1.4","pass":"server-3"}
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
SPAM=1
while SPAM==3:
    ssh.connect(ZI1["ip"],username='root', password=ZI1["pass"])
    stdin, stdout, stderr = ssh.exec_command('perl Register.pl')
    print stdout.readlines()
    SPAM+=1
    ssh.connect(ZI2["ip"],username='root', password=ZI2["pass"])
    stdin, stdout, stderr = ssh.exec_command('perl Register.pl')
    print stdout.readlines()
    SPAM+=1
    ssh.connect(ZI2["ip"],username='root', password=ZI2["pass"])
    stdin, stdout, stderr = ssh.exec_command('perl Register.pl')
    print stdout.readlines()
    ssh.close()
    SPAM+=1

ну, это тоже не работает; (я хочу ввести каждый из них и запустить script и перейти к другой сервер, не закрывая соединение или не заканчивая script, поэтому, пожалуйста, помогите мне.

после редактирования

теперь я его редактирую, и у меня появились новые проблемы

Я добавлю это в свой код:

import paramiko
import os
ZI1={"ip":"192.168.1.2","pass":"server-1"}
ZI2={"ip":"192.168.1.3","pass":"Server-2"}
ZI3={"ip":"192.168.1.4","pass":"server-3"}
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

for F1 in ZI1:
    ssh.connect(ZI1["ip"],username='root', password=ZI1["pass"])
    stdin, stdout, stderr = ssh.exec_command('uname -a')
    print stdout.readlines()
    ssh.close()
for F2 in ZI2:
    ssh.connect(ZI2["ip"],username='root', password=ZI2["pass"])
    ssh.exec_command('ls -la')
    print stdout.readlines()
    ssh.close()
for F3 in ZI3:
    ssh.connect(ZI2["ip"],username='root', password=ZI2["pass"])
    ssh.exec_command('pwd')
    print stdout.readlines()
    ssh.close()

и я даю каждой отдельной команде, чтобы увидеть, работает ли она, и я получил очень странный выход

['Linux xxxx 2.6.18-028stab070.14 #1 SMP Thu Nov 18 16:04:02 MSK 2010 x 86_64 x86_64 x86_64 GNU/Linux\n'] ['Linux xxxx 2.6.18-028stab070.14 #1 SMP Thu Nov 18 16:04:02 MSK 2010 x 86_64 x86_64 x86_64 GNU/Linux\n'] [] [] [] []

я сказал, что первый сервер выполняет команду uname -a, а второй выполняет команду ls -la, но он дает им одну и ту же команду. Третий сервер ничего не выполняет

  • 2
    что "не работает так же хорошо"? Связь закрыта?
  • 3
    У вашего кода есть логическая проблема. Блок while никогда не будет выполнен. Не то, что это ваша главная проблема, но одна из них.
Показать ещё 3 комментария
Теги:
ssh
paramiko

4 ответа

3
Лучший ответ
for F1 in ZI1:

Какую жареную обезьяну вы пытаетесь сделать здесь? Для чего-то повторяется, но вы ничего не хотите повторять.

Вы видите разницу между этими двумя строками кода:

stdin, stdout, stderr = ssh.exec_command('uname -a')

ssh.exec_command('ls -la')

Второй и третий серверы все еще используют stdout с первого сервера. Вам нужно снова запустить stdin, stdout, stderr.

2

Вероятно, вы должны использовать Fabric для этого. Это было бы намного проще для вас.

Показать ещё 1 комментарий
0

ИМХО, вы приближаетесь к этой проблеме с неправильного конца...

Вместо того, чтобы устанавливать соединение с удаленным хостом, почему бы вам не настроить cron скрипты на удаленных компьютерах.

0

Похоже, что ваша проблема заключается в том, что вы вызываете stdout.readlines(), который будет продолжать читать вывод из команды SSH, пока не будет больше ввода для чтения... поэтому ваша программа не продвинется до тогда. В качестве простого решения вы можете выполнить каждую команду в своем потоке, или вы можете fork и выполнить ее в своем собственном пространстве процесса.

  • 0
    так что проблема в том, что мой сценарий не соединяется, как мне кажется ... может кто-нибудь дать мне маленькие подсказки <3
  • 1
    Прочитав ответ Уинстона, я должен согласиться с ним насчет жарки обезьян. Немного более внимательного изучения вашего кода показывает, что все это один огромный
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню