1

私は 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

まあ、それもうまくいきません;(接続を閉じたりスクリプトを終了したりせずに、それぞれを入力してスクリプトを実行し、別のサーバーに移動したいので、助けてください。

編集後

今、私はそれを編集し、新しい問題が発生しました

私はこれを私のコードに追加します:

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を実行し、2 番目のls -laサーバーがコマンドを実行すると言いましたが、同じコマンドを一緒に与えます 3 番目のサーバーは何も実行しません

4

4 に答える 4

3
for F1 in ZI1:

ここで何をしようとしているのか?For は何かを繰り返していますが、何も繰り返したくありません。

次の 2 行のコードの違いがわかりますか。

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

ssh.exec_command('ls -la')

2 番目と 3 番目のサーバーは両方とも、まだ最初のサーバーの stdout を使用しています。stdin、stdout、stderr を再度取得する必要があります。

于 2011-06-06T19:55:06.567 に答える
2

これを行うには、おそらく Fabric を使用する必要があります。それはあなたにとってずっと簡単です。

于 2011-06-06T21:46:17.950 に答える
0

問題は、呼び出していることであるように見えます。stdout.readlines()これは、読み取る入力がなくなるまでSSHコマンドからの出力を読み取り続けます...そのため、プログラムはそれまで進みません。簡単な解決策として、各コマンドを独自のスレッドでfork実行することも、独自のプロセススペースで実行することもできます。

于 2011-06-06T17:15:43.993 に答える
0

IMHO、あなたは間違った方向からこの問題に取り組んでいます...

リモート ホストから接続する代わりに、リモート マシンにcronスクリプトを設定してみてはいかがでしょうか。

于 2011-08-07T06:14:48.710 に答える