Python, имеющий дело с SSH [много клиентов] - PullRequest
1 голос
/ 06 июня 2011

я управляю 3 сервером [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

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

послеedit

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

я добавляю это к своему коду:

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, но он дает им вместе ту же команду, третий серверничего не выполняет

Ответы [ 4 ]

3 голосов
/ 06 июня 2011
for F1 in ZI1:

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

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

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

ssh.exec_command('ls -la')

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

2 голосов
/ 07 июня 2011

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

0 голосов
/ 07 августа 2011

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

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

0 голосов
/ 06 июня 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...