Pythonでsshを使用する

すべての良い一日。



pythonでsshを操作するためのモジュールであるparamikoについてお話します。

これを使用して、リモートサーバー(または多数)にアクセスしてその上で何かを行うスクリプトを作成できます。



誰が気にする-私は猫をお願いします。



仕事でかなり頻繁に、クライアントサーバーで非常によく似たアクションを実行する必要がありました。 「構成ファイルの行番号12を修正」または「ファイルを置き換え」version_017「with」version_018のように、アクションは簡単です。 サーバーが11個を蓄積するまで簡単でした。 また、そのようなタスクは非常に迅速に面倒だったため、「sshスキルを習得するため」という言葉を新規参入者に託そうとしました。



最初に、最も単純なタスクは標準のsshツールを使用して解決できます-ファイルのコピーとリモートコードの実行。 また、空のユーティリティを使用してみました。



Pythonを習い始めたばかりの頃、私はPythonがこれらの目的のために何を持っているかを見ることにしました。 Googleはparamikoについて親切に促しました。



Paramiko(エスペラント語 "paranoid"と "friend"-"paranoja" + "amiko"の組み合わせ)は、リモートコンピューターへの安全な(暗号化と認証)接続のためのssh2プロトコルを実装するpythonバージョン2.3以降のモジュールです。 sshを操作するための高レベルAPIが接続用に提供されます-SSHClientオブジェクトが作成されます。より制御するために、ソケット(または同様のオブジェクト)をTransportクラスに渡し、リモートホストをサーバーまたはクライアントとして使用できます。認証には、パスワードまたは秘密キーを使用して確認できます サーバーキーで。



このモジュールの使用の小さな例。 コメントは以下になります。



import paramiko host = '192.168.0.8' user = 'login' secret = 'password' port = 22 client = paramiko.SSHClient() client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) client.connect(hostname=host, username=user, password=secret, port=port) stdin, stdout, stderr = client.exec_command('ls -l') data = stdout.read() + stderr.read() client.close()
      
      







任意の便利な方法でデータを取得してリモートサーバーにアクセスできます。コードに直接登録し、構成、データベースなどに配置します。 明らかに、複数のホストがある場合は、それらをループする必要があります。



接続およびリモート作業のメインクラスはSSHClientです。 彼は私たちに「セッション」を提供してくれます。



client.set_missing_host_key_policy(paramiko.AutoAddPolicy())の行で、既知のホストのリスト(.ssh / known_hostsファイル)にサーバーキーを追加します。 サーバーに接続するときにキーが見つからない場合、デフォルトでキーは「ビート」になり、SSHExceptionが発生します。



サーバーに接続するには、client.connect()を使用します。 ログインパスワードとキーの組み合わせを使用してログインできます。 接続時に、ホスト、ユーザー名、パスワード、ポート、キー、およびその他のパラメーターを指定できます。



文字列client.exec_command( 'ls -l')-リモートサーバーでコマンドを実行します。 プログラムI / Oストリームは、ファイル形式のオブジェクト(stdin、stdout、stderr)に返されます。



おそらく私はそれを正しく理解していませんでしたが、専用サーバーでルート権限を取得できませんでした。 彼らがこれを行う方法を教えてくれたら感謝します。 スーパーユーザー特権でアクションを実行するには、次のようにしました。



 stdin, stdout, stderr = ssh.exec_command('sudo -S rm *') stdin.write('password' + '\n') stdin.flush()
      
      







UPD:これらの目的でChannelクラスを使用すること提案したコメントのmeph1st0



 import paramiko client = paramiko.SSHClient() client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) client.connect(...) channel = lient.get_transport().open_session() channel.get_pty() channel.settimeout(5) channel.exec_command('sudo ls') channel.send(password+'\n') print channel.recv(1024) channel.close() client.close()
      
      







Transportクラスを使用して、sftp経由でファイルを転送できます。 直接ファイル転送の場合、putおよびgetコマンドが使用されます。



 host = "example.com" port = 22 transport = paramiko.Transport((host, port)) transport.connect(username='login', password='password') sftp = paramiko.SFTPClient.from_transport(transport) remotepath = '/path/to/remote/file.py' localpath = '/path/to/local/file.py' sftp.get(remotepath, localpath) sftp.put(localpath, remotepath) sftp.close() transport.close()
      
      







要するに、すべて。 プロジェクトのウェブサイトとドキュメント-http://www.lag.net/paramiko/



UPD。 コメントは、このような問題解決するためにsshで作業するため使用できる他の多くのツールライブラリがあることを示唆しています。 上記から:rubyのfabric、chef、puppet、libbsh2(pylibbsh2)、exscript、net-ssh-telnet。 すべての解説者に感謝します。



All Articles