SSHバッチログインとコマンド実行のためのPython実装コード

WBOY
リリース: 2016-06-16 08:47:04
オリジナル
1106 人が閲覧しました

LAN 内には 100 台以上のコンピュータがあり、すべて Linux オペレーティング システムであり、すべてのコンピュータが同じ構成および同じシステム (ユーザー名とパスワードを含む) を持ち、IP アドレスが自動的に割り当てられます。これらのコンピュータ上で特定のコマンドを実行したり、特定のソフトウェアのインストール、特定のファイルのコピー、一括シャットダウンなどの特定の操作を実行したりするタスクが存在します。一つ一つ手動で操作しなければならない場合、時間も手間もかかりますし、複数の操作が必要な場合はさらに手間がかかります。
オンライン同時通訳とは何ですか?これは、コンピュータにインストールして設定し、「Lenovo ネットワーク同時通訳」などのソフトウェアを使用して、システムをそのままコピーすることを意味します。これは、システムをインストールするときに非常に便利です。 1 台のコンピュータで同時通訳 将来的には、すべてのコンピュータにオペレーティング システムがインストールされ、非常に便利になります。同時通訳では、すべてのコンピューターがまったく同じハードウェアを備えている必要があります。Lenovo のコンピューターにインストールされているシステムを創設者のコンピューターに移すと、必ず問題が発生します。システムのアップロードも、ハード ドライブのサイズによっては非常に時間がかかり、30G のハード ドライブの場合は 100 台以上のコンピュータに転送するのに 2 時間以上かかります。一つずつ!ただし、システムが転送されていて、ソフトウェアをインストールし忘れていることが判明した場合、またはまだ若干の変更を加える必要がある場合は、同時に再転送することもできますが、速度が遅すぎて、 2回転送すると半日かかります。現時点では、ssh を使用して各コンピューターを制御し、特定のコマンドを実行できます。
まず、ssh リモート ログインのプロセスを思い出してください。最初にコマンド ssh username@192.168.1.x を実行します。初めてログインするとき、システムは接続を継続するかどうかを尋ねます。 「yes」を入力して待ちます。しばらくすると、パスワードを入力するよう求められます。パスワードを正しく入力すると、リモート コンピュータにログインできるようになり、コマンドを実行できるようになります。私たちは、人間とコンピューターの対話が 2 つあることに気付きました。1 つは「はい」と入力し、もう 1 つはパスワードを入力することです。 2 つの対話があるため、特定のコマンドを使用するだけでタスクを完了することはできません。人間とコンピューターの対話を自動対話に変えることを検討できます。Python の pexpect モジュールは、自動対話の実現に役立ちます。次のコードは、pexpect を使用して自動対話型ログインを実現し、コマンドを実行する関数です。

コードをコピー コードは次のとおりです。

# !/usr/bin/env python
# -*-coding: utf-8 -*-
import pexpect
def ssh_cmd(ip, passwd, cmd):
ret = -1
ssh = pexpect.spawn('ssh root@%s "%s"' % (ip, cmd))
try:
i = ssh.expect(['パスワード:', '接続を続行します (はい /いいえ)?']、タイムアウト = 5)
if i == 0 :
ssh.sendline(passwd)
elif i == 1:
ssh.sendline('はい')
ssh.expect('password: ')
ssh.sendline(passwd)
ssh.sendline(cmd)
r = ssh.read()
print r
ret = 0
pexpect.EOF を除く:
print "EOF"
ssh.close()
ret = -1
pexpect.TIMEOUT を除く:
print "TIMEOUT"
ssh.close()
ret = -2
return ret

pexpect モジュールを使用すると、自動対話機能が提供されるため、多くのことが実装できます。 ftp、telnet、ssh、scp の自動ログインなどは非常に実用的です。上記のコードに基づいて、読者はすでにその実装方法を知っていると思います (Python はとても簡単です!)。
上記のコードを使用してタスクを完了しても、プログラムは自動対話が表示されるまで待機する必要があり、また、ubuntu では ssh を使用して接続が遅く、セキュリティを反映するために一連の検証が必要になるため、依然として時間がかかります。 sshの。効率を高めて、できるだけ短い時間で完了する必要があります。その後、Python の paramiko モジュールを発見しました。これにより、ssh ログインの実装が簡単になります。以下のコードを見てください:
コード をコピーします。 コードは次のとおりです:

#-*-coding: utf- 8 -*-
#!/usr/bin/python
import paramiko
インポート スレッド
def ssh2(ip,username,passwd,cmd):
try:
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(ip,22,username,passwd,timeout=5)
cmd の場合:
stdin, stdout, stderr = ssh .exec_command(m)
# stdin.write("Y") #簡単な操作、「Y」を入力
out = stdout.readlines()
#画面出力
o in out:
print o,
print '%stOKn'%(ip)
ssh.close()
以外:
print '%stErrorn'%(ip)
if __name__==' __main__':
cmd = ['cal','echo hello!']#実行するコマンドのリスト
username = "" #ユーザー名
passwd = "" #パスワード
threads = [] #マルチスレッド
print "Begin..."
for i in range(1,254):
ip = '192.168.1.'+str(i)
a= threading.Thread(target=ssh2,args=(ip,username,passwd,cmd))
a.start()

上記のプログラムにはまだいくつかのトリックがあります:
1. マルチスレッドを使用して、同時にログイン要求を発行し、同時にコンピューターに接続します。マルチスレッドの必要はなく、1 つずつ実行するだけで、コンピュータ上での操作が完了するまでに約 5 ~ 10 秒かかります。ソフトウェアのインストールまたはアンインストールの場合、所要時間は異なります。もっと長く。これには 10 ~ 20 分かかりますが、マルチスレッドを使用すると、すべてのコマンドの実行にかかる時間は 2 分未満になります。
2. ソフトウェアをインストールまたはアンインストールするときに、パスワードの入力を求めるプロンプトが表示されるため、root ユーザーとしてログインすることをお勧めします。 !ソフトウェアをインストールするときは、apt-get install xxx に「-y」パラメータを追加することをお勧めします。これは、ソフトウェアのインストールまたは削除時に、インストールを続行するかアンインストールするかを尋ねられる場合があるためです。これも自動的な操作です。このパラメーターを追加した後は、人間とコンピューターの対話は必要ありません。
3. ループする場合は、すべての IP をループします。コンピュータの IP はルーターによって自動的に割り当てられるため、欠落しているホストがないことを確認するためにすべてを実行するのが最善です。コマンドをリモートで実行するときに対話が発生します。このように、stdin.write("Y") を使用して対話を完了します。「Y」は「Y」を入力することを意味します。
5. すべてのコマンドをリストに入れ、リストをたどってリスト内のコマンドを順番に実行します。
6. より適切に制御するには、事前にコンピューターで root ユーザーを開いてインストールすることをお勧めします。 ssh サーバーに接続し、自動的に起動します。

著者: cnblogs ma6174
関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!