被害妄想症の友人: Pythonでssh

paramikoというpythonsshライブラリで遠隔マシンの操作が自動化できる。

hello paramiko


import paramiko
transport=paramiko.Transport( ( 'takao3' , 22 ) )
transport.connect(username='tengu', password='xxxx')
c=transport.open_session()
c.exec_command('ls hoge > /dev/null')
if c.recv_exit_status()==0:
print c.makefile('rb', -1).readlines()
else:
print c.makefile_stderr('rb', -1).readlines()

接続


transport=paramiko.Transport( ( 'takao3', 22 ) )
transport.connect(username='tengu', password='xxxx')
pkeyを使うようにすべきだが、passwordを使わなきゃいけないときもある。ところで、TCPソケット以外のTransportって何がるんだろう…

セッション・チャンネル

遠隔コマンドとはChannelと呼ばれるデータストリームでデータをやり取りする。チャンネルを開いてデータを書き込んだり、返答を読み出したり、プロセスの終了を待ったりexit statusを得たりできる。subprocessのPopenみたいな感覚だ。
http://www.lag.net/paramiko/docs/ (help(paramiko.Channel)) を参照。


# チャンネル(セッション)はコマンド毎に開く
c=transport.open_session()
c.exec_command('ls hoge > /dev/null')

# コマンドが終了するまでブロックする。wait(2)に相当する。
if c.recv_exit_status()==0:
# 出力が少いのでバッファさせた出力を読む。
# 出力が多いと読んだ後にrecv_exit_status()しないといけないだろう。
print c.makefile('rb', -1).readlines()
else:
print c.makefile_stderr('rb', -1).readlines()

サイトのドキュメンテーション(http://www.lag.net/paramiko/docs/)もしっかりしていて、よく管理されたライブラリという印象が得られる。ちなみにparamikoという名は「被害妄想症の友人」という意味のエスペラント語の造語だそうだ。