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
, но он дает им одну и ту же команду. Третий сервер ничего не выполняет
for F1 in ZI1:
Какую жареную обезьяну вы пытаетесь сделать здесь? Для чего-то повторяется, но вы ничего не хотите повторять.
Вы видите разницу между этими двумя строками кода:
stdin, stdout, stderr = ssh.exec_command('uname -a')
ssh.exec_command('ls -la')
Второй и третий серверы все еще используют stdout с первого сервера. Вам нужно снова запустить stdin, stdout, stderr.
Вероятно, вы должны использовать Fabric для этого. Это было бы намного проще для вас.
ИМХО, вы приближаетесь к этой проблеме с неправильного конца...
Вместо того, чтобы устанавливать соединение с удаленным хостом, почему бы вам не настроить cron скрипты на удаленных компьютерах.
Похоже, что ваша проблема заключается в том, что вы вызываете stdout.readlines()
, который будет продолжать читать вывод из команды SSH, пока не будет больше ввода для чтения... поэтому ваша программа не продвинется до тогда. В качестве простого решения вы можете выполнить каждую команду в своем потоке, или вы можете fork
и выполнить ее в своем собственном пространстве процесса.
while
никогда не будет выполнен. Не то, что это ваша главная проблема, но одна из них.