YAMAGUCHI::weblog

土足で窓から失礼いたします。今日からあなたの息子になります。 当年とって92歳、下町の発明王、エジソンです。

sshモジュールで別端末を操作

はじめに

こんにちは、Python界の情弱です。最近はみなさんPythonでWebサービスをゴリゴリと作っちゃっててとてもかっこいいなーと思いつつ、コソコソとツールを作る毎日を過ごしています。同じような構成のマシンがたくさんあったときに、いちいちSSHログインして作業するの面倒だなーとか思ってて、かといって、自分でsocket通信のプログラム書くのはきついのでライブラリ使うことにしました。
Paramikoに関する記事ばかり出てくるんですが、id:mopemope はじめsshモジュールがいいよ、っていう情報をもらってしばらく遊んでみたらこれが便利だったので、忘れないうちにまとめときます。

参照

sshモジュールのインストール

pyCryptoが前提条件として必要。まあpipで入れれば一緒に拾ってきてくれるので楽。

% pip install ssh

ログインしてみる

ただのパスワードログインの場合
import ssh

hostname = 'example.com'
username = 'spam'
password = 'egg'
port = 10022

client = ssh.SSHClient()
client.load_system_host_keys()
client.connect(hostname, username=username, password=password, port=port)
stdin, stdout, stderr = client.exec_command('ls -l')
for l in stdout.read().split('\n'):
  print l
公開鍵認証の場合
import ssh

hostname = 'example.com'
username = 'spam'
password = 'egg'
port = 10022
private_key_file = '/home/ham/.ssh/id_rsa'

# pattern 1
client = ssh.SSHClient()
client.load_system_host_keys()
client.connect(hostname, username=username, password=password, port=port, key_file=private_key_file)

または秘密鍵を別途復号化しておいてもよい。

# pattern 2
key_rsa = ssh.RSAKey.from_private_key_file(private_key_file, password) # RSAの場合
key_dsa = ssh.DSSKey.from_private_key_file(private_key_file, password) # DSAの場合
client = ssh.SSHClient()
client.load_system_host_keys()
client.connect(hostname, username=username, port=port, pkey=key_xxx) # key_xxxは上の2つのキーのどっちでも大丈夫

とりあえずこれでログイン先にあるスクリプトを起動するくらいは出来るようになったね。よかった。